请启用 Javascript 以查看内容

Kubernetes HPA (Horizontal Pod Autoscaler) 测试与配置

 ·  ☕ 4 分钟  ·  ✍ CNSRE · 👀... 阅读

作者: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 的响应行为。

前置条件

  1. 已配置的 Kubernetes 集群。
  2. 已部署的应用程序(如 hpatest 部署)。
  3. 安装 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

验证安装:

1
stress --version

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 副本数。

行为记录

  1. 初始状态:副本数为 2,目标 CPU 和内存利用率在 60% 以下。
1
hpatest-hpa     Deployment/hpatest   cpu: 31%/60%, memory: 15%/60%   2         4         2          1m
  1. 负载增加:HPA 检测到 CPU 和内存利用率超过 60%,扩容至 3。
1
hpatest-hpa     Deployment/hpatest   cpu: 66%/60%, memory: 44%/60%   2         4         3          2m
  1. 负载平稳:当负载下降,利用率回到目标以下,缩容回 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。

注意事项

  1. Metrics Server 必须正常运行。
  2. 目标部署的资源限制需合理设置,否则可能影响 HPA 的计算。
  3. 可调整 HPA 的冷却时间参数(如 stabilizationWindowSeconds),以减少频繁扩缩容。


作者:SRE运维博客
博客地址:https://www.cnsre.cn/
文章地址:https://www.cnsre.cn/posts/241204125029/
相关话题:https://www.cnsre.cn/tags/k8shpa/

您的鼓励是我最大的动力
alipay QR Code
wechat QR Code

Avatar
作者
CNSRE
一位只会重启的运维


目录