📘 Day 05:Deployment 与 ReplicaSet 🎯 今日目标
🧠 理论精讲(30 分钟) 三层关系 1 2 3 4 5 Deployment ─── 管理版本、更新策略 │ └──→ ReplicaSet ─── 确保 Pod 副本数达标 │ └──→ Pod ─── 运行容器
每次 Deployment 更新会创建新 ReplicaSet ,旧的 ReplicaSet 保留(用于回滚)。
滚动更新策略
参数
含义
默认值
maxSurge
更新期间最多超出多少个 Pod
25%
maxUnavailable
更新期间最多不可用多少个 Pod
25%
1 2 3 4 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0
关键命令速查
命令
用途
kubectl rollout status deploy/<name>
查看更新进度
kubectl rollout history deploy/<name>
查看版本历史
kubectl rollout undo deploy/<name>
回滚到上一版本
kubectl rollout pause deploy/<name>
暂停更新
kubectl rollout resume deploy/<name>
恢复更新
🔧 动手实操(120 分钟) 练习 5.1:创建 Deployment + 观察 ReplicaSet 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 kubectl create deploy nginx --image=nginx:1.21 --replicas=3 kubectl get deploy nginx kubectl get rs -l app=nginx kubectl get pod -l app=nginx -o wide kubectl delete pod <任意一个 nginx pod> kubectl get pod -l app=nginx -w
练习 5.2:滚动更新全流程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 kubectl get deploy nginx -w kubectl get pod -l app=nginx -w kubectl get rs -l app=nginx -w kubectl set image deploy/nginx nginx=nginx:1.22 kubectl rollout status deploy/nginx kubectl rollout history deploy/nginx
练习 5.3:回滚操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 kubectl set image deploy/nginx nginx=nginx:not-exists kubectl rollout status deploy/nginx kubectl get pod -l app=nginx kubectl rollout undo deploy/nginx kubectl get pod -l app=nginx kubectl rollout history deploy/nginx kubectl rollout undo deploy/nginx --to-revision=1 kubectl set image deploy/nginx nginx=nginx:1.23 --record=false kubectl annotate deploy/nginx kubernetes.io/change-cause="update to 1.23" kubectl rollout history deploy/nginx
练习 5.4:扩缩容 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 kubectl scale deploy/nginx --replicas=6 kubectl get pod -l app=nginx -w kubectl scale deploy/nginx --replicas=2 kubectl get pod -l app=nginx -w kubectl get deploy nginx -o jsonpath=' 期望副本:{.spec.replicas} 就绪副本:{.status.readyReplicas} 可用副本:{.status.availableReplicas} '
练习 5.5:金丝雀发布基础(pause/resume) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 kubectl scale deploy/nginx --replicas=10 kubectl rollout pause deploy/nginx kubectl set image deploy/nginx nginx=nginx:1.24 kubectl annotate deploy/nginx kubernetes.io/change-cause="canary 1.24" kubectl get rs -l app=nginx kubectl rollout resume deploy/nginx kubectl rollout status deploy/nginx kubectl delete deploy nginx
🐛 排错练习(30 分钟) 场景 1:滚动更新卡住 — 镜像拉取失败 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 kubectl create deploy test --image=nginx:1.21 --replicas=3 kubectl set image deploy/test nginx=nginx:99.99 kubectl get deploy test kubectl get rs -l app=test kubectl get pod -l app=test kubectl describe pod <新 pod> | grep -A5 Events kubectl rollout status deploy/test kubectl describe deploy test kubectl logs <pod-name> kubectl rollout undo deploy/test kubectl delete deploy test
场景 2:回滚失败(无历史记录) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 kubectl create deploy test2 --image=nginx:1.21 --replicas=2 kubectl get deploy test2 -o jsonpath='{.spec.revisionHistoryLimit}' kubectl rollout undo deploy/test2 kubectl set image deploy/test2 nginx=nginx:1.22 kubectl rollout status deploy/test2 kubectl rollout history deploy/test2 kubectl delete deploy test2
🏆 赛题模拟(40 分钟)
⚠️ 严格限时 40 分钟
题目:Deployment 滚动发布综合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 【操作要求】 1. 用 --dry-run=client 生成 Deployment YAML: - 名称:web-app - 镜像:nginx:1.21-alpine - 副本数:5 - 资源限制:cpu 100m, memory 128Mi - 滚动更新策略:maxSurge=1, maxUnavailable=0 2. 应用该 YAML,等待所有 Pod Ready 3. 执行以下版本变更序列: a. 更新到 nginx:1.22-alpine,记录 change-cause b. 等待完成 c. 更新到 nginx:1.23-alpine,记录 change-cause d. 等待完成 4. 假设 1.23 版本有 bug,请: a. 先回滚到上一个版本 b. 再回滚到最初版本(1.21-alpine) c. 确认最终所有 Pod 使用 nginx:1.21-alpine 5. 将副本数缩放到 2,再扩容到 5 6. 输出 rollout history 完整记录 【验证命令】 kubectl rollout history deploy/web-app kubectl get deploy web-app -o jsonpath='{.spec.template.spec.containers[0].image}' kubectl get pod -l app=web-app -o jsonpath='{range .items[*]}{.metadata.name}{": "}{.spec.containers[0].image}{"\n"}{end}' 【评分标准】 - YAML 正确(20 分) - 滚动更新步骤正确(30 分) - 回滚到指定版本正确(25 分) - 扩缩容正确(15 分) - history 记录完整(10 分)
📋 命令速查
命令
功能
注解
kubectl create deploy nginx --image=nginx:alpine
创建 Deployment
最快捷的部署方式
kubectl get deploy
列出 Deployment
DESIRED/CURRENT/READY/UP-TO-DATE/AVAILABLE 五个状态字段
kubectl get deploy -o wide
Deployment + 镜像/标签/选择器
确认当前使用的镜像版本
kubectl get rs
列出 ReplicaSet
Deployment 每次更新生成新 RS
kubectl get deploy,rs,pod
同时查看 Deploy→RS→Pod 层级
逗号分隔多资源类型
kubectl describe deploy <name>
Deployment 详细信息
包含滚动更新策略、事件历史
kubectl scale deploy <name> --replicas=5
扩缩副本
等价于修改 spec.replicas
kubectl set image deploy/<name> <container>=<new-image>:<tag>
更新容器镜像
触发滚动更新,比 edit 效率高
kubectl set resources deploy/<name> -c=<container> --limits=cpu=200m,memory=256Mi --requests=cpu=100m,memory=128Mi
设置资源限制
更新 Pod 模板中的 resources 字段
kubectl rollout status deploy/<name>
查看滚动更新进度
输出 “successfully rolled out” 即完成
kubectl rollout history deploy/<name>
查看部署历史
每次更新生成一个 revision 号
kubectl rollout history deploy/<name> --revision=3
查看第 3 个版本的详情
对比不同版本的镜像和配置
kubectl rollout undo deploy/<name>
回滚上一版本
创建新 RS 并回退 Pod 模板
kubectl rollout undo deploy/<name> --to-revision=2
回滚到指定版本
revision 必须存在于历史中(默认保留 10 个)
kubectl rollout pause deploy/<name>
暂停滚动更新
金丝雀发布时暂停以验证新版
kubectl rollout resume deploy/<name>
恢复滚动更新
暂停后恢复继续滚动
kubectl rollout restart deploy/<name>
重启所有 Pod(滚动重建)
1.15+ 支持,配置变更后快速生效
kubectl patch deploy <name> -p '{"spec":{"minReadySeconds":10}}'
JSON Patch 修改字段
比 edit 安全,适合 CI/CD
kubectl delete deploy <name>
删除 Deployment
级联删除 RS 和 Pod(默认)
kubectl delete deploy <name> --cascade=orphan
仅删 Deploy 保留 Pod
Pod 变为孤儿,由新控制器接管
kubectl get pod --show-labels
Pod + 标签
验证标签选择器是否匹配
📚 参考来源