Kubernetes 部署编排
§1摘要与结论
Kubernetes 是容器编排平台,其 Deployment 控制器以声明式方式管理无状态工作负载的创建、扩缩与更新,默认采用滚动更新策略,并通过保留历史 ReplicaSet 支持版本回退。
别名:Kubernetes、K8s、Deployment controller、Deployment 控制器、滚动更新编排 | 英文:Kubernetes Deployment Orchestration | 类型:工具 / platform
§2局部关系图
§3原理 · 为什么
Kubernetes 把部署表达为期望状态的声明,控制器持续把实际状态调谐到期望状态。Deployment 控制器管理无状态工作负载的生命周期:创建、扩缩与更新都由同一份声明驱动,而非依赖人工逐台操作。滚动更新是它的默认更新方式,用逐步替换副本的方式让新旧版本短暂并存,从而在不中断服务的前提下完成版本切换;历史版本被记录为可回溯的副本集,使回退成为对早期期望状态的重新声明。这一机制把「如何更新」从一次性脚本提升为可重复、可审计的收敛过程。声明式模型的另一价值是自愈:当副本因节点故障或进程崩溃而缺失时,控制器会自动补齐到期望数量,无需人工干预,从而把部署意图与运行现实持续对齐。从运维视角看,这种声明式收敛把「部署是否成功」的定义从「命令是否执行完」改为「期望状态是否达成」,使部署结果可被持续观测与校验。
§4机制 · 如何运作
Deployment 通过 ReplicaSet 管理 Pod 副本。更新时创建新 ReplicaSet 并逐步扩缩,由 maxUnavailable(更新期间允许不可用的最大副本比例)与 maxSurge(允许超出期望副本数的最大比例)共同控制节奏,二者默认均为 25%。当 maxUnavailable 设为 0 且 maxSurge 足够时,更新期间可用副本数不会低于期望值。更新过程支持同一应用的多个版本并存;回退依赖保留的历史 ReplicaSet,由 revisionHistoryLimit 决定保留数量,超出后被回收。滚动期间总 Pod 数可能短暂超过期望副本数,具体受终止宽限期影响。由于替换是分批进行的,整个切换不是原子操作,若新版本在靠后的批次才暴露问题,故障面会已随时间扩大。推进节奏还受就绪检查与滚动步长影响,配置不当会出现更新长时间卡住或反复重试,因此观察 rollout 事件与副本状态是判断更新健康与否的关键。
§5工程 · 怎么落地
生产中应显式设置 maxUnavailable/maxSurge,而不是依赖默认值;对可用性敏感的服务可取 maxUnavailable=0。为容器配置就绪探针与存活探针,确保流量只导向真正可服务的副本;为终止配置优雅关闭窗口,避免更新期间请求被截断。把期望状态声明纳入版本控制,使回退和审计可复现。滚动更新可与流量灰度配合,把版本替换与用户暴露分开控制。升级前应核对有状态负载是否适用——StatefulSet 与持久卷的顺序与身份约束不同于无状态 Deployment。更新期间应监控 rollout 状态并在失败时自动停止,避免错误版本持续扩散。此外应为工作负载设置资源请求与限制并配合中断预算,防止更新时节点资源竞争导致雪崩。对跨团队共享的集群,应通过命名空间与资源配额限制单次部署的影响范围,并把部署清单纳入代码评审,避免绕过流程的临时变更。
§6权衡卡
此外,声明式编排引入了可观的配置与运维复杂度,许多行为依赖对控制器语义的准确理解,误配探测或节奏参数可能在更新中造成大面积不可用;对小型、低变更频率、无专职运维的系统,这套机制可能超出需要,带来不成比例的认知与维护成本。
因此引入编排平台应以其变更频率、可用性目标与团队运维能力是否支撑得起这份复杂度为前提,而非把它当作默认选项;对简单系统,更轻量的部署手段往往能以更低成本获得相近收益。
此外,控制器版本与 API 的演进会带来兼容性成本,升级集群本身也是一次需要回退预案的高风险变更。
- 滚动更新的资源开销小、无需双份环境,但缺点同样明确:切换非原子、整体完成较慢,缺乏对全部流量的整体控制,回退只能反向滚动而无法瞬时完成,且故障影响面会随时间在各批副本间扩散。
- 相比蓝绿的一次性切换,它更难在切换瞬间整体止损。
- 只有当编排带来的自动化与自愈能力确实被高频变更和严格可用性要求所需要时,它的复杂度才是值得的投入。
权衡原文仅按显式标记词归栏引用(收益 / 代价 / 反例),其余句子按原序列为「原文要点」;内容逐字引用未改写。
§7案例带
插件 DAG RC5→RC7 升级
一次知识库随上游源码版本升级的级联维护:以三层差异分析把 219 个包收敛为 26 个实质变更包,经编译、运行时、组合三类依赖判定更新 DAG 数据后全量重生成页面,并以静态门控加渲染验证收口。
§8信源与核验
核验结论:Deployment 的默认策略是 RollingUpdate,以滚动方式逐步下线旧 ReplicaSet、上线新 ReplicaSet;maxUnavailable/maxSurge 默认各 25% [VEN-023]
核验结论:滚动更新分批进行、非原子;回退依赖保留的历史 ReplicaSet 做反向滚动,较慢且非即时,与蓝绿切换语义不同 [VEN-023]
§9原始关系清单
展开:本节点的全部原始关系边(4 条,含边 ID 与方向)
| 关系 | 方向 | 对端节点 | 说明 |
|---|---|---|---|
| 组合 | → TEC-J-03 | 蓝绿部署 E-847 | 编排层支撑蓝绿双环境编排 |
| 组合 | → TEC-J-04 | 金丝雀发布 E-846 | 编排层承载金丝雀流量切分 |
| 实现 | → MTH-J-05 | 渐进暴露部署策略 E-831 | K8s 滚动更新实现渐进暴露 |
| 实现 | → MTH-J-07 | 可回滚性与爆炸半径控制 E-832 | 历史 ReplicaSet 支撑版本回退 |
附对照资源 · 12factor 子库
| 12factor 节点 | 关系 | 对照说明 |
|---|---|---|
| 端口绑定 app-port | 跨体系对照 | 自含导出服务即边界/接口隔离;容器编排的端口暴露为其技术落地 |