1. Deployment 基础概念:Deployment 的作用、与 ReplicaSet 和 Pod 的关系、声明式更新机制

Deployment 是 Kubernetes 中用于管理无状态工作负载的核心 API 对象。它通过声明式配置驱动控制器循环,确保集群中的 Pod 副本数量、版本和运行状态始终与用户期望保持一致。理解 Deployment 是掌握集群容量规划与节点扩容的前提——因为所有资源分配最终都落脚于 Pod 的调度与副本管理。

1.1 Deployment 的核心作用

  • 声明式副本管理:定义 replicas 字段,控制器保证指定数量的 Pod 始终运行。
  • 滚动更新与回滚:支持零停机更新应用版本,更新失败时可快速回退到历史版本。
  • 自愈能力:当 Pod 因节点故障、资源不足或进程崩溃而终止时,Deployment 自动创建替换 Pod。
  • 扩缩容:通过修改 replicas 或结合 HPA(Horizontal Pod Autoscaler)动态调整副本数,是容量规划的直接入口。
  • 版本追踪:每次更新都会生成新的 ReplicaSet,保留历史版本用于审计和回滚。
容量规划视角:Deployment 的 replicas 和 resources.requests/limits 直接决定了集群需要预留的 CPU 和内存总量。节点扩容方案通常以 Deployment 的副本数增长作为触发条件。

1.2 Deployment、ReplicaSet 与 Pod 的层级关系

三者构成 Kubernetes 工作负载管理的经典三层架构:Deployment → ReplicaSet → Pod。Deployment 不直接管理 Pod,而是通过 ReplicaSet 实现副本控制。

对象 职责 生命周期 与上层关系
Deployment 声明式版本管理、滚动策略、回滚 长期存在,随应用版本迭代更新 创建并管理 ReplicaSet
ReplicaSet 确保指定数量的 Pod 副本运行 每次 Deployment 更新生成新 RS,旧 RS 保留用于回滚 被 Deployment 控制,直接管理 Pod
Pod 运行容器化应用实例,拥有独立 IP 和存储 短暂易失,可能因调度、资源、健康检查而重建 由 ReplicaSet 创建和回收
关键区别:ReplicaSet 只保证副本数量,Deployment 在此基础上增加了版本控制、更新策略和回滚能力。在生产环境中,永远不要直接操作 ReplicaSet 或 Pod,所有变更都应通过 Deployment 的声明式配置进行。
Deployment、ReplicaSet、Pod 三层架构关系图 Deployment → ReplicaSet → Pod 三层架构 Deployment 声明式版本管理 · 滚动更新 · 回滚 创建/管理 ReplicaSet 副本数量保证 · 版本快照 控制/扩缩 Pod A 容器实例 Pod B 容器实例 Pod C 容器实例 说明: Deployment 每次更新创建一个新 ReplicaSet,旧 ReplicaSet 保留用于回滚;ReplicaSet 通过标签选择器管理 Pod 副本。

1.3 声明式更新机制

声明式更新是 Deployment 区别于传统运维脚本的核心特征。用户只需提交期望状态(YAML/JSON),控制器持续调和当前状态直至匹配。

更新流程(滚动更新)

  1. 提交新版本:修改 Deployment 的 spec.template(如镜像版本),通过 kubectl apply 或 API 提交。
  2. 创建新 ReplicaSet:Deployment 控制器检测到模板变更,自动创建新 ReplicaSet,初始副本数为 0。
  3. 渐进式替换:按 spec.strategy.rollingUpdate.maxSurge 和 maxUnavailable 参数,逐步扩容新 RS、缩容旧 RS。
  4. 健康检查:新 Pod 通过 readiness probe 后才继续下一批替换,确保服务不中断。
  5. 完成或回滚:新 RS 副本数达到 replicas,旧 RS 缩容至 0;若新版本异常,可执行 kubectl rollout undo 回退。
容量规划影响:滚动更新期间,集群需要同时运行新旧两个版本的 Pod(maxSurge 决定额外副本数)。如果集群资源紧张,可能导致更新阻塞或 Pod 驱逐。规划节点容量时,必须将 maxSurge 和 maxUnavailable 纳入资源余量计算。

声明式 vs 命令式 对比

特性 声明式(Deployment) 命令式(kubectl run / scale)
操作方式 提交期望状态 YAML 直接执行命令
可审计性 YAML 可版本化管理(GitOps) 命令无持久记录
回滚能力 内置历史版本回滚 需手动恢复
自动修复 控制器持续调和 无自动修复
扩缩容 修改 replicas 字段 kubectl scale 命令
Deployment 声明式滚动更新流程 声明式滚动更新流程 1. 提交期望状态 kubectl apply -f deploy.yaml 2. 创建新 ReplicaSet 新 RS 初始副本=0 3. 渐进式替换 maxSurge / maxUnavailable 4. 健康检查 Readiness Probe 5a. 更新完成 新 RS 副本=replicas,旧 RS→0 5b. 回滚 kubectl rollout undo 关键参数: maxSurge=25% 表示更新期间最多允许超出期望副本 25%;maxUnavailable=25% 表示允许最多 25% 的副本不可用。

1.4 与容量规划的关联

Deployment 的副本数和资源请求直接决定了集群的资源水位。在节点扩容方案中,以下 Deployment 属性是核心输入:

  • spec.replicas:目标副本数,决定 Pod 总量。
  • spec.template.spec.containers[].resources.requests:每个 Pod 预留的 CPU 和内存,用于计算集群总需求。
  • spec.strategy.rollingUpdate.maxSurge:滚动更新期间的额外资源开销。
  • spec.template.spec.nodeSelector / affinity:影响 Pod 在节点间的分布,间接决定扩容策略。
实践建议:在集群中为每个 Deployment 设置 resources.requests 和 limits,并开启 cluster-autoscaler。当 Deployment 副本数增加导致节点资源不足时,自动触发节点扩容。这是 Kubernetes 容量规划的标准模式。