Kubernetes HPA 未伸缩:调试指南

发布: (2026年2月16日 GMT+8 16:01)
9 分钟阅读
原文: Dev.to

Source: Dev.to

Kubernetes HPA 未扩展:调试指南的封面图

Sergei

照片作者: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

  1. 检查 HPA 对象

    kubectl get hpa -A
  2. 检查 Pod 健康状态

    kubectl get pods -A
  3. 查找非 Running 状态的 Pod

    kubectl get pods -A | grep -v Running
  4. 查看 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

  1. 应用清单文件

    kubectl apply -f deployment-and-hpa.yaml
  2. 产生负载(例如使用 heywrk),使 CPU 使用率超过目标值。

  3. 观察 HPA 状态

    kubectl get hpa example-hpa -w

    当指标超过阈值时,你应该看到 CURRENT 副本数随之增加。

最佳实践与常见陷阱

陷阱产生原因解决办法
缺少资源请求HPA 在没有请求值的情况下无法计算利用率。定义 resources.requests.cpu(如有需要,还包括内存)。
scaleTargetRef 不正确HPA 指向错误的对象,导致不进行伸缩。确认 apiVersionkindname 与目标工作负载匹配。
未安装 Metrics ServerHPA 无法获取 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 的 minAvailablemaxUnavailable
未暴露自定义指标使用自定义指标的 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‑basedcustom metrics 结合用于响应式扩缩容。
  • 监控 HPA 状态和 pod 性能,持续进行。
  • 在资源之间使用 consistent labels and annotations
  • 测试 在真实工作负载下的扩缩容行为。
  • 部署 load balancer or ingress controller,以均匀分配流量。

结论

我们检查了 HPA 可能无法扩缩的常见原因,并提供了逐步的故障排除指南。遵循最佳实践建议,您可以确保 Kubernetes 集群高效扩缩,为用户提供可靠的使用体验。

进一步阅读

  • Kubernetes 部署策略 – 滚动更新、蓝绿、金丝雀等。
  • Kubernetes 网络 – Pods、Services、Ingress 控制器。
  • Kubernetes 安全 – 网络策略、Secrets、RBAC。

🚀 提升你的 DevOps 技能

想要精通 Kubernetes 故障排除吗? 查看以下资源:

📚 推荐工具

  • Lens – 让调试提升 10 倍的 Kubernetes IDE。
  • k9s – 基于终端的 Kubernetes 仪表盘。
  • Stern – 多 Pod 日志实时追踪。

📖 课程与书籍

  • Kubernetes Troubleshooting in 7 Days – 步骤式邮件课程($7)。
  • Kubernetes in Action – 权威指南(亚马逊)。
  • Cloud Native DevOps with Kubernetes – 生产实践最佳方案。

📬 保持更新

订阅 DevOps Daily Newsletter 可获得:

  • 每周精选 3 篇文章
  • 生产事故案例研究
  • 独家故障排除技巧

觉得有帮助吗?分享给你的团队!

原文发布于 aicontentlab.xyz.

0 浏览
Back to Blog

相关文章

阅读更多 »