手动水平扩缩 Deployment

手动水平扩缩 Deployment

本文介绍如何通过更改副本数,手动对 Deployment 执行水平扩缩。 手动扩缩使你能够直接控制正在运行的 Pod 数量,以应对可预测的负载变化或进行成本管理。

这不同于垂直扩缩:垂直扩缩保持副本数不变,而调整每个 Pod 可用的资源量。

教程目标

  • 扩容 Deployment 以处理更多流量。
  • 缩容 Deployment 以节省资源。
  • 将 Deployment 缩容至零以暂停工作负载。
  • 了解何时应使用手动扩缩,以及何时应使用 HorizontalPodAutoscaler。

准备开始

你必须拥有一个 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

可以通过多种方式更改已有 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

缩容 Deployment

要减少 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 editkubectl 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.replicasHPA 根据观测到的指标调整副本数
响应时间运行命令后立即响应根据指标稍有延迟地响应
指标感知无;由你决定副本数监控 CPU、内存或自定义指标
维护需要手动干预来调整配置后自动运行

注意:

如果 HorizontalPodAutoscaler 管理某个 Deployment,请不要手动设置副本数。 HPA 会持续协调副本数,并覆盖任何手动变更。

清理现场

删除 Deployment:

kubectl delete deployment nginx-deployment

接下来

最后修改 August 04, 2026 at 9:54 AM PST: [zh] Add scale-deployment.md (77b6d7ce3c)