扩缩容
学习目标
- 掌握手动扩缩容的方法
- 理解自动扩缩容(HPA)
- 掌握扩缩容的最佳实践
核心概念
手动扩容
# 方式一:命令行
$ 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...