首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Kubernetes 中Deployment 详解

Kubernetes 中Deployment 详解

作者头像
jack.yang
发布2026-01-10 10:00:11
发布2026-01-10 10:00:11
1540
举报

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

🎯 一、Deployment 的核心作用

功能

说明

✅ 副本管理

始终维持指定数量的 Pod(如 replicas: 3)

✅ 自愈能力

Pod 崩溃、节点故障 → 自动重建新 Pod

✅ 滚动更新

无缝升级镜像或配置,零停机

✅ 版本回滚

一键回退到上一个稳定版本

✅ 暂停/恢复更新

支持分阶段发布

💡 适用场景:Web 服务、API 网关、缓存代理等无状态应用(Stateless) ❌ 不适用:数据库、ZooKeeper、Kafka 等有状态应用(应使用 StatefulSet


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

代码语言:javascript
复制
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,而是通过 两层控制器 实现:

代码语言:javascript
复制
1Deployment 
2   ↓ (控制)
3ReplicaSet (v1) ← 当前活跃版本
4   ↓ (管理)
5Pods (3个)
6
7当你更新镜像 → Deployment 创建 ReplicaSet (v2),逐步替换 v1 的 Pod
  • 每次更新都会创建新的 ReplicaSet
  • 旧 ReplicaSet 保留(用于回滚)
  • kubectl rollout history deployment/nginx-deployment 可查看历史版本

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

1. 触发更新

代码语言:javascript
复制
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. 监控滚动更新

代码语言:javascript
复制
1kubectl rollout status deployment/nginx-deployment

3. 回滚到上一版本

代码语言:javascript
复制
1kubectl rollout undo deployment/nginx-deployment

4. 回滚到指定版本

代码语言:javascript
复制
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: 4maxUnavailable: 1maxSurge: 1 更新时:最多 3 个可用(4-1),最多 5 个 Pod(4+1)

Recreate(重建)

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

🔍 六、调试与排查技巧

1. 查看 Deployment 状态

代码语言:javascript
复制
1kubectl get deployment
2# 输出:READY 列显示 "3/3" 表示 3 个期望,3 个就绪

2. 查看关联的 ReplicaSet

代码语言:javascript
复制
1kubectl get rs
2# 会看到 nginx-deployment-6b4d9f7c8c 等带 hash 的名称

3. 查看更新历史

代码语言:javascript
复制
1kubectl rollout history deployment/nginx-deployment

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

代码语言:javascript
复制
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 死了自动拉起)
  • 无损升级(滚动更新)
  • 版本可控(回滚无忧)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🎯 一、Deployment 的核心作用
  • 📦 二、Deployment 基本结构(YAML 示例)
  • 🔁 三、Deployment 如何工作?(内部机制)
  • 🔄 四、关键操作:更新与回滚
    • 1. 触发更新
    • 2. 监控滚动更新
    • 3. 回滚到上一版本
    • 4. 回滚到指定版本
  • ⚙️ 五、更新策略详解
    • RollingUpdate(默认)
    • Recreate(重建)
  • 🔍 六、调试与排查技巧
    • 1. 查看 Deployment 状态
    • 2. 查看关联的 ReplicaSet
    • 3. 查看更新历史
    • 4. 暂停/恢复更新(用于分阶段发布)
  • ⚠️ 七、常见陷阱与最佳实践
  • 🆚 Deployment vs 其他控制器
  • ✅ 总结:Deployment 的核心价值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档