Kubernetes v1.30.6 环境下 HPA 自动扩缩容完整实践指南
适用版本:Kubernetes v1.30.6 + Metrics Server v0.7.2
场景:自建集群 / 私有云 / 边缘计算环境
目标:实现 HPA 自动扩缩容的端到端落地
Harbor 地址:192.168.1.129:8082(harbor.local.com)
引言
Horizontal Pod Autoscaler(HPA)是 Kubernetes 实现应用弹性伸缩的核心能力,能够根据 CPU、内存或自定义指标自动调整工作负载副本数,从而在保障服务质量的同时优化资源利用率。然而,在自建 Kubernetes 集群(尤其是 v1.24+ 移除 Docker 后)中部署 HPA,常面临 镜像拉取失败、Metrics Server 无法采集指标、TLS 证书验证错误、HPA 状态未知 等一系列问题。
本文基于 Kubernetes v1.30.6 环境,完整演示从 Metrics Server 安装、测试应用部署、HPA 创建到负载压测验证 的全链路操作,并提供各组件的版本兼容性说明与生产级配置建议,助你一次性打通 HPA 落地路径。
一、环境与版本选型(关键前提)
Kubernetes 对组件版本有严格的兼容性要求。针对 v1.30.6,我们选择如下组件:
| 组件 | 推荐版本 | 依据 |
|---|---|---|
| Kubernetes | v1.30.6 | 当前环境 |
| Metrics Server | v0.7.2 | 官方兼容性矩阵 明确支持 v1.29–v1.30 |
| 测试应用 | registry.k8s.io/hpa-example |
官方维护,含 CPU request,适用于所有现代集群 |
| 容器运行时 | containerd ≥ v1.7 | K8s v1.30 推荐版本 |
结论:无需降级或特殊适配,使用官方默认组件即可。
二、部署 Metrics Server(指标采集核心)
HPA 依赖 Metrics Server 提供资源指标(如 CPU 使用率)。
2.1 安装
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml
2.2 修复自建集群 TLS 问题(常见于 kubeadm 部署)
若控制台出现以下错误:
x509: cannot validate certificate for 10.x.x.x because it doesn't contain any IP SANs
说明 kubelet 使用的自签名证书未包含 IP 在 SAN 字段中。
解决方案(测试/开发环境):
kubectl edit deploy metrics-server -n kube-system
在容器 args 中添加:
args:
- --kubelet-preferred-address-types=InternalIP
- --kubelet-insecure-tls # 跳过 kubelet 证书验证
生产环境应使用包含节点 IP SAN 的合规证书。
2.3 验证
kubectl get pods -n kube-system -l k8s-app=metrics-server
kubectl top nodes # 应正常返回 CPU/MEM 使用
三、部署 HPA 测试应用:php-apache
使用 Kubernetes 官方 HPA 示例:
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
该应用关键特性:
- 镜像:
registry.k8s.io/hpa-example - 设置了
resources.requests.cpu: 200m(HPA 必需) - 暴露 Service
php-apache供压测
验证:
kubectl get deploy/php-apache
kubectl describe pod -l run=php-apache | grep -A5 "Requests"
四、创建 HorizontalPodAutoscaler
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
--cpu-percent=50:目标 CPU 利用率为 50%(基于 requests 计算)- 副本数范围:1 ~ 10
查看状态:
kubectl get hpa
正常输出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 20s
若显示
<unknown>/50%,请检查:
- Metrics Server 是否运行正常(
kubectl top pods)- Pod 是否设置了
resources.requests.cpu
五、压测验证自动扩缩容
5.1 启动负载生成器(新开终端)
kubectl run -i --tty load-generator --rm \
--image=busybox:1.28 \
--restart=Never \
-- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
使用
busybox:1.28确保包含wget,避免因镜像变更导致命令缺失。
5.2 实时观察 HPA 行为
kubectl get hpa php-apache --watch
典型扩缩容过程:
TARGETS REPLICAS
0%/50% 1 ← 初始状态
248%/50% 1 ← 负载注入,CPU 飙升
248%/50% 4 ← HPA 扩容(248/50 ≈ 5,受算法平滑)
78%/50% 5 ← 继续扩容
0%/50% 5 ← 停止压测
0%/50% 3 ← 冷却期后开始缩容
0%/50% 1 ← 最终回到最小副本
行为说明:
- 扩容响应较快(秒级)
- 缩容有 默认 5 分钟冷却期(由
--horizontal-pod-autoscaler-downscale-stabilization控制)
5.3 停止压测
在负载终端按 Ctrl + C,Pod 自动清理。
六、私有镜像仓库(Harbor)适配方案
若无法访问 registry.k8s.io,可将镜像同步至本地 Harbor。
6.1 镜像同步
docker pull registry.k8s.io/hpa-example
docker tag registry.k8s.io/hpa-example 192.168.1.129:8082/apps/hpa-example
docker push 192.168.1.129:8082/apps/hpa-example
6.2 配置 containerd 支持 HTTP 仓库
编辑 /etc/containerd/config.toml:
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.129:8082"]
endpoint = ["http://192.168.1.129:8082"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.129:8082".tls]
insecure_skip_verify = true
重启:
systemctl restart containerd
七、常见问题排查清单
| 现象 | 根本原因 | 解决方案 |
|---|---|---|
failed to pull image |
containerd 强制 HTTPS,Harbor 为 HTTP | 配置 insecure_skip_verify = true |
x509: no IP SANs |
kubelet 证书缺失 IP SAN | 添加 --kubelet-insecure-tls |
TARGETS: <unknown>/50% |
1. Metrics Server 异常 2. Pod 无 CPU request |
1. 修复 Metrics Server 2. 补充 resources.requests.cpu |
| HPA 副本不增加 | 负载未达目标利用率 | 用 kubectl top pods 验证实际 CPU |
八、结语与生产建议
本文在 Kubernetes v1.30.6 环境下,完整验证了 HPA 的自动扩缩容能力。HPA 是云原生弹性架构的基石,建议在生产中:
- 避免使用
:latest标签,使用语义化版本镜像 - 合理设置
resources.requests,直接影响 HPA 决策 - 生产环境使用合规 TLS 证书,替代
insecure配置 - 结合 Prometheus Adapter,实现基于 QPS、延迟等自定义指标的扩缩容
通过本次实践,你已掌握 HPA 从部署到验证的完整链路,可将其应用于真实业务系统,实现资源弹性与成本优化的双重目标。
参考链接
本文测试环境:Kubernetes v1.30.6, containerd v1.7.28, Metrics Server v0.7.2