讲解
生产应用的基本要求是多副本:一个实例挂了还有别的,流量大了能加实例。Deployment 就是干这个的控制器:你声明「这个镜像跑 3 个副本」,它保证任何时刻都有 3 个健康 Pod 在运行——Pod 崩溃、节点宕机都会自动补齐。这是「控制器循环」心智的第一个实战:Deployment 控制器不停地对比「期望 3 个」和「实际几个」,偏差就修正。
Deployment 并不直接管 Pod,中间还有一层 ReplicaSet:Deployment 管 ReplicaSet,ReplicaSet 管 Pod。为什么要多一层?为了版本管理——每次更新 Pod 模板(换镜像、改配置),Deployment 会创建一个新的 ReplicaSet,旧的保留但缩到 0。这个结构是滚动更新和回滚(下一章)的基础。日常排查看三层各自的状态:kubectl get deploy 看副本总数与可用数,kubectl get rs 看版本历史,kubectl get pods 看具体实例。
清单结构上,Deployment 和 Pod 几乎一样,多两个关键字段:spec.replicas 是副本数;spec.selector.matchLabels 是「我管哪些 Pod」的选择器,必须和 spec.template.metadata.labels 一致——模板里 Pod 的标签要是匹配不上 selector,创建时会直接报错。模板(template)部分就是一个完整 Pod 定义的嵌入。伸缩有两条路:手动 kubectl scale 改副本数,或者后面的 HPA 按指标自动伸缩(第 21 章)。
示例
3 副本的 nginx Deployment(apply 后等待滚动完成):
# wait: deploy/ohmydocs-verify-web
apiVersion: apps/v1
kind: Deployment
metadata:
name: ohmydocs-verify-web
spec:
replicas: 3
selector:
matchLabels:
app: ohmydocs-verify-web
template:
metadata:
labels:
app: ohmydocs-verify-web
spec:
containers:
- name: nginx
image: nginx:1.27-alpine
ports:
- containerPort: 80
三层视角各看一眼:Deployment 的可用副本、ReplicaSet、Pod 实例(注意 Pod 名字的构成:Deployment 名 + ReplicaSet 哈希 + 随机后缀):
kubectl get deploy ohmydocs-verify-web
kubectl get rs -l app=ohmydocs-verify-web
kubectl get pods -l app=ohmydocs-verify-web -o wide
手动扩容到 5 个副本,等可用数跟上,再缩回 3——控制器自动补齐/回收 Pod:
kubectl scale deploy ohmydocs-verify-web --replicas=5
kubectl wait --for=condition=available deploy/ohmydocs-verify-web --timeout=120s
kubectl get pods -l app=ohmydocs-verify-web --no-headers | wc -l
kubectl scale deploy ohmydocs-verify-web --replicas=3
kubectl wait --for=condition=available deploy/ohmydocs-verify-web --timeout=120s
验证自愈:删掉一个 Pod,Deployment 立刻补一个新的(名字变了,数量不变):
victim=$(kubectl get pods -l app=ohmydocs-verify-web -o jsonpath='{.items[0].metadata.name}')
echo "删除 Pod: $victim"
kubectl delete pod "$victim" --wait
kubectl get pods -l app=ohmydocs-verify-web --no-headers | wc -l
常见坑
- selector 和模板标签不匹配:创建时直接报错 selector does not match template labels;而且 selector 创建后不可修改,改它只能删了重建。
- 直接删 ReplicaSet:删了 Deployment 会立刻重建——层级关系是 deploy → rs → pod,要动就动最上层。
- 改了模板外的字段以为会滚动更新:只有 template 的变化才触发滚动更新;改 replicas 只是伸缩。
- 副本数交给多处管:YAML 里写死 replicas 又配了 HPA,两边打架——用了 HPA 就把清单里的 replicas 删掉或接受它被覆盖。
小结
Deployment = 声明副本数 + Pod 模板,控制器保证「想要几个就有几个」;deploy → rs → pod 三层结构是版本管理的地基;scale 手动伸缩,删 Pod 自动补齐。下一章用这套结构做滚动更新与回滚。