Deployment 工作负载
Deployment 是最常用的工作负载控制器,用来管理无状态应用:它保证副本数量、支持滚动更新与一键回滚。日常发布代码、扩缩容,几乎都在操作 Deployment。
Deployment 是什么
Deployment 描述"期望状态":跑哪个镜像、要几个副本、怎么升级。它不直接管理 Pod,而是通过 ReplicaSet 间接管理——每次镜像或模板变化都会生成新的 RS 来承载新版本,从而获得可控的滚动更新。
YAML 骨架(含滚动更新策略)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3 # 期望副本数
selector: # 认领 Pod,创建后不可修改
matchLabels:
app: nginx
template: # Pod 模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
strategy: # 更新策略
type: RollingUpdate # 默认滚动更新
rollingUpdate:
maxSurge: 1 # 最多多出 1 个临时副本
maxUnavailable: 0 # 更新期间不允许有副本不可用
常用操作命令
kubectl create deployment nginx --image=nginx:1.27 --replicas=3 # 命令式创建
kubectl apply -f nginx-deploy.yaml # 推荐:声明式
kubectl get deployment nginx
kubectl scale deployment nginx --replicas=5 # 扩缩容
kubectl set image deployment nginx nginx=nginx:1.28 # 更新镜像
kubectl rollout status deployment nginx # 跟踪发布进度
kubectl rollout history deployment nginx # 查看发布历史
kubectl rollout undo deployment nginx # 回滚到上一版本
kubectl rollout undo deployment nginx --to-revision=1 # 回滚到指定版本
滚动更新与回滚演示
从 1.27 升到 1.28,观察新旧 RS 的交替:
kubectl set image deployment nginx nginx=nginx:1.28
kubectl rollout status deployment nginx
# deployment "nginx" successfully rolled out
kubectl get rs
# NAME DESIRED CURRENT READY AGE
# nginx-7d9c5d6b9f 3 3 3 1m # 新 RS
# nginx-5b8c6f4d2e 0 0 0 10m # 旧 RS 已缩到 0
kubectl rollout undo deployment nginx # 新版本有问题,一键回退
滚动更新按 maxSurge / maxUnavailable 控制节奏:先起新副本并通过健康检查,再逐个摘掉旧副本,整个过程服务不中断。若新版本探针失败,滚动会自动停止,此时用 rollout undo 回到旧版本最稳妥。
暂停与恢复
发布期间可以先 pause 暂停调谐,方便"改一点看一点",最后 resume 让更新继续:
kubectl rollout pause deployment nginx
kubectl set image deployment nginx nginx=nginx:1.29 # 暂停期间多次改动只算一次发布
kubectl rollout resume deployment nginx
金丝雀发布简述
金丝雀(Canary)指先让新版本只承接一小部分流量、验证没问题再全量。Kubernetes 原生可这样手动模拟:先用 kubectl scale 把新 RS 顶起来一个小规模副本组,观察无误后再通过 rollout 放大或切换。生产上更精细的按权重灰度通常配合 Service、Ingress 或专门工具(如 Argo Rollouts)实现,思路都是"先小后大、随时可退"。
小结:Deployment 是"无状态应用的发布单元"——replicas 定规模、strategy 定节奏、rollout 管发布与回滚。日常牢记三件套:set image 发布、rollout status 观察、rollout undo 兜底回滚。