前言上一节提到直接创建的Pod没有自愈功能。使用控制器创建的Pod可以从故障中自我修复,那么什么是控制器?可以理解为容器是裸盒子,Pod将盒子打包,方便K8S挂载。然后K8S一次挂载几个Pod,怎么挂载都是由controller来指定和管理的。controller有很多种,本节实现了Deploymentcontroller。更新历史20200601-初稿-左成礼原文地址-https://blog.zuolinux.com/2020/06/01/about-controller-deployment.htmlDeploymentController我们通过DeploymentController发布Pod#catnginx.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-deploymentspec:selector:matchLabels:app:nginxreplicas:2template:metadata:labels:app:nginxspec:containers:-name:nginximage:nginx:1.7.9ports:-容器端口:80本例中:创建一个名为nginx-deployment的控制器,metadata.name指定创建2个复制的Pod,spec.replicas指定spec.selector指定Deployment如何选择托管的Podspec.template.metadata.labables指定Pod的标签spec.template.spec.containers指定容器的相关信息。发布部署[root@master01~]#kubectlapply-fnginx.yaml查看部署[root@master01~]#kubectlgetdeploymentNAMEREADYUP-TO-DATEAVAILABLEAGEnginex-deployment2/22236m查看副本状态[root@master01~]#kubectlgetrsNAMEDESIREDCURRENTREADYAGEnginex-deployment-5bf87f5f5922239mDESIRED期望状态CURRENT实际状态查看Pod信息[root@master01~]#kubectlgetpods--show-labelsNAMEREADYSTATUSRESTARTSAGELABELSnginx-deployment-5bf87f5f59-4phlcapp=nginx,pod-template-hash=5bf87f5f59nginx-deployment-5bf87f5f59-jrzxj1/1Running040mapp=nginx,pod-template-hash=5bf87f5f59参数pod-template-hash=5bf87f5f59的含义:通过Pod的ReplicaTemplateHash来保证Deployment的子ReplicaSets不重叠ConflictsController的工作原理Controller总是处于无限循环中,获取被管理对象的期望状态和实际状态。在上面的nginx.yaml示例中:replicas:2是Pod的期望状态。Deploymentcontroller不断从ETCD获取当前Pod的实际状态。如果实际状态小于2,则创建一个新的Pod。如果实际状态大于2,则在github的kubernetes/kubernetes/tree/master/pkg/controller目录下删除多余的Pod,里面有K8S的各种controller,Deployment就是其中之一。更新和更改nginx.yaml的spec.template中的内容。比如更新image:nginx:1.7.9为image:nginx:1.9.1然后kubectlapply-fnginx.yamlrollback查看历史版本[root@master01~]#kubectlrollouthistorydeployment.v1.apps/nginx-deploymentdeployment.apps/nginx-deploymentREVISIONCHANGE-CAUSE1
