Deployment 与 ReplicaSet
你曾经手动管理过几十台服务器的应用部署吗?每次发布新版本,需要登录每台服务器,执行部署脚本,检查部署结果。如果某台服务器失败了,还要手动回滚。
Deployment 的出现,让这一切变得自动化。
Deployment 是什么?
Deployment 是 Kubernetes 最常用的工作负载控制器,它管理 ReplicaSet,实现应用的声明式更新。
Deployment 的核心能力:
- 声明期望状态:告诉 Kubernetes 你想要几个副本、什么镜像
- 自动维护副本数:自动创建/删除 Pod,维持期望副本数
- 滚动更新:平滑地升级应用版本
- 回滚:出现问题时快速回退到历史版本
- 暂停/恢复:可以在更新过程中暂停
创建 Deployment
nginx-deployment.yaml
Deployment 详解
字段说明
状态解读
滚动更新
RollingUpdate 策略
rollingupdate-deployment.yaml
触发更新
回滚
Recreate 策略
Warning
Recreate 策略会先删除所有旧 Pod,再创建新 Pod。更新过程中应用会短暂不可用,适用于不能同时运行两个版本的应用。
暂停与恢复
金丝雀发布
Deployment 原生不支持金丝雀发布,但可以通过调整副本数实现简单的金丝雀:
生命周期
Deployment 与 ReplicaSet 关系
清理历史版本
Pod 选择器
Deployment 的 selector 定义了它管理的 Pod:
Warning
Deployment 的 selector 是不可变的。修改 selector 会导致现有管理的 Pod 脱离控制,可能创建孤立的 Pod。
探针配置
deployment-with-probes.yaml
常见问题
Deployment 无法创建
更新卡住
Pod 无法调度
最佳实践
生产环境配置
production-deployment.yaml
延伸思考
Deployment 是 Kubernetes 最成功的抽象之一:
- 声明式更新:你描述「想要什么」,Kubernetes 负责「怎么做」
- 零停机发布:滚动更新机制保证了服务持续可用
- 版本化管理:每次更新都有历史记录,可以随时回滚
但 Deployment 也有局限:
- 不支持金丝雀:需要手动实现流量分割
- 不支持 A/B 测试:无法基于请求内容路由
- 状态管理有限:对于有状态应用无能为力
对于更复杂的发布策略,Ingress Controller + Service Mesh 是更好的选择。
延伸阅读
- Pod 生命周期与钩子:Pod 的完整生命周期
- Service 详解:Pod 的服务发现
- StatefulSet 有状态应用:有状态应用的部署