1. 概述

随着容器编排技术的普及,Kubernetes 已成为主流选择之一。其核心优势之一是能够轻松地对容器化应用进行水平扩缩容(Scaling)。在高并发场景下,应用负载陡增是常态,Kubernetes 提供了多种方式帮助我们快速响应这种变化。

本文将介绍 Kubernetes 中对 Pod 进行扩缩容的多种方法,包括:

  • 使用 YAML 配置文件的声明式方法
  • 使用 kubectl scale 命令的命令式方法
  • 基于条件的扩缩容
  • 同时扩缩容多个 Pod
  • 批量扩缩容所有 Pod

2. 示例环境搭建

在 Kubernetes 中,推荐使用命名空间(Namespace)进行资源隔离。我们先创建一个用于测试的命名空间,并部署两个 Pod:NGINX 和 Redis。

2.1 创建命名空间

使用以下命令创建一个名为 scaling-demo 的命名空间:

kubectl create ns scaling-demo

输出:

namespace/scaling-demo created

2.2 编写 Deployment 配置

创建 nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: scaling-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx:alpine-slim
        name: nginx
        ports:
        - containerPort: 80
          name: nginx

创建 redis.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  namespace: scaling-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - image: redis:alpine
        name: redis
        ports:
        - containerPort: 6379
          name: redis

2.3 应用配置并验证

使用 kubectl apply 创建 Pod:

kubectl apply -f nginx.yaml
kubectl apply -f redis.yaml

查看 Pod 状态:

kubectl get pods --show-labels -n scaling-demo

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE   LABELS
nginx-59c556767c-ncl9k   1/1     Running   0          45s   app=nginx,pod-template-hash=59c556767c
redis-78497c75bd-9jxdw   1/1     Running   0          36s   app=redis,pod-template-hash=78497c75bd

✅ 到此为止,测试环境已准备就绪。


3. 使用声明式方法扩缩容

3.1 修改 YAML 文件并使用 apply

在 YAML 文件中,spec.replicas 字段控制 Pod 副本数。将 nginx.yaml 中的 replicas 改为 2:

spec:
  replicas: 2

应用变更:

kubectl apply -f nginx.yaml

查看 Pod 数量:

kubectl get pods --selector=app=nginx -n scaling-demo

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE
nginx-59c556767c-ncl9k   1/1     Running   0          85s
nginx-59c556767c-nd6rb   1/1     Running   0          7s

✅ 这种方式的优点是可以将配置纳入版本控制,避免配置漂移。

3.2 使用 scale 命令

使用 kubectl scale 可直接修改副本数:

kubectl scale --replicas=1 -f nginx.yaml

查看结果:

kubectl get pods --selector=app=nginx -n scaling-demo

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE
nginx-59c556767c-ncl9k   1/1     Running   0          108s

⚠️ 注意:这种方式不会更新 YAML 文件,容易导致配置不一致。


4. 使用命令式方法扩缩容

4.1 扩容 Pod

直接使用 Deployment 名称进行扩容:

kubectl scale --replicas=2 deployment/nginx -n scaling-demo

验证结果:

kubectl get pods --selector=app=nginx -n scaling-demo

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE
nginx-59c556767c-5vznb   1/1     Running   0          10s
nginx-59c556767c-ncl9k   1/1     Running   0          2m11s

4.2 缩容 Pod

kubectl scale --replicas=1 deployment/nginx -n scaling-demo

验证:

kubectl get pods --selector=app=nginx -n scaling-demo

输出示例:

NAME                     READY   STATUS       RESTARTS   AGE
nginx-59c556767c-5vznb   1/1     Terminating  0          10s
nginx-59c556767c-ncl9k   1/1     Running      0          2m11s

4.3 基于条件的扩缩容

使用 --current-replicas 可以防止误操作:

kubectl scale --current-replicas=1 --replicas=2 deployment/nginx -n scaling-demo

如果当前副本数不是 1,操作会失败:

error: Expected replicas to be 1, was 2

✅ 这个机制可以避免并发操作导致的冲突。

4.4 扩容多个 Pod

一次扩缩容多个 Deployment:

kubectl scale --replicas=3 deployment/nginx deployment/redis -n scaling-demo

验证:

kubectl get pods -n scaling-demo

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE
nginx-59c556767c-ncl9k   1/1     Running   0          16m
nginx-59c556767c-vn96s   1/1     Running   0          11s
nginx-59c556767c-xx5bb   1/1     Running   0          13m
redis-78497c75bd-6gs96   1/1     Running   0          11s
redis-78497c75bd-9jxdw   1/1     Running   0          16m
redis-78497c75bd-l25mf   1/1     Running   0          11s

4.5 批量扩缩容所有 Pod

使用 --all 参数对所有 Deployment 执行操作:

kubectl scale --replicas=1 --all deployment -n scaling-demo

验证:

kubectl get pods -n scaling-demo 

输出示例:

NAME                     READY   STATUS    RESTARTS   AGE
nginx-59c556767c-ncl9k   1/1     Running   0          17m
redis-78497c75bd-9jxdw   1/1     Running   0          17m

⚠️ 注意:使用 --all 时需指定资源类型,如 deploymentrsrcstatefulset


5. 清理资源

使用完测试环境后,及时清理资源,避免资源浪费和冲突:

kubectl delete deployment/nginx deployment/redis -n scaling-demo
kubectl delete namespace scaling-demo

6. 总结

本文介绍了 Kubernetes 中扩缩容 Pod 的多种方式,包括:

方法 描述 适用场景
kubectl apply 修改 YAML 文件后应用变更 推荐用于生产环境
kubectl scale -f 使用 YAML 文件进行扩缩容 快速调整,适合测试
kubectl scale deployment/xxx 命令式扩缩容 快速调试或临时操作
条件扩缩容 使用 --current-replicas 避免冲突 多人协作或自动化场景
批量扩缩容 使用 --all 扩缩容所有资源 管理大量资源时
多资源扩缩容 一次操作多个 Deployment 管理多个服务时

建议: 在生产环境中优先使用声明式方法,确保配置一致性;在测试或调试时可使用命令式方法快速响应变化。



原始标题:Scale Up/Down Kubernetes Pods