2. Kubernetes Deployment 基础回顾:Deployment 定义、ReplicaSet、滚动更新与回滚机制

在深入安全基线配置之前,必须牢固掌握 Deployment 的核心工作原理。Deployment 是 Kubernetes 中用于声明式管理 Pod 和 ReplicaSet 的顶层资源,它提供了无状态应用部署、扩缩容、滚动更新与回滚等关键能力。理解其内部组件(ReplicaSet)与更新机制,是后续制定容量规划与 OPA 约束策略的基石。

2.1 Deployment 与 ReplicaSet 的关系

Deployment 并不直接管理 Pod,而是通过管理 ReplicaSet 来间接控制 Pod 的副本数量与版本。每个 Deployment 的修订版本(Revision)都会对应一个 ReplicaSet,这种分层设计使得回滚操作变得原子化且可追溯。

核心概念: Deployment → ReplicaSet → Pod(三层级控制链)。Deployment 负责版本策略与更新,ReplicaSet 负责确保指定数量的 Pod 副本始终运行。
组件 职责 生命周期
Deployment 定义期望状态(副本数、Pod 模板、更新策略);触发滚动更新与回滚;维护修订历史。 长期存在,由用户管理。
ReplicaSet 确保匹配其 Pod 模板的 Pod 数量达到期望值;负责 Pod 的创建与删除。 由 Deployment 自动创建/销毁;旧版本 ReplicaSet 在更新后保留(可配置保留数量)。
Pod 运行应用容器的基本单元;由 ReplicaSet 直接控制。 短暂、可替换;由 ReplicaSet 的控制器循环维持。
Deployment 三层级控制链 Deployment → ReplicaSet → Pod 控制链 Deployment ReplicaSet Pod (副本 1) Pod (副本 2) Pod (副本 N) Deployment 管理 ReplicaSet ReplicaSet 管理 Pod 副本

2.2 Deployment 定义文件结构

一个标准的 Deployment YAML 清单包含 apiVersion、kind、metadata 和 spec 四个顶层字段。其中 spec 下的 replicas、selector、template 和 strategy 是安全基线配置的核心关注点。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  labels:
    app: web
spec:
  replicas: 3
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:1.25
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "250m"
            memory: "256Mi"
          limits:
            cpu: "500m"
            memory: "512Mi"
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1
      maxSurge: 1
  revisionHistoryLimit: 5
安全基线提示: 在 spec.template.spec 中必须显式定义 resources.requests 与 resources.limits,这是容量规划与 OPA 约束检查的基础。缺少资源限制的 Pod 可能导致节点资源争抢,属于安全风险。

2.3 滚动更新机制

滚动更新(RollingUpdate)是 Deployment 默认的更新策略。它通过逐步替换旧版本的 Pod 为新版本,实现零停机部署。更新过程由 maxUnavailable 和 maxSurge 两个参数控制。

  • maxUnavailable:更新过程中允许不可用 Pod 的最大数量(值或百分比)。默认值为 25%。
  • maxSurge:更新过程中允许超出期望副本数的最大 Pod 数量(值或百分比)。默认值为 25%。

滚动更新的执行流程如下:

  1. 用户更新 Deployment 的 Pod 模板(例如修改镜像版本)。
  2. Deployment 控制器创建一个新的 ReplicaSet,初始副本数为 0。
  3. 根据 maxSurge 和 maxUnavailable 的配置,逐步从旧 ReplicaSet 缩减 Pod,同时在新 ReplicaSet 中创建 Pod。
  4. 新 Pod 通过就绪探针(Readiness Probe)检查后,开始接收流量。
  5. 当旧 ReplicaSet 的副本数降为 0,新 ReplicaSet 达到期望副本数时,更新完成。
滚动更新流程 滚动更新(RollingUpdate)流程 旧 ReplicaSet (v1) Pod v1 × 3 新 ReplicaSet (v2) Pod v2 × 0 逐步替换中 旧:2 → 新:1 旧 ReplicaSet (v1) Pod v1 × 0 新 ReplicaSet (v2) Pod v2 × 3 maxUnavailable: 1 maxSurge: 1 确保服务不中断

2.4 回滚机制

当滚动更新导致应用出现故障(如 CrashLoopBackOff、就绪探针失败)时,Deployment 提供了快速回滚的能力。Kubernetes 会保留历史 ReplicaSet,默认保留 10 个修订版本(由 revisionHistoryLimit 控制)。

回滚操作可以通过 kubectl rollout undo 命令执行:

# 回滚到上一个版本
kubectl rollout undo deployment/web-app

# 回滚到指定修订版本
kubectl rollout undo deployment/web-app --to-revision=2

# 查看修订历史
kubectl rollout history deployment/web-app
安全基线警告: 回滚操作会恢复 Pod 模板到历史版本,如果历史版本存在安全漏洞(如旧镜像包含 CVE),则回滚可能引入安全风险。建议在 OPA 策略中限制回滚操作,或要求回滚后必须通过安全扫描。

2.5 关键参数对比

参数 位置 默认值 安全基线建议
replicas spec.replicas 1 生产环境 ≥ 2,配合 PDB 使用
revisionHistoryLimit spec.revisionHistoryLimit 10 建议 3~5,减少 etcd 存储压力
maxUnavailable spec.strategy.rollingUpdate.maxUnavailable 25% 根据业务容忍度调整,建议 ≤ 1 或 10%
maxSurge spec.strategy.rollingUpdate.maxSurge 25% 建议 ≤ 1 或 10%,避免资源突发
resources.requests spec.template.spec.containers[].resources.requests 无 必须显式设置,作为调度与 HPA 基准
resources.limits spec.template.spec.containers[].resources.limits 无 必须显式设置,防止资源滥用

2.6 与安全基线的关联

Deployment 的每个基础特性都与后续章节的安全基线直接相关:

  • ReplicaSet 管理:旧版本 ReplicaSet 可能包含不安全的镜像或配置,OPA 策略需要审计 ReplicaSet 的 Pod 模板。
  • 滚动更新参数:maxSurge 和 maxUnavailable 影响容量规划,过大的值可能导致资源超限。
  • 回滚机制:回滚可能绕过安全准入控制,需要在 OPA 中增加对 rollout undo 操作的审计与约束。
  • 资源限制:缺少 resources.limits 的 Deployment 应被 OPA 拒绝,这是容量规划的第一道防线。
课程衔接: 在后续章节中,我们将基于本节回顾的 Deployment 结构,编写 OPA 约束模板来强制要求 resources.limits、限制 maxSurge 与 maxUnavailable 的阈值,并审计 revisionHistoryLimit 的合规性。