第四部分:Deployment 资源对象介绍

📝 前言

在 Kubernetes 中,Pod 是最小的运行单元,但直接使用 Pod 往往缺乏弹性伸缩、版本管理与自动修复的能力。

为了满足这些需求,Kubernetes 提供了更高层级的 控制器资源对象(Controller)

其中 Deployment 是最常用的控制器之一,它基于 ReplicaSet 管理 Pod,能够实现滚动升级、自动扩缩容、回滚等功能,是现代应用部署的核心。

本文将通过实战结合理论,详细解析 Deployment 资源的工作原理与最佳实践。

🧠 本章知识卡片

🚀 本章小节

1️⃣ 什么是 Deployment?

Deployment 是 Kubernetes 中的一种 声明式控制器资源对象,用于管理无状态应用。

它的主要作用是确保系统中始终运行指定数量的 Pod 副本,并支持以下能力:

  • 自动修复:Pod 异常退出后,Deployment 会通过 ReplicaSet 自动拉起新 Pod。
  • 滚动升级与回滚:支持零停机更新镜像、配置;出错时可快速回滚到之前的版本。
  • 扩缩容:通过调整副本数(replicas),可以轻松实现水平扩缩容。
  • 版本历史管理:保存历史版本,便于追踪与回滚。

2️⃣ Deployment 工作原理

Deployment 的核心机制是:

Deployment → 管理 ReplicaSet → 管理 Pod

流程大致如下:

  • 用户创建 Deployment,声明副本数、副本模板(PodSpec)等。
  • Deployment 创建并维护一个 ReplicaSet。
  • ReplicaSet 确保运行指定数量的 Pod。
  • 当 Deployment 更新时(如镜像版本变化),会生成新的 ReplicaSet,并逐步替换旧 Pod,实现滚动更新。
  • 如果更新失败,可通过 Deployment 直接回滚到之前的 ReplicaSet。

3️⃣ Deployment 生命周期

生命周期流程大致如下:

4️⃣ 创建一个 Deployment

Deployment 的资源配置大部分都与 Pod 一致,只是在这之上又增加补充了一些,如:副本数,选择器和 Pod 模板(Pod 配置)。

示例如下:

创建 deployment.yaml 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3 # 副本数,最终启动几个Pod
selector: # 选择器,需要与 Pod 模板中的 labels 对应
matchLabels:
app: nginx
template: # 这里就是 Pod 模板
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: registry.cn-heyuan.aliyuncs.com/lusyoe/nginx:alpine
ports:
- containerPort: 80

创建资源:

kubectl apply -f deployment.yaml

也可以通过一行命令简化创建:

1
kubectl create deployment my-deployment --image=nginx:1.27 --replicas=1

查看状态:

1
2
3
4
5
6
7
8
# 查看 Pod 状态
# 创建完成后可通过查看 Pod 状态了解启动情况
kubectl get pods

# 查看 Deployments 状态
# 如果未看到 pod 启动,可以继续查看 deployment 状态进行分析
kubectl get deployments
kubectl describe deployment my-deployment

5️⃣ 扩缩容

可以直接编辑yaml文件中replicas,然后再重新apply进行扩缩容。

也可以通过以下命令直接扩缩容:

kubectl scale deployment my-deployment --replicas=5

更高级一点的方法是通过HPA自动扩缩容,这也是在生产环境中比较常见的一种方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 创建 deployments
kubectl create deployment my-deployment \
--image=registry.cn-heyuan.aliyuncs.com/lusyoe/nginx:alpine \
--replicas=1

# 设置资源请求(HPA前提)
kubectl set resources deployment/my-deployment \
--requests=cpu=10m,memory=20Mi

# 使用 sealos 安装 metrics 组件(若没有的话)
sealos run registry.cn-shanghai.aliyuncs.com/labring/metrics-server:v0.7.1

# 创建HPA(依赖metrics组件请提前安装)
kubectl autoscale deployment my-deployment \
--cpu-percent=50 \
--min=2 \
--max=10

# 模拟负载
while true; do curl -s http://[PodIP] > /dev/null; done

# 查看 HPA 状态
kubectl get hpa

说明:

  • -cpu-percent=50:当 Pod 平均 CPU 使用率超过 50% 时触发扩容
  • -min=2:最少保持 2 个副本
  • -max=10:最多扩容到 10 个副本

6️⃣ 滚动升级

滚动升级比较简单,只需要修改image镜像地址,默认就会自动滚动升级。

示例如下:

1
kubectl set image deployment/nginx-deployment nginx=nginx:1.28 --record

7️⃣ 回滚版本

回滚也比较简单,这都是内置级的特性。

示例如下:

1
2
3
4
# 回滚到上一个版本
kubectl rollout undo deployment/my-deployment
# 查看历史版本
kubectl rollout history deployment/my-deployment

✅ 最佳实践

在生产使用时,可遵循以下最佳实践提供应用的稳定性和资源利用率:

  • 配置 readinessProbe / livenessProbe
  • 合理设置 资源请求与限制
  • 使用滚动更新策略 (maxUnavailable / maxSurge)
  • 生产环境副本数 ≥ 2,提升高可用性
  • 结合 HPA (Horizontal Pod Autoscaler) 自动扩缩容

📌 总结

Deployment 是 Kubernetes 最常用的无状态控制器,几乎所有应用的上线都依赖于它。
它通过 ReplicaSet 管理 Pod,具备自动修复、滚动更新、回滚和扩缩容能力,是学习和使用 Kubernetes 的核心步骤。