Deployment 完整深度详解
核心概念 Deployment 是 Kubernetes 无状态应用标准控制器,底层通过 ReplicaSet 管理 Pod,提供滚动更新、版本回滚、副本自愈、弹性扩缩容四大核心能力。
1. Deployment 定位与核心作用
1.1. 资源归属
属于K8s标准一等API资源,API组:apps/v1,简写无,完整kind:Deployment。
kubectl api-resources | grep deploy
deployments deploy apps/v1 true Deployment
1.2. 核心定位
无状态应用标准控制器,用来管理无状态业务(Nginx、后端API、微服务等)。
底层依靠ReplicaSet实现副本管控,提供:
- 多副本高可用;
- 滚动更新/蓝绿发布,零停机升级;
- 版本回滚;
- 副本自动扩缩容;
- 故障自愈,节点宕机自动漂移重建Pod。
1.3. 适用&不适用场景
✅ 适合:前后端微服务、Nginx、定时任务服务、无状态中间件;
❌ 不适合:有状态应用MySQL/Redis/Kafka/ES(用StatefulSet)、一次性任务Job/CronJob、节点级组件DaemonSet。
2. Deployment 底层控制链
Deployment → ReplicaSet → Pod
- Deployment:记录发布版本、更新策略、回滚历史,不直接管理Pod;
- ReplicaSet(副本集):精准控制当前运行多少个Pod副本,持有一套Pod模板;
- Pod:真实运行业务容器。
发布新版本时:
Deployment 创建新ReplicaSet,逐步扩容新RS、缩容旧RS,实现滚动更新;
回滚时:重新扩容旧ReplicaSet,缩容当前新版本RS。
3. 完整标准YAML全字段解析
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
namespace: default
labels:
app: web-demo
spec:
# 1. 副本数量
replicas: 3
# 2. 选择器:匹配Pod标签,必须和template.labels对应
selector:
matchLabels:
app: web-demo
# 3. 更新策略(滚动更新/重建)
strategy:
type: RollingUpdate # 默认滚动更新;可选Recreate(先删所有再新建)
rollingUpdate:
maxSurge: 1 # 更新时最多额外多出几个Pod
maxUnavailable: 0 # 更新过程最少保证可用副本数,0代表不中断服务
# 4. 保留历史版本数量,用于回滚
revisionHistoryLimit: 10
# 5. Pod模板,真正定义容器、存储、探针、资源限制
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web
image: nginx:1.23
ports:
- containerPort: 80
# 三色探针,保证服务可用性
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 3
periodSeconds: 5
startupProbe:
httpGet:
path: /
port: 80
failureThreshold: 30
# CPU内存配额,防止抢占节点资源
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
# 持久化存储挂载PVC
volumeMounts:
- name: log-storage
mountPath: /var/log/nginx
volumes:
- name: log-storage
persistentVolumeClaim:
claimName: nginx-log-pvc
# 调度策略:Pod反亲和,副本分散不同节点
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["web-demo"]
topologyKey: kubernetes.io/hostname
3.1. 关键字段逐段说明
- replicas
期望运行Pod副本总数,控制器持续调谐,保证集群中存活Pod等于该数值。
Pod被杀、节点宕机,控制器自动新建补足副本。 - selector.matchLabels
控制器通过标签匹配归属自己的Pod,template里Pod标签必须和这里完全一致,否则控制器无法管理Pod。 - strategy 更新策略两种
3.1.1. (1)RollingUpdate 滚动更新(生产默认)
- maxSurge:更新期间最多可以比replicas多出多少Pod;
- maxUnavailable:更新期间最多允许不可用副本数量;
示例maxUnavailable:0:发布全程始终保持全部副本在线,零业务中断。
3.1.2. (2)Recreate 重建更新
先一次性删除所有旧Pod,全部销毁后再创建新版本Pod;
会出现业务中断,仅单机本地测试使用,生产禁用。
- revisionHistoryLimit
保留多少个旧ReplicaSet历史版本,用于回滚,默认10;调小可节省etcd存储。 - template(Pod模板)
定义Pod完整规范:镜像、端口、探针、资源限制、存储、亲和、sidecar容器、安全上下文。
Deployment无直接创建Pod的能力,依靠该模板下发给ReplicaSet生成Pod。
4. Deployment 四大核心能力详解
4.1. 副本自愈 & 高可用
控制器持续循环调谐:
- 定期查询集群内匹配标签的Pod;
- 若存活Pod < replicas → 扩容新建Pod;
- 若存活Pod > replicas → 多余Pod直接删除;
场景:节点断电、Pod OOM、容器崩溃,自动在其他节点重建,保障副本数量。
配合Pod反亲和,副本打散多台节点,单节点故障不会全部服务下线。
4.2. 滚动更新(零停机发布)
发布流程(replicas=3,maxSurge=1,maxUnavailable=0):
- 创建1个新版本Pod(总数4);
- 新Pod就绪readiness探针通过后,删除1个旧版本Pod(总数3);
- 循环执行,逐步全部替换为新版本;
全程始终保持3个可用实例,无业务中断。
4.3. 版本回滚
发布出现BUG,可一键回退到历史稳定版本:
# 查看发布历史版本
kubectl rollout history deploy web-demo
# 回滚上一版
kubectl rollout undo deploy web-demo
# 指定版本回滚
kubectl rollout undo deploy web-demo --to-revision=2
底层逻辑:复用旧ReplicaSet,快速扩容旧Pod、销毁新版本Pod。
4.4. 弹性扩缩容
手动调整副本数:
# 扩容到5副本
kubectl scale deploy web-demo --replicas=5
配合HPA(HorizontalPodAutoscaler)实现自动弹性:CPU/内存/QPS升高自动扩容,低峰缩容节省资源。
5. Deployment 完整生命周期流程
- apply创建Deployment;
- 控制器生成ReplicaSet;
- ReplicaSet根据template创建指定数量Pod;
- 调度器将Pod调度至节点,kubelet拉取镜像启动容器;
- 持续循环调谐,保证副本稳定;
- 更新镜像/配置:新建ReplicaSet,滚动替换Pod;
- 回滚:启用历史ReplicaSet;
- 删除Deployment:级联删除关联ReplicaSet与所有Pod。
6. 常用操作命令
# 创建/更新deploy
kubectl apply -f deploy.yaml
# 查看所有deployment
kubectl get deploy -n ns
# 查看详细信息、事件、更新进度
kubectl describe deploy web-demo
# 实时观察滚动更新进度
kubectl rollout status deploy web-demo
# 重启Pod(重建所有副本,用于刷新ConfigMap/Secret)
kubectl rollout restart deploy web-demo
# 扩容缩容
kubectl scale deploy web-demo --replicas=5
# 发布历史、回滚
kubectl rollout history deploy web-demo
kubectl rollout undo deploy web-demo
7. Deployment 短板(和StatefulSet对比)
- Pod无固定唯一标识,名称随机(web-demo-7f96d8c4b7-2xqzk),重建名称完全变化;
- 没有稳定网络域名,Pod直接访问不稳定,必须依赖Service;
- 所有Pod共用一套PVC模板,不能每个实例独立存储;
- 无有序部署、有序删除逻辑,不适合主从、集群类有状态中间件。
8. 生产最佳实践
- 必须配置
readinessProbe就绪探针,避免更新时流量打入未启动完成的Pod; maxUnavailable:0保证发布无业务中断;- 配置requests+limits,防止服务抢占节点资源引发节点雪崩;
- 添加Pod反亲和策略,副本分散不同节点实现高可用;
- 不使用Recreate更新策略,避免发布断服;
- 合理设置revisionHistoryLimit,避免大量历史RS占用集群存储;
- 配置HPA实现自动弹性应对流量波动;
- 持久化存储统一引用PVC,不使用HostPath。
9. 面试精简总结
- Deployment是无状态应用控制器,底层通过ReplicaSet管理Pod;
- 四大核心能力:副本自愈、滚动更新、版本回滚、手动/HPA自动扩缩容;
- 两种更新策略:RollingUpdate零停机(生产)、Recreate停机重建;
- 依赖template模板生成Pod,selector标签关联管理Pod;
- 缺陷:Pod名称随机、无固定网络标识、无法每个实例独立PVC,有状态业务改用StatefulSet;
- 核心命令:rollout系列实现发布、回滚、重启、查看更新状态。
关联文档