Kubernetes 系列【12】控制器:Deployment 实操教程
文章目录1. 创建 Deployment1.1 部署 YAML 示例1.2 查看 Deployment 运行状态1.3 查看底层 ReplicaSet 与 Pod2. 更新 Deployment滚动更新2.1 更新镜像实操方式 1命令行直接更新镜像方式 2编辑YAML文件修改2.2 滚动更新核心参数2.3 查看 Deployment 完整详情3. 多版本并行发布规则3.1 基础版本迭代逻辑3.2 中途叠加更新多版本并行切换3.3 场景举例3.4 优缺点4. 修改标签选择器不推荐线上尽量避免4.1 核心限制4.2 强制修改唯一方案方式 1直接删除默认级联删除业务中断方式 2级联隔离删除保留原有 Pod风险极高线上禁用4.3 最佳实践建议5. 版本回滚 Deployment5.1 故障演示错误镜像5.2 查看发布历史记录5.3 执行回滚操作6. 副本扩缩容6.1 手动调整副本数量6.2 HPA自动弹性伸缩6.3 更新过程中扩容逻辑7. 暂停/批量更新发布8. 金丝雀灰度发布Canary8.1 稳定版本 nginx-stable.yaml8.2 灰度版本 nginx-canary.yaml9. 配套常用运维命令汇总1. 创建 DeploymentDeployment用来管理无状态应用创建时会自动生成ReplicaSet由ReplicaSet维持指定数量Pod。下面以Nginx为例完整演示。1.1 部署 YAML 示例# API版本Deployment固定归属apps/v1apiVersion:apps/v1# 资源类型Deployment控制器kind:Deployment# 资源基础信息metadata:# 当前命名空间内唯一名称name:nginx-deployment# 自定义标签方便筛选资源labels:app:nginx# 核心配置定义期望运行状态spec:# 期望运行3个Nginx Pod副本replicas:3# 标签选择器用来匹配管理Podselector:matchLabels:app:nginx# Pod模板批量创建Pod的标准配置template:metadata:# Pod标签必须和selector匹配一致labels:app:nginxspec:# 容器配置列表containers:-name:nginx# 使用Nginx 1.14.2镜像image:nginx:1.14.2# 容器内部监听80端口ports:-containerPort:80集群正常运行后执行下面命令部署资源kubectl apply-fnginx-deployment.yaml配置关键点说明metadata.nameDeployment名称后续ReplicaSet、Pod都会以此作为名称前缀spec.replicas:3控制器会保证集群一直运行3个Podspec.selector匹配Pod标签建立控制器和Pod的关联spec.templatePod模板包含Pod标签、容器镜像、端口等运行配置。重要注意事项selector和Pod模板标签必须对应否则无法管理Pod不要多个Deployment/StatefulSet使用同一套匹配标签会出现Pod争抢业务异常。1.2 查看 Deployment 运行状态查看所有Deploymentkubectl get deployments刚创建未就绪示例NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 0/3 0 0 1s字段解释READY就绪Pod数量 / 期望总副本数UP-TO-DATE已经更新到最新模板的Pod数量AVAILABLE能正常对外访问的可用PodAGEDeployment运行时长实时监控发布进度kubectl rollout status deployment/nginx-deployment成功提示deployment nginx-deployment successfully rolled out全部Pod就绪后查询结果NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 18s1.3 查看底层 ReplicaSet 与 Pod查看自动生成的ReplicaSetkubectl get rs输出示例NAME DESIRED CURRENT READY AGE nginx-deployment-75675f5897 3 3 3 18s字段DESIRED期望副本、CURRENT当前运行副本、READY就绪副本。查看Pod携带的标签kubectl get pods --show-labelsPod会自动携带pod-template-hash标签由Pod模板哈希生成用来区分不同版本ReplicaSet禁止手动修改。2. 更新 Deployment滚动更新滚动更新是Kubernetes Deployment默认的发布方式不停机升级应用。核心逻辑分批启动新版本Pod等新Pod正常能提供服务后再分批删掉旧版本Pod新旧实例同时并行运行业务全程不中断。只有修改.spec.templatePod模板镜像、环境变量、资源等才会触发滚动更新单纯调整副本数不会发布新版本。2.1 更新镜像实操两种更新方式任选其一方式 1命令行直接更新镜像# 完整写法kubectlsetimage deployment.v1.apps/nginx-deploymentnginxnginx:1.16.1# 简写kubectlsetimage deployment/nginx-deploymentnginxnginx:1.16.1方式 2编辑YAML文件修改kubectl edit deployment/nginx-deployment找到镜像字段修改镜像版本后保存自动生效。监控更新进度kubectl rollout status deployment/nginx-deployment更新完成后再查看ReplicaSet会出现新旧两个副本集新版本副本数3旧版本缩容至0。2.2 滚动更新核心参数滚动更新依靠两个参数控制发布节奏默认值25%maxUnavailable最大不可用Pod发布期间最少保留75%副本正常运行maxSurge峰值扩容数量最多额外多出25%新Pod。示例副本3个每次新增1个新Pod、销毁1个旧Pod全程可用Pod不少于3总Pod最多4个。2.3 查看 Deployment 完整详情kubectl describe deployments可查看完整事件、新旧ReplicaSet扩容缩容记录、更新策略、Pod模板等全部信息。3. 多版本并行发布规则3.1 基础版本迭代逻辑只要修改Deployment内部.spec.templatePod模板镜像、环境变量、资源配额、容器配置等Deployment控制器就会生成一套全新的ReplicaSet副本集承载新版本Pod。新旧两套副本集会同时存在于集群中控制器按照滚动更新策略分批扩容新版ReplicaSet、逐步缩容旧版ReplicaSet最终旧副本集副本数收缩至0仅保留最新版本副本集维持目标replicas数量旧ReplicaSet不会删除留存用于版本回滚。3.2 中途叠加更新多版本并行切换如果上一轮滚动更新还未全部完成新旧Pod同时运行、旧副本集还未缩容至0此时再次修改Pod模板、发起第二次更新控制器不会等待上一轮发布完整走完直接生成第三套全新ReplicaSet将当前正在扩容、未完成切换的中间版本ReplicaSet标记为旧版本立刻开始对其缩容调度重心切换至最新创建的ReplicaSet按照maxSurge、maxUnavailable规则拉起最新Pod集群同一时间可能同时存在三套及以上副本集稳定旧版本、中途未完成的中间版本、最新版本多版本Pod短暂并行运行。3.3 场景举例初始配置replicas:3Nginx v1.14.2对应RS-v13个正常运行Pod。第一次更新镜像为v1.16.1生成RS-v2开始滚动替换此时集群RS-v13副本、RS-v21副本并行发布未结束立刻再次更新镜像为v1.24-alpine控制器直接创建RS-v3不再等待RS-v2扩容到3一边扩容RS-v3新Pod一边同步缩容RS-v2、RS-v1最终RS-v1、RS-v2副本数全部归零仅RS-v3维持3个新版本Pod。3.4 优缺点优点支持紧急迭代线上出现漏洞、故障时无需等待上一轮缓慢发布结束可直接推送修复版本快速覆盖响应速度快缩短故障修复时长。风险点多副本集同时缩容扩容集群瞬时Pod数量峰值更高对节点资源、负载均衡压力变大连续多次叠加更新集群留存大量历史ReplicaSet会占用etcd存储可通过revisionHistoryLimit限制历史版本数量自动回收若连续多次更新均出现镜像错误、启动失败集群会同时存在多套异常副本集发布流程卡住需手动执行回滚清理。4. 修改标签选择器不推荐线上尽量避免4.1 核心限制K8sapps/v1分组下的Deployment资源存在硬性约束资源创建完成后.spec.selector标签筛选器不允许修改。无论使用kubectl edit、kubectl patch、kubectl apply、Helm升级等任何方式都无法变更selector匹配规则API Server会直接拒绝修改请求。Deployment的selector会同步绑定到下属所有ReplicaSet控制器依靠pod-template-hash标签关联副本集与Pod。一旦筛选规则变动原有ReplicaSet、Pod会失去管控依据极易出现Pod争抢、副本数量失控、发布流程错乱等不可预期问题因此官方做了写锁限制。4.2 强制修改唯一方案若业务场景必须调整筛选标签没有在线热更新方案只能删除原有Deployment再新建分两种删除方式方式 1直接删除默认级联删除业务中断kubectl delete deployment nginx-deployment默认开启级联删除删除Deployment的同时下属所有ReplicaSet、运行中的Pod会全部销毁服务直接中断仅适合测试环境。方式 2级联隔离删除保留原有 Pod风险极高线上禁用增加--cascadeorphan参数仅删除Deployment控制器不清理底层ReplicaSet和Podkubectl delete deployment nginx-deployment--cascadeorphan带来的管理混乱问题旧ReplicaSet、Pod变成无控制器管理的孤儿资源不会自动自愈Pod故障、节点宕机后无法自动重建新建Deployment使用新 selector会生成全新ReplicaSet同步拉起一批新Pod集群同时存在新旧两套业务实例流量重复分发扩缩容、滚动更新、回滚操作只会管控新Pod旧实例完全脱离运维管控清理、升级都需要手动操作新旧Pod标签重叠时新旧控制器会互相争抢Pod副本数量持续震荡业务稳定性受损。4.3 最佳实践建议上线前完整规划好selector标签规则一次性定义到位上线后不做改动区分多业务、多版本时新增独立标签如env:prod、version:v1不要修改原有筛选键值若确实需要调整管控范围推荐新建一套独立Deployment逐步切流量、下线旧业务平稳过渡避免直接修改selector。5. 版本回滚 Deployment镜像写错、应用启动异常时可一键回滚到之前稳定版本。说明仅修改Pod模板才生成新版本单纯扩缩容不会新增版本回滚只恢复镜像/配置不改变副本数量。5.1 故障演示错误镜像# 输入不存在的镜像版本kubectlsetimage deployment/nginx-deploymentnginxnginx:1.161新Pod拉取镜像失败状态为ImagePullBackOff发布卡住。5.2 查看发布历史记录kubectl rollouthistorydeployment/nginx-deployment每条记录对应一次Pod模板变更。查看指定版本详细配置kubectl rollouthistorydeployment/nginx-deployment--revision25.3 执行回滚操作# 回退到上一个稳定版本kubectl rollout undo deployment/nginx-deployment# 指定回滚到第2个版本kubectl rollout undo deployment/nginx-deployment --to-revision2回滚后控制器创建正常版本ReplicaSet故障副本集缩容至0。6. 副本扩缩容6.1 手动调整副本数量# 扩容至10个副本kubectl scale deployment/nginx-deployment--replicas10注意本地YAML重新apply会覆盖手动scale的副本数开启HPA后不要手动修改replicas。6.2 HPA自动弹性伸缩根据CPU使用率自动增减副本最小10、最大15阈值80%kubectl autoscale deployment/nginx-deployment--min10--max15--cpu-percent806.3 更新过程中扩容逻辑发布中途扩容新增副本会按比例分配给新旧ReplicaSet不会全部加到新版本降低发布风险。7. 暂停/批量更新发布一次性修改镜像、资源限制等多项配置时可以先暂停发布改完统一恢复只触发一次滚动更新。# 暂停发布修改配置不会生效kubectl rollout pause deployment/nginx-deployment# 批量修改多项配置kubectlsetimage deployment/nginx-deploymentnginxnginx:1.16.1 kubectlsetresources deployment/nginx-deployment-cnginx--limitscpu200m,memory512Mi# 恢复发布一次性应用所有变更kubectl rollout resume deployment/nginx-deployment限制暂停状态下无法执行回滚必须先resume恢复。8. 金丝雀灰度发布CanaryDeployment原生不支持流量灰度标准方案两套独立Deployment区分稳定/灰度版本配合Service、Ingress切分流量。8.1 稳定版本 nginx-stable.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-stablelabels:app:nginxenv:stablespec:replicas:3selector:matchLabels:app:nginxenv:stabletemplate:metadata:labels:app:nginxenv:stablespec:containers:-name:nginximage:nginx:1.24-alpineports:-containerPort:808.2 灰度版本 nginx-canary.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:nginx-canarylabels:app:nginxenv:canaryspec:replicas:1selector:matchLabels:app:nginxenv:canarytemplate:metadata:labels:app:nginxenv:canaryspec:containers:-name:nginximage:nginx:1.25-alpineports:-containerPort:809. 配套常用运维命令汇总# 部署资源kubectl apply-fnginx-deploy.yaml# 实时查看发布进度kubectl rollout status deployment/nginx-deployment# 查看所有发布历史版本kubectl rollouthistorydeployment/nginx-deployment# 回滚上一版本kubectl rollout undo deployment/nginx-deployment# 手动扩缩副本kubectl scale deployment nginx-deployment--replicas5# 暂停发布kubectl rollout pause deployment/nginx-deployment# 恢复发布kubectl rollout resume deployment/nginx-deployment# 查看完整详情、事件日志kubectl describe deployment nginx-deployment
