本节摘要:Deployment 是无状态应用的日常播种主力:它持有"株数与品种"的期望,经 ReplicaSet 保证株数,经滚动机制保证换品种不断流。本节完成绿荫书屋网页的正式下种,走通 apply、查苗、扩缩容、看事件的完整闭环,并拆解 Deployment、ReplicaSet、Pod 的三层关系。
事故夜之后,书屋团队学的第一课是:别再裸种。正式的播种计划长这样:
# 播种计划:田里常驻三株网页苗 apiVersion: apps/v1 kind: Deployment # 单据类型:播种计划 metadata: name: greenlib-web spec: replicas: 3 # 期望株数 strategy: type: RollingUpdate # 换品种时滚动进行(默认值,写明是为了显眼) selector: matchLabels: app: greenlib-web # 计划认苗规则:只认带这块牌的 template: # 苗的模板(每株都按这里长) metadata: labels: app: greenlib-web # 苗牌必须与 selector 对上 spec: containers: - name: web image: greenlib/web:0.9.1 ports: - containerPort: 8080
三个关键部位划一下重点:replicas 是株数期望;selector 是认苗规则,计划只对"带这块苗牌的苗"负责;template 是苗的模具,株数补齐时照此翻模。苗牌与认苗规则必须严格对上,对不上时 API Server 会当场拒收单子——这是新手清单报错的第一名。
交单与查苗:
kubectl apply -f web-deployment.yaml # deployment.apps/greenlib-web created kubectl get deployments # NAME READY UP-TO-DATE AVAILABLE AGE # greenlib-web 3/3 3 3 2m # 三株期望 三株就绪 没有落后版本 三株可用 kubectl get pods -l app=greenlib-web # NAME READY STATUS RESTARTS AGE # greenlib-web-7d9b6c5f4-8xzqm 1/1 Running 0 2m # greenlib-web-7d9b6c5f4-mn2pv 1/1 Running 0 2m # greenlib-web-7d9b6c5f4-qk8te 1/1 Running 0 2m # 观察点:Pod 名的中段 7d9b6c5f4 是 ReplicaSet 的指纹,下一小节解释
kubectl get all 时你会看到一个名叫 greenlib-web-7d9b6c5f4 的 ReplicaSet,夹在 Deployment 与 Pod 中间。这层"隔代管理"分工明确:

为什么中间要隔这一层?留给一个思想实验:假如 Deployment 直接管 Pod,换版本时它得一边停旧苗一边起新苗,账要记得极细。有了 ReplicaSet 这层,换版本就变成"新版本建一个新 ReplicaSet,旧版本 ReplicaSet 缩到零",株数始终由各自的数苗员兜底。第七章滚动更新的全部戏剧,都在这两组数苗员的一涨一消之间。
扩苗。 周年庆活动要来了,临时加到五株:
kubectl scale deployment greenlib-web --replicas=5 # deployment.apps/greenlib-web scaled kubectl get pods -l app=greenlib-web -w # 按下 w 后持续观察:新两株从 Pending 到 ContainerCreating 再到 Running # greenlib-web-7d9b6c5f4-pq9wa 0/1 Pending 0 0s # greenlib-web-7d9b6c5f4-pq9wa 1/1 Running 0 6s # (按 Ctrl 加 C 退出观察)
看苗的档案。 想知道一株苗为何迟迟不活,先看它的档案与事件:
kubectl describe pod greenlib-web-7d9b6c5f4-pq9wa # 输出节选(Events 段是重点): # Events: # Type Reason Message # Normal Scheduled Successfully assigned to node-2 # Normal Pulling Pulling image "greenlib/web:0.9.1" # Normal Created Created container web # Normal Started Started container web # 若此处出现 FailedScheduling,说明无地可选,常见原因是额度不够(第七章)
删苗看自愈。 亲手拔掉一株,验证园丁在场:
kubectl delete pod greenlib-web-7d9b6c5f4-pq9wa # pod "greenlib-web-7d9b6c5f4-pq9wa" deleted kubectl get pods -l app=greenlib-web # 注意名单里冒出一个新名字后缀的苗,AGE 只有几秒——这就是补种 # greenlib-web-7d9b6c5f4-v7c2rd 1/1 Running 0 9s
四步走完,绿荫书屋网页在田里站稳了:期望三株(现在五株)、缺苗自动补、扩苗一条命令。事故夜里最痛的那两页,翻过去了。
⚠️ 常见坑:直接 kubectl edit 或 scale 改出来的改动,下次 apply 同名清单时可能被覆盖回 YAML 里的值。口径要统一:临时调整用命令无妨,长期状态请改清单再 apply,让台账始终有据可查。
-w 参数持续 watch