简介
在之前的实验中,你创建过单个 Pod。Pod 虽然是 Kubernetes 的基本构建单元,但手动管理 Pod 很繁琐。如果某个 Pod 终止,你必须手动重启它。如果需要更多副本,也必须手动创建更多 Pod。
这时就需要使用 Deployment。
Deployment 是一种更高级别的控制器,可以替你管理 ReplicaSet 和 Pod。你只需声明应运行多少个副本,以及这些 Pod 应使用的模板,Kubernetes 就会持续让实际状态与声明保持一致。
这里的关键变化是:从管理单个 Pod,转变为管理可重复的工作负载。单个 Pod 只有一个实例,因此比较脆弱。Deployment 描述了如何创建 Pod,以及应运行多少个 Pod。正是这种模式让扩展和自愈成为可能。
在本实验中,你将学习:
- 创建一个目标明确的 Manager(Deployment),要求运行 3 个副本。
- 观察 Manager 创建工作 Pod。
- “终止”一个工作 Pod,测试 Manager 的反应(自愈)。
- 要求 Manager 创建更多工作 Pod(扩展)。
创建 Deployment YAML
在本步骤中,你将为 Manager 编写一份工作说明。这是一个 YAML 文件,用于定义要运行的镜像以及所需的副本数。
与普通的 Pod 清单相比,Deployment 包含额外的结构:selector 和 template。selector 告诉 Kubernetes 哪些 Pod 属于此 Deployment,template 则描述应如何创建新的 Pod。这两部分必须保持一致,否则 Deployment 将无法正确管理目标 Pod。
首先,确认当前位于项目目录:
cd ~/project
使用 nano 创建名为 deployment.yaml 的新文件:
nano deployment.yaml
将以下配置粘贴到文件中。注意 replicas: 3 这一行,它定义了团队所需的成员数量。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
保存文件:按 Ctrl+X,然后按 Y,最后按 Enter。
这个文件告诉 Kubernetes:「创建一个名为 nginx-deployment 的 Deployment,确保始终有 3 个 Pod 运行 nginx:1.14.2 镜像。如果需要查找这些 Pod,就查找带有 app: nginx 标签的 Pod。」
应用配置并观察
现在你已经准备好工作说明,接下来创建 Manager。将配置应用到集群:
创建 Deployment 时,Kubernetes 通常会在后台创建另一个名为 ReplicaSet 的对象。ReplicaSet 直接负责维持所请求的 Pod 数量。初学者暂时不需要直接管理 ReplicaSet,但了解它的存在很有帮助,因为你经常会在命令输出中看到它。
kubectl apply -f deployment.yaml
Kubernetes 会确认:deployment.apps/nginx-deployment created。
Deployment(Manager)会立即开始创建 3 个 Pod。要快速查看这些 Pod,运行:
kubectl get pods
你应该会看到 3 个不同的 Pod,它们的名称都以 nginx-deployment- 开头:
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-8j64w 1/1 Running 0 5s
nginx-deployment-66b6c48dd5-d95l2 1/1 Running 0 5s
nginx-deployment-66b6c48dd5-lzr5w 1/1 Running 0 5s
你还可以检查 Deployment 自身的状态:
kubectl get deployments
输出中应显示 READY 3/3,这表示所请求的 3 个副本都已启动并正在运行。
测试自愈
Kubernetes 最强大的功能之一是 自愈(Self-Healing)。Deployment 会确保 Pod 的实际数量始终与期望数量(3)一致。如果某个 Pod 消失,Deployment 会立即替换它。
这是因为 Kubernetes 会持续将实际状态与期望状态进行协调。删除一个 Pod 不会改变 Deployment 中保存的期望副本数,因此系统会将这次删除视为状态偏差,并创建一个替代 Pod。
现在手动删除一个 Pod,测试这一机制。
首先,再次列出 Pod:
kubectl get pods
复制其中 一个 Pod 的完整名称,例如 nginx-deployment-66b6c48dd5-8j64w。
然后删除这个 Pod:
kubectl delete pod <paste-pod-name-here>
Kubernetes 会提示该 Pod 已删除。立即再次运行 kubectl get pods:
kubectl get pods
你会看到以下现象:
- 旧 Pod 正在终止(或已经消失)。
- 一个名称不同、Age 很短的新 Pod 已经出现,例如 Age 为 2 秒。
Deployment 发现少了一个工作 Pod,于是立即创建了新的 Pod,使团队规模保持为 3。这样,即使单个服务器或容器发生故障,应用仍能保持在线。
扩展
假设你的网站越来越受欢迎。3 台 Web 服务器已经不够了,你需要 5 台。你是否需要手动创建新文件,或者急忙手动创建 Pod?
扩展 Deployment 会修改声明的期望数量,而不只是修改当前正在运行的进程集合。因此,这个新规模不会只在一次手动操作后生效。控制器会持续将更新后的副本数视为目标,直到你再次修改它。
不需要。你只需告诉 Manager 增加数量。
使用 kubectl scale 命令,可以动态更新副本数。
将副本数从 3 改为 5:
kubectl scale deployment/nginx-deployment --replicas=5
现在观察扩展过程:
kubectl get pods
此时你应该会看到 5 个正在运行的 Pod。Kubernetes 启动了两个新 Pod,以满足新的数量要求。
你也可以缩减副本数。如果流量下降,可以减少 Pod 数量来节省资源:
kubectl scale deployment/nginx-deployment --replicas=2
再次运行 kubectl get pods,你会看到 Kubernetes 终止多余的 Pod,直到只剩下 2 个。
这就是企业喜欢 Kubernetes 动态扩展能力的原因。
总结
在本实验中,你学习了 Deployment,也就是负责保持应用运行的智能管理器。
你已成功完成以下操作:
- 创建了一个包含 3 个工作 Pod 的 Deployment。
- 验证了 Deployment 会自动替换故障 Pod(自愈)。
- 使用一条命令增加和减少副本数量(扩展)。
现在你已经了解了为什么我们很少直接创建独立 Pod。Deployment 提供了可靠性和灵活性,并负责处理调度和重启等复杂工作,让你无需手动完成这些操作。


