一、Deployment 控制器基本概念 Deployment 控制器是 Kubernetes 中用于管理应用程序部署和更新的高级控制器。 它提供了一种声明式的方法来定义和管理应用程序的生命周期, 包括创建、更新和回滚等操作。 Deployment 控制器(通过管理 ReplicaSet 来确保应用程序的期望状态与实际状态保持一致),从而实现高可用性和弹性伸缩。 #----------------------------------------------------------------------------------------------- 二、声明式与命令式 # kubectl replace -f deployment.yaml 命令式创建deployment控制器, 不支持部分更新,会覆盖之前的配置 # kubectl apply -f deployment.yaml 声明式创建deployment控制器, 支持部分更新,会合并之前的配置, 只更新与新配置中不同的部分 apply 可以结合 -f or -k 参数从文件或者目录中读多个配置文件,并根据当前集群资源状态进行更新 # kubectl diff -f deployment.yaml 比较当前集群实际运行的资源清单对象与当前资源清单文件对象的差异 #----------------------------------------------------------------------------------------------- 三、Deployment 控制器资源清单 # 资源清单例子 apiVersion: apps/v1 # 接口组/版本 kind: Deployment # 资源类型:Deployment 控制器 metadata: labels: app: myapp-deployment name: myapp-deployment spec: selector: metadata: app: myapp-deployment template: metadata: labels: app: myapp-deployment spec: containers: - name: myapp-container image: nginx:1.7.9 ports: - containerPort: 80 # 上边的Deployment控制器清单没在spec中设置replicas,默认为 1 #----------------------------------------------------------------------------------------------- 三、Deployment常用命令 # kubectl create -f deployment.yaml 创建Deployment控制器 # kubectl create -f deployment.yaml --record 创建Deployment控制器, 并记录变更历史 # kubectl apply -f deployment.yaml 创建或更新Deployment控制器 # kubectl scale deployment myapp-deployment --replicas=3 扩缩容Deployment控制器 # kubectl autoscale deployment myapp-deployment --min=10 --max=15 --cpu-percent=80 基于CPU使用率自动扩缩容Deployment控制器 # kubectl rollout status deployment myapp-deployment 查看Deployment控制器的滚动更新状态 # kubectl rollout undo deployment myapp-deployment 回滚Deployment控制器到上一个版本 # kubectl set image deployment/myapp-deployment myapp-container=nginx/nginx:1.9.1 更新Deployment控制器的镜像 #----------------------------------------------------------------------------------------------- 四、金丝雀部署思想 利用Deployment控制器的滚动更新特性, 可以实现金丝雀部署。 先设置Deployment控制器允许多n个pod, 允许少0个pod, 然后逐步更新pod的镜像版本, 观察新版本的稳定性, 如果新版本稳定, 则继续更新剩余的pod, 如果新版本不稳定, 则回滚到旧版本。 Deployment 控制器回滚的原理是etcd内存了这个Deploymen控制器控制的对应的RS的历史版本 1、通过补丁方式 设置Deployment控制器的滚动更新策略, 允许多1个pod, 允许少0个pod # kubectl patch deployment myapp-deployment -p '{"spec":{"straegy":{"rollingUpdate":{"maxSurge":"1", "maxUnavailable":"0"}}}}' 2、更新Deployment控制器的镜像版本 (由于 1 的设置, 会多创建一个新pod, 然后停止删除旧pod) # kubectl patch deployment myapp-deployment --patch '{"spec":{"template":{"spec":{"containers":[{"name":"myapp-container","image":"nginx:1.9.1"}]}}}}' && kubectl rollout rollout pause deploy myapp-deployment 3、恢复滚动更新 (恢复新建一个新pod, 删除一个旧pod, 创建一个新pod) # kubectl rollout resume deploy myapp-deployment 暂停滚动更新 # kubectl rollout pause deploy myapp-deployment 4、回滚到上一个版本【注】回滚只能回滚到上一个版本, 不能回滚到更早的版本 # kubectl rollout undo deploy myapp-deployment && kubectl rollout status deployments myapp-deployment 5、查看回滚的历史记录 # kubectl rollout history deployment myapp-deployment [注意] 更新命令在尾部加上 --record 参数, 可以记录变更历史, 方便后续查看和回滚 6、回滚到制定版本(这里的版本号数字是命令5查询出来的历史记录中的版本号) # kubectl rollout undo deploy myapp-deployment --to-revision=2 && kubectl rollout status deployments myapp-deployment