24·Deployment进阶

扩缩容

kubernetesdeploymentscale

扩缩容

学习目标

  1. 掌握手动扩缩容的方法
  2. 理解自动扩缩容(HPA)
  3. 掌握扩缩容的最佳实践

核心概念

手动扩容

# 方式一:命令行
$ kubectl scale deployment nginx-deployment --replicas=5

# 方式二:修改 YAML
spec:
  replicas: 5    # 修改这个值

# 方式三:使用 patch
$ kubectl patch deployment nginx-deployment -p '{"spec":{"replicas":5}}'

手动缩容

# 和扩容一样,只是数字变小
$ kubectl scale deployment nginx-deployment --replicas=2

查看扩缩容过程

# 查看 Pod 变化
$ kubectl get pods -w

# 查看 Deployment 状态
$ kubectl get deployment nginx-deployment

# 输出:
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   5/5     5            5           5m

自动扩缩容(HPA)

# hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-deployment
  minReplicas: 2           # 最小副本数
  maxReplicas: 10          # 最大副本数
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70  # CPU 使用率 70% 时扩容

HPA 命令行操作

# 创建 HPA
$ kubectl autoscale deployment nginx-deployment --min=2 --max=10 --cpu-percent=70

# 查看 HPA
$ kubectl get hpa

# 查看 HPA 详情
$ kubectl describe hpa nginx-hpa

# 删除 HPA
$ kubectl delete hpa nginx-hpa

HPA 工作原理

                    ┌──────────────┐
                    │  Metrics     │
                    │  Server      │
                    └──────┬───────┘
                           │ 收集指标
                           ▼
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│  Deployment  │◄───│     HPA      │◄───│   CPU/Memory │
│  调整副本数  │    │  决策是否扩  │    │   使用率     │
└──────────────┘    └──────────────┘    └──────────────┘

CPU > 70% → 扩容
CPU < 70% → 缩容(有冷却时间)

扩缩容状态

# 查看 HPA 状态
$ kubectl get hpa
NAME        REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx-deployment   50%/70%   2         10        3          5m

# TARGETS: 当前值 / 目标值
# 50%/70% 表示当前 CPU 使用率 50%,目标是 70%,所以不会扩容

条件扩缩容

# 基于多个指标
spec:
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80

扩缩容行为配置

spec:
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300  # 缩容冷却时间
      policies:
      - type: Percent
        value: 10                      # 每次最多缩容 10%
        periodSeconds: 60
    scaleUp:
      stabilizationWindowSeconds: 0    # 扩容无冷却
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15

实践练习

练习 1:手动扩缩容

# 1. 创建 Deployment(2 个副本)
$ kubectl create deployment web --image=nginx --replicas=2

# 2. 扩容到 5 个副本
$ kubectl scale deployment web --replicas=5

# 3. 查看 Pod
$ kubectl get pods

# 4. 缩容到 1 个副本
$ kubectl scale deployment web --replicas=1

# 5. 验证
$ kubectl get pods

练习 2:配置 HPA

# 1. 确保安装了 metrics-server
$ kubectl top nodes

# 2. 创建 Deployment
$ kubectl create deployment web --image=nginx

# 3. 创建 HPA
$ kubectl autoscale deployment web --min=2 --max=5 --cpu-percent=50

# 4. 查看 HPA
$ kubectl get hpa

# 5. 产生负载
$ kubectl run -i --tty load-generator --rm --image=busybox -- /bin/sh
$ while true; do wget -q -O- http://web; done

# 6. 观察扩容
$ kubectl get pods -w

练习 3:编写 HPA YAML

编写 HPA 配置:

  • 目标 Deployment:api-server
  • 最小副本:3
  • 最大副本:20
  • CPU 目标:60%
  • Memory 目标:80%

常见问题

1. HPA 不生效

# 检查 metrics-server 是否运行
$ kubectl get pods -n kube-system | grep metrics-server

# 检查 Pod 是否有资源请求
$ kubectl get pod <pod-name> -o yaml | grep -A 5 resources

# HPA 需要 Pod 设置 resources.requests

2. 扩缩容太频繁

# 增加稳定窗口
spec:
  behavior:
    scaleDown:
      stabilizationWindowSeconds: 300  # 5 分钟冷却

3. 扩容太慢

# 调整扩容策略
spec:
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 0
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15

小结

要点说明
手动扩容kubectl scale --replicas=N
手动缩容同上,数字变小
HPA根据指标自动扩缩容
前提条件需要 metrics-server 和 resources.requests
扩缩容行为可配置稳定窗口和策略

练习编辑器

bash
Loading...

继续学习

完成本课后,建议继续学习下一课「滚动更新」 以巩固所学知识。