作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/241204125029/
相关话题:https://www.cnsre.cn/tags/k8shpa/
Kubernetes HPA (Horizontal Pod Autoscaler) 测试与配置
实验目标
- 验证 Kubernetes HPA 的自动伸缩功能。
- 使用
stress
工具模拟负载,观测 HPA 的响应行为。
前置条件
- 已配置的 Kubernetes 集群。
- 已部署的应用程序(如
hpatest
部署)。
- 安装
kubectl
CLI 工具。
环境信息
- 命名空间:
hpatest
- HPA 名称:
hpatest-hpa
- 目标资源:
Deployment/hpatest
- HPA 配置:
- 最小副本数:2
- 最大副本数:4
- CPU 目标利用率:60%
- 内存目标利用率:60%
安装 HPA
1. 启用 HPA 支持
确保集群支持 HPA。通常,需要启用 Metrics Server:
1
|
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
|
验证 Metrics Server 的工作状态:
1
|
kubectl get apiservices | grep metrics
|
2. 创建 HPA 配置
以下为 HPA 配置示例(保存至 hpa.yaml
文件):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# hpatest Deployment 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: hpatest
namespace: hpatest
labels:
app: hpatest
spec:
replicas: 2
selector:
matchLabels:
app: hpatest
template:
metadata:
labels:
app: hpatest
spec:
containers:
- name: hpatest-container
image: nginx:latest
resources:
requests:
cpu: 1
memory: "2048Mi"
limits:
cpu: 4
memory: "10Gi"
ports:
- containerPort: 80
---
# hpatest HPA 配置
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: hpatest-hpa
namespace: hpatest
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: hpatest
minReplicas: 2
maxReplicas: 4
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 60
|
应用配置:
1
|
kubectl apply -f hpa.yaml
|
实验步骤
1. 监控 HPA 状态
使用以下命令持续观察 HPA 状态:
1
|
kubectl get hpa hpatest-hpa -n hpatest -w
|
1
2
|
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 15%/60% 2 4 2 1m
|
- Targets:当前 CPU 和内存利用率对比目标值。
- Replicas:当前 Pod 副本数。
2. 进入 Pod 并安装负载工具
进入 Pod:
1
|
kubectl exec -it hpatest-<pod-name> -n hpatest -- /bin/bash
|
安装 stress
工具:
1
2
|
curl -O https://dl.fedoraproject.org/pub/epel/8/Everything/x86_64/Packages/s/stress-1.0.4-24.el8.x86_64.rpm
rpm -ivh stress-1.0.4-24.el8.x86_64.rpm
|
验证安装:
3. 模拟负载
在 Pod 中运行以下命令:
1
|
stress --cpu 3 --vm 1 --vm-bytes 6G --vm-keep
|
此命令将生成:
- 3 个 CPU 负载。
- 1 个内存负载(占用 6 GB)。
4. 观察 HPA 的行为
通过监控 HPA 状态,确认是否触发了 Pod 自动伸缩:
示例输出:
1
2
3
4
5
6
7
8
9
10
|
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 15%/60% 2 4 2 1m
hpatest-hpa Deployment/hpatest cpu: 66%/60%, memory: 30%/60% 2 4 2 1m
hpatest-hpa Deployment/hpatest cpu: 66%/60%, memory: 44%/60% 2 4 3 2m
hpatest-hpa Deployment/hpatest cpu: 67%/60%, memory: 45%/60% 2 4 3 2m
hpatest-hpa Deployment/hpatest cpu: 54%/60%, memory: 34%/60% 2 4 3 3m
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 34%/60% 2 4 3 3m
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 37%/60% 2 4 3 3m
....
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 37%/60% 2 4 2 8m
|
- Targets:当前 CPU 和内存利用率对比目标值。
- Replicas:当前 Pod 副本数。
行为记录
- 初始状态:副本数为 2,目标 CPU 和内存利用率在 60% 以下。
1
|
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 15%/60% 2 4 2 1m
|
- 负载增加:HPA 检测到 CPU 和内存利用率超过 60%,扩容至 3。
1
|
hpatest-hpa Deployment/hpatest cpu: 66%/60%, memory: 44%/60% 2 4 3 2m
|
- 负载平稳:当负载下降,利用率回到目标以下,缩容回 2。
1
|
hpatest-hpa Deployment/hpatest cpu: 31%/60%, memory: 37%/60% 2 4 2 8m
|
缩减副本的机制
1. 检查周期:
HPA 默认每隔 15 秒 检查一次负载(可通过 –horizontal-pod-autoscaler-sync-period 参数调整)。每次计算是否需要缩减副本。
2. 稳定性窗口:
为避免频繁扩缩容,HPA 会等待资源使用率 持续低于目标值一段时间 后,才会缩减副本。这个窗口的默认时间为 5 分钟(可通过参数 –horizontal-pod-autoscaler-downscale-stabilization-window 配置)。
3. 缩减逻辑:
• 如果 当前平均资源使用率 持续低于目标值,且当前副本数大于 minReplicas,HPA 将缩减副本。
• 副本数每次减少 1 个,直到达到最小副本数或资源使用率接近目标值。
什么时候会缩减到 2 个副本?
• 条件:CPU 和内存的平均使用率 持续低于 60%,并保持稳定时间超过 5 分钟。
• 结果:在满足上述条件后,HPA 会逐步将副本数减少到最小值(minReplicas: 2)。
实验结果
- 当负载增加时,HPA 根据资源使用率扩容至 3 个副本。
- 负载回落后,HPA 自动将副本数缩减至 2。
注意事项
- Metrics Server 必须正常运行。
- 目标部署的资源限制需合理设置,否则可能影响 HPA 的计算。
- 可调整 HPA 的冷却时间参数(如
stabilizationWindowSeconds
),以减少频繁扩缩容。
作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/241204125029/
相关话题:https://www.cnsre.cn/tags/k8shpa/