2. Kubernetes Deployment 基础回顾:Deployment 定义、ReplicaSet、滚动更新与回滚机制
在深入安全基线配置之前,必须牢固掌握 Deployment 的核心工作原理。Deployment 是 Kubernetes 中用于声明式管理 Pod 和 ReplicaSet 的顶层资源,它提供了无状态应用部署、扩缩容、滚动更新与回滚等关键能力。理解其内部组件(ReplicaSet)与更新机制,是后续制定容量规划与 OPA 约束策略的基石。
2.1 Deployment 与 ReplicaSet 的关系
Deployment 并不直接管理 Pod,而是通过管理 ReplicaSet 来间接控制 Pod 的副本数量与版本。每个 Deployment 的修订版本(Revision)都会对应一个 ReplicaSet,这种分层设计使得回滚操作变得原子化且可追溯。
| 组件 | 职责 | 生命周期 |
|---|---|---|
| Deployment | 定义期望状态(副本数、Pod 模板、更新策略);触发滚动更新与回滚;维护修订历史。 | 长期存在,由用户管理。 |
| ReplicaSet | 确保匹配其 Pod 模板的 Pod 数量达到期望值;负责 Pod 的创建与删除。 | 由 Deployment 自动创建/销毁;旧版本 ReplicaSet 在更新后保留(可配置保留数量)。 |
| Pod | 运行应用容器的基本单元;由 ReplicaSet 直接控制。 | 短暂、可替换;由 ReplicaSet 的控制器循环维持。 |
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%。
滚动更新的执行流程如下:
- 用户更新 Deployment 的 Pod 模板(例如修改镜像版本)。
- Deployment 控制器创建一个新的 ReplicaSet,初始副本数为 0。
- 根据
maxSurge和maxUnavailable的配置,逐步从旧 ReplicaSet 缩减 Pod,同时在新 ReplicaSet 中创建 Pod。 - 新 Pod 通过就绪探针(Readiness Probe)检查后,开始接收流量。
- 当旧 ReplicaSet 的副本数降为 0,新 ReplicaSet 达到期望副本数时,更新完成。
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
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 拒绝,这是容量规划的第一道防线。
resources.limits、限制 maxSurge 与 maxUnavailable 的阈值,并审计 revisionHistoryLimit 的合规性。