Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统。Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并使应用程序运营商和开发人员完全将重点放在以容器为中心进行自助运营。Kubernetes 也提供稳定、兼容的基础(平台),用于构建定制化的workflows 和更高级的自动化任务。 Kubernetes 具备完善的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建负载均衡器、故障发现和自我修复能力、服务滚动升级和在线扩容、可扩展的资源自动调度机制、多粒度的资源配额管理能力。 Kubernetes 还提供完善的管理工具,涵盖开发、部署测试、运维监控等各个环节。kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。
每个Pod都有一个特殊的被称为“根容器”
的Pause
容器。Pause容器对应的镜像属于Kubernetes平台的一部分,Pause作为Pod根容器,它的状态代表整个容器组的状态。除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器,Pod里的多个业务容器共享Pause容器的IP,共享Pause容器挂载的Volume。
Kubernetes为每个Pod分配唯一的IP的地址,称之为Pod IP
,一个Pod里的多个容器共享
Pod IP。Kubernetes要求底层网络支持集群内任意两个Pod之间的TCP/IP的直接通讯,采用虚拟二层网络技术来实现,一个Pod里的容器与另外主机上的Pod容器能够直接通信。
Pod一旦被创建,就会被放入到etcd
中存储,随后会被Kubernetes Master调度到某个具体的Node上并进行绑定(Binding)
,随后该Pod 被对应的Node上的kubelet进程实例化成一组相关的docker容器运行起来。当Pod里的某个容器停止时,Kubernetes会自动检测到这个问题并且重新启动这个Pod (也就是重启Pod里的所有容器),如果Pod所在的Node节点宕机,则会将这个Node上所偶的Pod从新调度到其他Node节点上。
Pod的IP加上这里的容器端口(container Port)
,就组成了一个全新的概念---Endpoint 它代表着此Pod里的一个服务进程的对外通讯地址。一个Pod也存在着多个Endpoint的情况,比如我们把Tomcat定义为一个Pod时,可以对外暴露端口与服务端口这两个Endpoint。
Event是一个事件的记录,记录事件的最早生成时间、最后重现时间、重复次数、发起者、类型,以及导致此事件的原因等众多信息。Event通常会关联到某个具体的资源上,是排查故障的重要参考,Node描述信息包含了Event,而Pod同样有Event记录。当我们发现某个Pod迟迟无法创建时,我们就可以用kubectl describe pod [Pod名称]
来查看,定位问题。
###创建一个名为nginx-deployment的Pod### apiVersion: apps/v1beta2 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx ##容器名称 image: daocloud.io/library/nginx:1.13.0-alpine #镜像地址 imagePullPolicy: IfNotPresent ports: - containerPort: 80
###nginx和tomcat容器组合成一个整体对外提供服务时,应将这两个容器打包为一个Pod### apiVersion: apps/v1beta2 kind: Deployment metadata: name: demon-pod spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name: demon-nginx-docker image: daocloud.io/library/nginx:1.13.0-alpine imagePullPolicy: IfNotPresent ports: - containerPort: 80 - name: demon-tomcat-docker image: daocloud.io/library/tomcat:8.5.21-jre8-alpine imagePullPolicy: IfNotPresent ports: - containerPort: 8080
查看Pod运行状态
kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE demon-pod-77857c4f5f-nrgnh 2/2 Running 0 40s 10.2.1.5 192.168.29.176
我们可以看到READY信息为2/2,表示Pod中的两个容器都成功运行了 (状态Running)
查看创建的Pod详细信息:
kubectl describe pod demon-pod-77857c4f5f-nrgnh Name: demon-pod-77857c4f5f-nrgnh Namespace: default Node: 192.168.29.176/192.168.29.176 Start Time: Thu, 07 Nov 2019 22:43:10 +0800 Labels: app=test pod-template-hash=3341370919 Annotations: <none> Status: Running IP: 10.2.1.5 Controlled By: ReplicaSet/demon-pod-77857c4f5f Containers: .....
应用部署的一个最佳实践是将应用所需的配置文件信息与程序进行分离,这样可以使得应用程序被更好地复用,通过不同的配置也能实现灵活的功能。将应用打包为容器镜像后,可以通过环境变量或者外挂文件的方式在创建容器时进行配置注入,但在大规模容器集群中,对多个容器进行不同的配置将变得非常复杂。从kubernetes1.2开始提供了一套应用配置管理方案----ConfigMap(资源对象)。
使用yaml文件创建ConfigMap
###cat configmap-test.yaml### apiVersion: v1 kind: ConfigMap metadata: name: test-configmap data: key1: demon keydir: /var/data # name: configmap名称 # data.key1: key1 对应的值 # data.keydir: keydir对应的挂载目录
创建后查看
kubectl get configmaps NAME DATA AGE test-configmap 2 5s # 这里我们可以看到创建了2个data的数据,就是我们上面定义的
查看创建configmaps详细信息:
kubectl describe configmaps test-configmap Name: test-configmap Namespace: default Labels: <none> Annotations: <none> Data ==== key1: ---- demon keydir: ---- /var/data Events: <none>
使用--from-file参数创建ConfigMap
###当前目录下含有配置文件server.xml,可以创建一个包含该文件内容的ConfigMap### kubectl create configmap test-server.xml --from-file=server.xml
使用--from-literal创建ConfigMap
kubectl create configmap test-configmap --from-literal=loglevel=info --from-literal=appdatadir=/var/data
###创建ConfigMap### cat configmap-test.yaml apiVersion: v1 kind: ConfigMap metadata: name: demon-configmap data: keyinfo: www.demon.com abcdockerDir: /var/data kubectl create -f configmap-test-1.yaml
###创建pod进行引用### cat configmap-pod.yaml apiVersion: v1 kind: Pod metadata: name: demon-pod spec: containers: - name: configmap-pod image: busybox command: [ "/bin/sh", "-c", "env | grep config" ] env: - name: configmapPod valueFrom: configMapKeyRef: name: demon-configmap key: keyinfo - name: configmapDir valueFrom: configMapKeyRef: name: demon-configmap key: demonDir restartPolicy: Never ==================相关参数解释=================== env: - name: configmapPod ##定义环境变量名称 valueFrom: #key "keyinfo对应的值" configMapKeyRef:
name: demon-configmap ##环境变量的值取自哪(上面创建的configmap名称) key: keyinfo #configmap里对应的key - name: configmapDir valueFrom: configMapKeyRef: name: demon-configmap key: demonDir ================================================== kubectl create -f configmap-pod.yaml
查看所有Pod
kubectl get pod --show-all
从kubernetes1.6开始,引用了一个新的字段envFrom
实现Pod环境内将ConfigMap中所有定义的key=value自动生成为环境变量
cat configmap-pod.yaml apiVersion: v1 kind: Pod metadata: name: demon-pod spec: containers: - name: configmap-pod image: busybox command: [ "/bin/sh", "-c", "env" ] envFrom: - configMapRef: name: demon-configmap ##根据configmap中自动生成key=value环境变量 restartPolicy: Never
通过这个定义,在容器内部将会自动生成如下环境配置
创建ConfigMap
###创建ConfigMap###
###创建ConfigMap### cat configmap-tomcat-server.yaml apiVersion: v1 kind: ConfigMap metadata: name: tomcat-server-config data: server.xml: | <?xml version=‘1.0‘ encoding=‘utf-8‘?> <Server port="8005" shutdown="SHUTDOWN"> <Listener className="org.apache.catalina.startup.VersionLoggerListener" /> <!--APR library loader. Documentation at /docs/apr.html --> <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html --> <Listener className="org.apache.catalina.core.JasperListener" /> <!-- Prevent memory leaks due to use of particular java/javax APIs--> <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" /> <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" /> <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" /> <GlobalNamingResources> <Resource name="UserDatabase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" /> </GlobalNamingResources> <Service name="Catalina"> <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="50" prestartminSpareThreads="true" /> <Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" enableLookups="false" maxPostSize="10485760" URIEncoding="UTF-8" disableUploadTimeout="true" maxConnections="10000" SSLEnabled="false"/> <Engine name="Catalina" defaultHost="localhost"> <Realm className="org.apache.catalina.realm.LockOutRealm"> <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> </Realm> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" /> </Host> <Context path="" docBase="/tomcat/webapps" debug="0" reloadable="true" crossContext="true"/> </Engine> </Service> </Server> 查看 [root@master configmap]# kubectl get configmaps tomcat-server-config NAME DATA AGE tomcat-server-config 1 13s 查看详细信息 [root@master configmap]# kubectl describe configmaps tomcat-server-config Name: tomcat-server-config Namespace: default Labels: <none> Annotations: <none> Data ==== server.xml: ---- <?xml version=‘1.0‘ encoding=‘utf-8‘?> <Server port="8005" shutdown="SHUTDOWN"> <Listener .....
###引用ConfigMap###
cat test.yaml apiVersion: apps/v1beta2 kind: Deployment metadata: name: abcdocker-pod spec: replicas: 1 selector: matchLabels: app: tomcat template: metadata: labels: app: tomcat spec: containers: - image: busybox imagePullPolicy: IfNotPresent name: tomcatpod volumeMounts: - mountPath: /tmp/server.xml name: serverxml subPath: server.xml ports: - containerPort: 8080 command: ["tail", "-f", "/dev/null"] volumes: - name: serverxml configMap: name: tomcat-server-config items: - key: server.xml path: server.xml kubectl create -f test.yaml ===================参数解释=============== volumeMounts: - mountPath: /tmp/server.xml ##挂在到容器内的目录 name: serverxml #挂载名称(需要和volume的名称对应上) subPath: server.xml #不加subPath会替换整个目录 ports: - containerPort: 8080 command: ["tail", "-f", "/dev/null"] volumes: - name: serverxml #volumemount名称 configMap: name: tomcat-server-config #创建的configmap名称 items: - key: server.xml #对应的key path: server.xml #挂载到目录的key名称 #################################### 需要注意的是,不可以光mount挂载,需要执行命令让容器在前台运行!
验证:登陆容器可以在tmp目录下看到我们的server.xml
volumeMount
操作时,容器内部职能挂载"目录",无法挂载为文件。在挂载到容器内部后,目录中将包含ConfigMap定义的每个item,如果该目录下原来还有其他文件,则容器内的该目录将会被挂载的ConfigMap覆盖。如果应用程序需要保留原来的其他文件,则需要进行额外的处理。可以将ConfigMap挂载到容器内部的临时目录,再通过启动脚本将配置文件复制或者链接到(cp link)应用所用的实际配置目录下
原文:https://www.cnblogs.com/yanxinjiang/p/11816948.html