Kubernetes Deployment 描述期望状态
与其描述步骤,不如描述终态。这条思想支撑起副本、滚动更新与回滚的一切机制。 声明规范胜过过程脚本 一份 Deployment 是「终态」的陈述,而不是一张命令清单:多少副本、哪个镜像、哪条 tag、什么标签。操作者写下「要什么」,控制器这位 reconcile 循环决定「怎么要」。区别在于资源所有权,而不是有没有使用命令行。kubectl run 通常创建独立 Pod,kubelet 可以重启其中容器,但这个 Pod 消失后,没有 ReplicaSet 负责补足一组替代对象。Deployment 同样可以通过一条命令创建,客户端退出之后,存储下来的规范仍会持续指导控制器。中断客户端并不能可靠说明 API 是否已经接纳请求;重试或诊断收敛之前,先查看实际存储的对象,区分请求传递状态与控制器执行状态。 由控制器填补差距 Deployment 控制器管理 ReplicaSet,再由副本集控制器维持 Pod 数量。容器崩溃时,kubelet 可以在同一个 Pod 内重启容器;删除或丢失 Pod 后创建替代对象,则是另一条协调路径。它们会配合工作,但不能都说成同一个控制器每隔几秒创建一个 Pod,否则无法区分实例身份、重启与替换。 协调是异步过程,依赖控制面正常以及容量足够。镜像拉取失败、配额、准入拒绝和存储不可用,都可能长期阻止收敛。应查看条件与事件,确认究竟哪一层受阻。期望副本数是系统追求的目标,不是真实就绪容量的证据,也不是恢复时间上限;控制器反复尝试不等于问题已经得到解决。 一次次发布都是经过步骤的 修改 Pod 模板会触发发布与修订版本,单纯缩放不会。控制器按照更新策略、就绪和可用性要求调整新旧 ReplicaSet 数量。流量由 Service 与对应数据路径另行处理,Deployment 控制器本身不是逐条迁移连接的代理。发布状态和请求成功需要分别观察,不能把模板变化自动等同于无中断流量切换。 回滚恢复先前 Pod 模板,不会恢复 Deployment 所有字段,更不会撤销数据库模式等外部状态。保留的 ReplicaSet 提供回滚历史,revisionHistoryLimit 默认十份,清理从发布完成之后开始。流水线重复应用未变化的模板,并不会只因执行了一次就生成新修订;版本库审计与集群修订解决的是不同范围的历史问题。 ...