当前位置: 首页 > Linux

K8S实战(4)-ControllerDeployment

时间:2023-04-06 21:33:58 Linux

前言上一节提到直接创建的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-CAUSE123查看详细修改记录[root@master01~]#kubectlrollouthistorydeployment.v1.apps/nginx-deployment--revision=1deployment.apps/nginx-deploymentwithrevision#1PodTemplate:Labels:app=nginxpod-template-hash=5b6f47948Containers:nginx:Image:nginx:1.7.8Port:80/TCPHostPort:0/TCPEnvironment:<无>装载:<无>卷:<无>[root@master01~]#kubectlrollouthistorydeployment.v1.apps/nginx-deployment--revision=2deployment.apps/nginx-deploymentwithrevision#2Pod模板:标签:app=nginxpod-template-hash=678645bf77容器:nginx:图片:nginx:1.9.1端口:80/TCP主机端口:0/TCP环境:装载:卷:[root@master01~]#kubectlrollouthistorydeployment.v1.apps/nginx-deployment--revision=3deployment.apps/nginx-deploymentwithrevision#3PodTemplate:Labels:app=nginxpod-template-hash=64d99cdfb6Containers:nginx:Image:nginx:1.9.8Port:80/TCP主机端口:0/TCPEnvironment:Mounts:Volumes:回滚到指定版本--to-revision=xxx[root@master01~]#kubectlrolloutundodeployment.v1.apps/nginx-deployment--to-revision=1回滚到上次修改kubectlrolloutundodeployment.v1.apps/nginx-deployment将每条执行过的命令记录到历史中[root@master01~]#kubectlapply-fnginx.yaml--recordconclusion的Deploymentcontroller可以管理Pod,它通过操作一个叫ReplicaSet的controller来间接管理Pod部署控制器有一个缺点。它只能像Nginx一样管理无状态的Pod,而不能像Mysql那样管理有状态的应用。有状态的应用程序需要由StatefulSet控制器来管理。联系我微信公众号:zuolinux_com