本文介绍如何通过更改副本数,手动对 Deployment 执行水平扩缩。 手动扩缩使你能够直接控制正在运行的 Pod 数量,以应对可预测的负载变化或进行成本管理。
这不同于垂直扩缩:垂直扩缩保持副本数不变,而调整每个 Pod 可用的资源量。
你必须拥有一个 Kubernetes 的集群,且必须配置 kubectl 命令行工具让其与你的集群通信。 建议运行本教程的集群至少有两个节点,且这两个节点不能作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面的 Kubernetes 练习环境之一:
你需要一个已有的 Deployment。如果你还没有 Deployment,只是想进行练习, 可以按照使用 Deployment 运行无状态应用创建 nginx Deployment:
kubectl apply -f https://k8s.io/examples/application/deployment.yaml
验证该 Deployment 运行了两个 Pod:
kubectl get deployment nginx-deployment
输出类似于:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 2/2 2 2 10s
可以通过多种方式更改已有 Deployment 的副本数。
kubectl scale 扩容使用 kubectl scale 设置副本数:
kubectl scale deployment/nginx-deployment --replicas=4
输出类似于:
deployment.apps/nginx-deployment scaled
验证该 Deployment 有四个 Pod:
kubectl get deployment nginx-deployment
输出类似于:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 4/4 4 4 1m
kubectl apply 声明式扩缩除了运行命令式命令,你还可以更新清单文件并应用它。 这种方法适合采用版本控制管理配置的工作流程。
将当前 Deployment 配置保存到本地文件:
kubectl get deployment nginx-deployment -o yaml > /tmp/nginx-deployment.yaml
编辑 /tmp/nginx-deployment.yaml,将 .spec.replicas 改为 4。
应用前,将本地变更与集群状态进行比较:
kubectl diff -f /tmp/nginx-deployment.yaml
应用编辑后的清单:
kubectl apply -f /tmp/nginx-deployment.yaml
要减少 Pod 数量,请将 --replicas 设置为较小的值:
kubectl scale deployment/nginx-deployment --replicas=2
Kubernetes 会优雅地终止多余的 Pod,并遵从每个 Pod 的 terminationGracePeriodSeconds 设置。
验证该 Deployment 有两个 Pod:
kubectl get pods -l app=nginx
输出类似于:
NAME READY STATUS RESTARTS AGE
nginx-deployment-66b6c48dd5-7gl6h 1/1 Running 0 2m
nginx-deployment-66b6c48dd5-v8mkd 1/1 Running 0 2m
你可以将 Deployment 缩容至零,以暂时暂停工作负载而不删除 Deployment 本身:
kubectl scale deployment/nginx-deployment --replicas=0
验证没有正在运行的 Pod:
kubectl get deployment nginx-deployment
输出类似于:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/0 0 0 5m
缩容至零会删除所有 Pod,但会保留 Deployment 及其 ReplicaSet。
你可以随时将 --replicas 设置为正数来重新扩容。
缩容至零的常见使用场景包括:
除了 kubectl scale,你还可以使用 kubectl edit 或 kubectl patch 更改 .spec.replicas。
kubectl edit 扩缩kubectl edit deployment nginx-deployment
在编辑器中更改 .spec.replicas 字段,然后保存并退出。
kubectl patch 扩缩你可以使用策略合并补丁更新 .spec.replicas:
kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":4}}'
在脚本中,请使用带前置条件测试的 JSON 补丁。 以下命令将副本数设置为 4,但仅在当前副本数为 2 时执行:
kubectl patch deployment nginx-deployment --type=json -p='[
{"op": "test", "path": "/spec/replicas", "value": 2},
{"op": "replace", "path": "/spec/replicas", "value": 4}
]'
如果当前值不匹配,test 操作会导致补丁失败,从而防止多人或多个脚本修改同一 Deployment 时发生意外变更。
| 方面 | 手动扩缩 | 自动扩缩(HPA) |
|---|---|---|
| 最适合的场景 | 可预测、计划内或一次性的负载变化 | 可变或不可预测的需求 |
| 工作方式 | 直接设置 .spec.replicas | HPA 根据观测到的指标调整副本数 |
| 响应时间 | 运行命令后立即响应 | 根据指标稍有延迟地响应 |
| 指标感知 | 无;由你决定副本数 | 监控 CPU、内存或自定义指标 |
| 维护 | 需要手动干预来调整 | 配置后自动运行 |
如果 HorizontalPodAutoscaler 管理某个 Deployment,请不要手动设置副本数。 HPA 会持续协调副本数,并覆盖任何手动变更。
删除 Deployment:
kubectl delete deployment nginx-deployment