Kubernetes HPA 未伸缩:调试指南
Source: Dev.to
照片作者:Ibrahim Yusuf,来源:Unsplash
介绍
在生产环境中,按需扩展的能力对性能和可靠性至关重要。HPA 是实现这一目标的核心组件,但当它无法正常工作时,诊断问题可能相当具有挑战性。阅读完本文后,您将能够:
- 理解 HPA 可能无法扩展的原因。
- 按照清晰的逐步故障排除工作流程进行操作。
- 应用最佳实践,防止未来的扩展问题。
理解问题
典型的非伸缩 HPA 症状包括:
- Pod 未按预期进行扩容或缩容。
- HPA 未对 CPU、内存或自定义指标的变化作出响应。
- HPA 控制器日志中出现错误。
真实案例: 一场营销活动导致流量激增,但 Pod 仍保持原始副本数,导致延迟飙升并可能出现宕机。要解决此问题,需要了解 HPA 的内部工作原理以及影响其决策的组件。
前置条件
- 对 Kubernetes 和 HPA 的基本了解。
- 已启用 HPA 功能门的 Kubernetes 集群。
- 已安装并配置好与集群通信的
kubectl。 - 用于编辑 YAML 清单的文本编辑器或 IDE。
- 可访问终端/命令提示符。
Step‑by‑Step Solution
Step 1: Diagnosis
-
检查 HPA 对象
kubectl get hpa -A -
检查 Pod 健康状态
kubectl get pods -A -
查找非 Running 状态的 Pod
kubectl get pods -A | grep -v Running -
查看 HPA 事件和控制器日志
kubectl describe hpa -n <namespace> <hpa-name># 如果可以访问 controller manager 的日志 kubectl logs -n kube-system -l component=horizontal-pod-autoscaler查找类似 “failed to get metrics” 或 “unable to scale” 的警告信息。
Step 2: Implementation (Creating a Correct HPA)
下面是一个最小化的 Deployment 示例以及匹配的 HPA。根据你的工作负载自行调整资源请求/限制和指标目标。
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
labels:
app: example
spec:
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example
image: example/image:latest
resources:
requests:
cpu: 100m
limits:
cpu: 200m
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: example-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: example-deployment
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50 # 根据需要调整
关键点
- 使用
scaleTargetRef(而不是selector)将 HPA 指向对应的 Deployment。 - 确保 Deployment 的 Pod 模板包含相同的标签(
app: example)。 - 设置合理的
requests/limits,以便 HPA 能正确计算利用率。 - 选择合适的
averageUtilization(如有需要,也可以使用自定义指标)。
Step 3: Verify the HPA Works
-
应用清单文件
kubectl apply -f deployment-and-hpa.yaml -
产生负载(例如使用
hey或wrk),使 CPU 使用率超过目标值。 -
观察 HPA 状态
kubectl get hpa example-hpa -w当指标超过阈值时,你应该看到
CURRENT副本数随之增加。
最佳实践与常见陷阱
| 陷阱 | 产生原因 | 解决办法 |
|---|---|---|
| 缺少资源请求 | HPA 在没有请求值的情况下无法计算利用率。 | 定义 resources.requests.cpu(如有需要,还包括内存)。 |
scaleTargetRef 不正确 | HPA 指向错误的对象,导致不进行伸缩。 | 确认 apiVersion、kind 和 name 与目标工作负载匹配。 |
| 未安装 Metrics Server | HPA 无法获取 CPU/内存指标。 | 部署 Metrics Server(kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml)。 |
maxReplicas 设置过低 | HPA 在满足需求之前已达到上限。 | 将 maxReplicas 设置得足够高,以应对预期的峰值。 |
| Pod 中断预算阻止缩容 | PDB 阻止 Pod 终止,导致 HPA 认为无法缩容。 | 根据需要调整 PDB 的 minAvailable 或 maxUnavailable。 |
| 未暴露自定义指标 | 使用自定义指标的 HPA 静默失败。 | 确保自定义指标 API(例如 Prometheus Adapter)已正确配置并暴露指标。 |
利用率: 50
kubectl apply -f example.yaml
验证
要验证 HPA 设置是否正常工作,请运行:
kubectl get hpa example-hpa -o yaml
这将显示当前的 HPA 配置,包括副本数量。
您也可以检查 Pod 状态:
kubectl get pods -A
完整 Manifest 示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: example-deployment
spec:
replicas: 3
selector:
matchLabels:
app: example
template:
metadata:
labels:
app: example
spec:
containers:
- name: example
image: example/image
resources:
requests:
cpu: 100m
limits:
cpu: 200m
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: example-hpa
spec:
selector:
matchLabels:
app: example
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
---
apiVersion: v1
kind: Service
metadata:
name: example-service
spec:
selector:
app: example
ports:
- name: http
port: 80
targetPort: 8080
type: LoadBalancer
此清单会创建一个拥有 3 个副本的 Deployment、一个目标为 CPU 利用率 50 % 的 HPA,以及一个将 Pod 暴露出来的 LoadBalancer 类型 Service。
Common Pitfalls and How to Avoid Them
- 资源不足 – 确保集群拥有足够的容量以实现扩展。
- 指标错误 – 核实 HPA 使用的是正确的指标(CPU、内存或自定义)。
- 监控不足 – 设置告警,以便及早发现 HPA 的问题。
- 标签不一致 – 保持 Deployment 与 HPA 的标签同步,确保控制器能够匹配。
- 测试不足 – 模拟负载以确认 HPA 按预期工作。
最佳实践摘要
- 将 resource‑based 和 custom metrics 结合用于响应式扩缩容。
- 监控 HPA 状态和 pod 性能,持续进行。
- 在资源之间使用 consistent labels and annotations。
- 测试 在真实工作负载下的扩缩容行为。
- 部署 load balancer or ingress controller,以均匀分配流量。
结论
我们检查了 HPA 可能无法扩缩的常见原因,并提供了逐步的故障排除指南。遵循最佳实践建议,您可以确保 Kubernetes 集群高效扩缩,为用户提供可靠的使用体验。
进一步阅读
- Kubernetes 部署策略 – 滚动更新、蓝绿、金丝雀等。
- Kubernetes 网络 – Pods、Services、Ingress 控制器。
- Kubernetes 安全 – 网络策略、Secrets、RBAC。
🚀 提升你的 DevOps 技能
想要精通 Kubernetes 故障排除吗? 查看以下资源:
📚 推荐工具
📖 课程与书籍
- Kubernetes Troubleshooting in 7 Days – 步骤式邮件课程($7)。
- Kubernetes in Action – 权威指南(亚马逊)。
- Cloud Native DevOps with Kubernetes – 生产实践最佳方案。
📬 保持更新
订阅 DevOps Daily Newsletter 可获得:
- 每周精选 3 篇文章
- 生产事故案例研究
- 独家故障排除技巧
觉得有帮助吗?分享给你的团队!
原文发布于 aicontentlab.xyz.
