Kubernetes

Deployment 完整深度详解

·12 分钟阅读·4628 字
📋 目录

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实现副本管控,提供:

  1. 多副本高可用;
  2. 滚动更新/蓝绿发布,零停机升级;
  3. 版本回滚;
  4. 副本自动扩缩容;
  5. 故障自愈,节点宕机自动漂移重建Pod。

1.3. 适用&不适用场景

✅ 适合:前后端微服务、Nginx、定时任务服务、无状态中间件;
❌ 不适合:有状态应用MySQL/Redis/Kafka/ES(用StatefulSet)、一次性任务Job/CronJob、节点级组件DaemonSet。

2. Deployment 底层控制链

Deployment → ReplicaSet → Pod

  1. Deployment:记录发布版本、更新策略、回滚历史,不直接管理Pod
  2. ReplicaSet(副本集):精准控制当前运行多少个Pod副本,持有一套Pod模板;
  3. 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. 关键字段逐段说明

  1. replicas
    期望运行Pod副本总数,控制器持续调谐,保证集群中存活Pod等于该数值。
    Pod被杀、节点宕机,控制器自动新建补足副本。
  2. selector.matchLabels
    控制器通过标签匹配归属自己的Pod,template里Pod标签必须和这里完全一致,否则控制器无法管理Pod。
  3. strategy 更新策略两种

3.1.1. (1)RollingUpdate 滚动更新(生产默认)

  • maxSurge:更新期间最多可以比replicas多出多少Pod;
  • maxUnavailable:更新期间最多允许不可用副本数量;
    示例 maxUnavailable:0:发布全程始终保持全部副本在线,零业务中断。

3.1.2. (2)Recreate 重建更新

先一次性删除所有旧Pod,全部销毁后再创建新版本Pod;
会出现业务中断,仅单机本地测试使用,生产禁用。

  1. revisionHistoryLimit
    保留多少个旧ReplicaSet历史版本,用于回滚,默认10;调小可节省etcd存储。
  2. template(Pod模板)
    定义Pod完整规范:镜像、端口、探针、资源限制、存储、亲和、sidecar容器、安全上下文。
    Deployment无直接创建Pod的能力,依靠该模板下发给ReplicaSet生成Pod。

4. Deployment 四大核心能力详解

4.1. 副本自愈 & 高可用

控制器持续循环调谐:

  1. 定期查询集群内匹配标签的Pod;
  2. 若存活Pod < replicas → 扩容新建Pod;
  3. 若存活Pod > replicas → 多余Pod直接删除;
    场景:节点断电、Pod OOM、容器崩溃,自动在其他节点重建,保障副本数量。

配合Pod反亲和,副本打散多台节点,单节点故障不会全部服务下线。

4.2. 滚动更新(零停机发布)

发布流程(replicas=3,maxSurge=1,maxUnavailable=0):

  1. 创建1个新版本Pod(总数4);
  2. 新Pod就绪readiness探针通过后,删除1个旧版本Pod(总数3);
  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 完整生命周期流程

  1. apply创建Deployment;
  2. 控制器生成ReplicaSet;
  3. ReplicaSet根据template创建指定数量Pod;
  4. 调度器将Pod调度至节点,kubelet拉取镜像启动容器;
  5. 持续循环调谐,保证副本稳定;
  6. 更新镜像/配置:新建ReplicaSet,滚动替换Pod;
  7. 回滚:启用历史ReplicaSet;
  8. 删除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对比)

  1. Pod无固定唯一标识,名称随机(web-demo-7f96d8c4b7-2xqzk),重建名称完全变化;
  2. 没有稳定网络域名,Pod直接访问不稳定,必须依赖Service;
  3. 所有Pod共用一套PVC模板,不能每个实例独立存储
  4. 无有序部署、有序删除逻辑,不适合主从、集群类有状态中间件。

8. 生产最佳实践

  1. 必须配置readinessProbe就绪探针,避免更新时流量打入未启动完成的Pod;
  2. maxUnavailable:0 保证发布无业务中断;
  3. 配置requests+limits,防止服务抢占节点资源引发节点雪崩;
  4. 添加Pod反亲和策略,副本分散不同节点实现高可用;
  5. 不使用Recreate更新策略,避免发布断服;
  6. 合理设置revisionHistoryLimit,避免大量历史RS占用集群存储;
  7. 配置HPA实现自动弹性应对流量波动;
  8. 持久化存储统一引用PVC,不使用HostPath。

9. 面试精简总结

  1. Deployment是无状态应用控制器,底层通过ReplicaSet管理Pod;
  2. 四大核心能力:副本自愈、滚动更新、版本回滚、手动/HPA自动扩缩容;
  3. 两种更新策略:RollingUpdate零停机(生产)、Recreate停机重建;
  4. 依赖template模板生成Pod,selector标签关联管理Pod;
  5. 缺陷:Pod名称随机、无固定网络标识、无法每个实例独立PVC,有状态业务改用StatefulSet;
  6. 核心命令:rollout系列实现发布、回滚、重启、查看更新状态。

关联文档