• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
思想人生从关注生活开始
博客园    首页    新随笔    联系   管理    订阅  订阅

Kubernetes 中Deployment 详解

在 Kubernetes 中,Deployment 是最常用的工作负载(Workload)控制器之一,用于声明式地管理无状态应用的 Pod 副本集(ReplicaSet)。它的核心价值在于:确保指定数量的 Pod 始终健康运行,并支持滚动更新与回滚。

🎯 一、Deployment 的核心作用

 
功能说明
✅ 副本管理 始终维持指定数量的 Pod(如 replicas: 3)
✅ 自愈能力 Pod 崩溃、节点故障 → 自动重建新 Pod
✅ 滚动更新 无缝升级镜像或配置,零停机
✅ 版本回滚 一键回退到上一个稳定版本
✅ 暂停/恢复更新 支持分阶段发布
💡 适用场景:Web 服务、API 网关、缓存代理等无状态应用(Stateless)
❌ 不适用:数据库、ZooKeeper、Kafka 等有状态应用(应使用 StatefulSet)

📦 二、Deployment 基本结构(YAML 示例)

 
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: nginx-deployment
5spec:
6  replicas: 3                          # 期望的 Pod 副本数
7  selector:
8    matchLabels:
9      app: nginx                       # 必须匹配 template.metadata.labels
10  strategy:
11    type: RollingUpdate                # 更新策略
12    rollingUpdate:
13      maxUnavailable: 1                # 更新时最多不可用 1 个
14      maxSurge: 1                      # 最多可超配 1 个(临时)
15  template:                            # Pod 模板(核心!)
16    metadata:
17      labels:
18        app: nginx                     # 必须包含 selector 中的标签
19    spec:
20      containers:
21        - name: nginx
22          image: nginx:1.25
23          ports:
24            - containerPort: 80
25          resources:
26            requests:
27              memory: "64Mi"
28              cpu: "100m"

🔁 三、Deployment 如何工作?(内部机制)

Deployment 并不直接管理 Pod,而是通过 两层控制器 实现:
1Deployment 
2   ↓ (控制)
3ReplicaSet (v1) ← 当前活跃版本
4   ↓ (管理)
5Pods (3个)
6
7当你更新镜像 → Deployment 创建 ReplicaSet (v2),逐步替换 v1 的 Pod
  • 每次更新都会创建新的 ReplicaSet
  • 旧 ReplicaSet 保留(用于回滚)
  • kubectl rollout history deployment/nginx-deployment 可查看历史版本

🔄 四、关键操作:更新与回滚

1. 触发更新

1# 方法1:修改 YAML 后 apply
2kubectl apply -f deployment.yaml
3
4# 方法2:直接 set 镜像
5kubectl set image deployment/nginx-deployment nginx=nginx:1.26
6
7# 方法3:edit 在线编辑
8kubectl edit deployment/nginx-deployment

2. 监控滚动更新

1kubectl rollout status deployment/nginx-deployment

3. 回滚到上一版本

1kubectl rollout undo deployment/nginx-deployment

4. 回滚到指定版本

1kubectl rollout history deployment/nginx-deployment  # 查看 REVISION
2kubectl rollout undo deployment/nginx-deployment --to-revision=2

⚙️ 五、更新策略详解

RollingUpdate(默认)

  • 逐个替换 Pod,保证服务不中断
  • 通过两个参数精细控制:
    • maxUnavailable: 更新过程中允许不可用的最大 Pod 数(默认 25%)
    • maxSurge: 允许超出期望副本数的最大 Pod 数(默认 25%)
🌰 例:replicas: 4, maxUnavailable: 1, maxSurge: 1
更新时:最多 3 个可用(4-1),最多 5 个 Pod(4+1)

Recreate(重建)

  • 先删除所有旧 Pod,再创建新 Pod
  • 会导致短暂服务中断
  • 适用于无法并行运行新旧版本的应用
 
1strategy:
2  type: Recreate

🔍 六、调试与排查技巧

1. 查看 Deployment 状态

1kubectl get deployment
2# 输出:READY 列显示 "3/3" 表示 3 个期望,3 个就绪

2. 查看关联的 ReplicaSet

1kubectl get rs
2# 会看到 nginx-deployment-6b4d9f7c8c 等带 hash 的名称

3. 查看更新历史

1kubectl rollout history deployment/nginx-deployment

4. 暂停/恢复更新(用于分阶段发布)

1kubectl rollout pause deployment/nginx-deployment
2# 修改资源限制、环境变量等
3kubectl rollout resume deployment/nginx-deployment

⚠️ 七、常见陷阱与最佳实践


 
问题解决方案
忘记设置 resources 导致节点资源耗尽 → 始终设置 requests/limits
标签不匹配 selector.matchLabels 必须与 template.metadata.labels 完全一致
就绪探针缺失 新 Pod 未就绪就被加入流量 → 添加 readinessProbe
滚动更新卡住 检查新 Pod 是否 CrashLoopBackOff → kubectl logs --previous
直接操作 Pod 手动删 Pod 会被自动重建 → 应通过缩容或更新 Deployment

🆚 Deployment vs 其他控制器


 
控制器适用场景特点
Deployment 无状态应用(Nginx, Web API) 副本管理、滚动更新
StatefulSet 有状态应用(MySQL, ZooKeeper) 固定网络标识、有序部署/扩展
DaemonSet 每节点运行一个(日志、监控 agent) 自动覆盖新加入节点
Job 一次性任务(数据迁移、批处理) 完成后自动终止

✅ 总结:Deployment 的核心价值

“你只管声明想要什么(3个 nginx:1.25 Pod),剩下的交给 Kubernetes。”
  • 自动扩缩容(配合 HPA)
  • 自愈(Pod 死了自动拉起)
  • 无损升级(滚动更新)
  • 版本可控(回滚无忧)

 
posted @ 2026-01-09 13:45  JackYang  阅读(19)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3