Deployment 是什么
学习目标
- 理解 Deployment 的作用和职责
- 理解 Deployment 与 Pod 的关系
- 掌握 Deployment 的核心特性
核心概念
一句话解释
Deployment 是 Kubernetes 中用于声明式管理无状态应用的控制器,确保指定数量的 Pod 副本始终运行。
Deployment 解决什么问题
手动管理 Pod 的问题:
┌─────────────────────────────────────┐
│ 手动创建 Pod │
│ - Pod 挂了谁来重启? │
│ - 怎么保证一直有 3 个副本? │
│ - 怎么更新到新版本? │
│ - 更新出问题怎么回滚? │
└─────────────────────────────────────┘
Deployment 解决方案:
┌─────────────────────────────────────┐
│ Deployment(声明期望状态) │
│ "我要 3 个 nginx Pod" │
│ │
│ → ReplicaSet(确保副本数量) │
│ → Pod 1 │
│ → Pod 2 │
│ → Pod 3 │
└─────────────────────────────────────┘
自动维护期望状态,自动处理故障恢复
Deployment 的核心职责
| 职责 | 说明 |
|---|---|
| 副本管理 | 确保指定数量的 Pod 副本运行 |
| 滚动更新 | 逐步替换旧版本 Pod |
| 回滚 | 快速回到之前的版本 |
| 扩缩容 | 动态调整 Pod 数量 |
| 自愈 | Pod 挂掉自动重建 |
Deployment 架构
Deployment
│
├── ReplicaSet (v1) ← 当前版本
│ ├── Pod 1
│ ├── Pod 2
│ └── Pod 3
│
└── ReplicaSet (v0) ← 旧版本(更新后保留)
└── Pod (0)
Deployment 管理 ReplicaSet,ReplicaSet 管理 Pod
Deployment vs 直接创建 Pod
| 方面 | 直接创建 Pod | 使用 Deployment |
|---|---|---|
| 自动重启 | 否 | 是 |
| 副本管理 | 手动 | 自动 |
| 滚动更新 | 不支持 | 支持 |
| 回滚 | 不支持 | 支持 |
| 扩缩容 | 手动 | 命令/自动 |
声明式 vs 命令式
命令式(告诉 K8s 做什么):
$ kubectl run nginx --image=nginx
$ kubectl scale deployment nginx --replicas=3
声明式(告诉 K8s 要什么):
apiVersion: apps/v1
kind: Deployment
spec:
replicas: 3 # 我要 3 个副本
template:
spec:
containers:
- name: nginx
image: nginx # 用这个镜像
K8s 负责实现,你只描述期望状态
实践练习
练习 1:理解概念
回答以下问题:
- Deployment 和 Pod 的关系是什么?
- Deployment 如何实现自愈?
- 声明式和命令式的区别是什么?
练习 2:画图画架构
画出 Deployment → ReplicaSet → Pod 的层级关系
常见误解
1. Deployment 不直接管理 Pod
错误理解:Deployment 直接创建 Pod
正确理解:Deployment → ReplicaSet → Pod
Deployment 通过 ReplicaSet 间接管理 Pod
这样可以保留旧版本 ReplicaSet 用于回滚
2. Deployment 适合无状态应用
无状态应用:Web 服务、API 服务
有状态应用:数据库、消息队列
有状态应用应该用 StatefulSet
小结
| 要点 | 说明 |
|---|---|
| Deployment | 声明式管理无状态应用 |
| 核心职责 | 副本管理、滚动更新、回滚、扩缩容、自愈 |
| 层级关系 | Deployment → ReplicaSet → Pod |
| 声明式 | 描述期望状态,K8s 负责实现 |
| 适用场景 | 无状态应用(Web、API 等) |
练习编辑器
bash
Loading...