腾讯云国际站:如何配置Pod水平自动伸缩(HPA)?

本文由【云老大】 TG@yunlaoda360 撰写

1. 确保先决条件满足

  • 启用 metrics server :HPA 需要获取容器的资源使用指标(如 CPU、内存等)来判断是否需要扩缩容。metrics server 是一个集群组件,它收集这些指标数据并提供给 Kubernetes API 服务器。可以通过以下命令检查 metrics server 是否正在运行:
  • 在 Kubernetes 集群里,登录到主控节点(Master Node)执行 kubectl get pods -n kube-system | grep metrics-server ,如果有 metrics - server 相关的 Pod 处于运行状态(Running),说明已经安装并运行了 metrics server。
  • 如果没有安装,可以使用以下命令安装(以在 k8s 1.18 + 版本为例,基于 kubectl apply 安装): kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml 。 安装完成后,再次运行上述检查命令,等待其状态变为 Running。

2. 创建 HPA 资源对象

  • 通过 YAML 文件创建
  • 创建一个 YAML 文件(如 hpa-demo.yaml),内容如下:
  • yaml
  • apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <hpa-name> # 自定义 HPA 名称 namespace: <namespace-name> # 指定命名空间,如 default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment # 或者 StatefulSet 等可伸缩的控制器类型 name: <target-deployment-name> # 目标 Deployment 的名称,即要对哪个 Deployment 下的 Pod 进行伸缩 minReplicas: <minimum-replicas> # 设置最小副本数 maxReplicas: <maximum-replicas> # 设置最大副本数 metrics: - type: Resource resource: name: cpu # 或 memory 等资源类型 target: type: Utilization # 或 AverageValue averageUtilization: <target-utilization-percentage> # 目标资源利用率百分比,例如 70 表示 70%
    • 例如,要对名为 “nginx - deployment” 的 Deployment(在 default 命名空间下)进行 HPA 配置,将其 CPU 利用率目标设置为 50%,最小副本数为 2,最大副本数为 10,YAML 文件内容可以是:
  • yaml
  • apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
    • 使用命令 kubectl apply -f hpa-demo.yaml 应用此配置文件,创建 HPA 资源对象。
  • 通过命令行创建(简要方式)
  • 也可以直接使用 kubectl 命令创建 HPA,命令格式如下: kubectl autoscale deployment/<target-deployment-name> --cpu-percent=<target-utilization-percentage> --min=<minimum-replicas> --max=<maximum-replicas> -n <namespace-name>
  • 例如: kubectl autoscale deployment/nginx-deployment --cpu-percent=50 --min=2 --max=10 -n default 。 这个命令的作用与上述 YAML 文件方式创建 HPA 相同,都是针对 nginx - deployment,设置 CPU 利用率目标为 50%,最小副本数 2,最大副本数 10,在 default 命名空间下创建 HPA。

3. 验证 HPA 是否正常工作

  • 查看 HPA 状态
  • 执行命令 kubectl get hpa -n <namespace-name> 查看 HPA 的状态。例如,kubectl get hpa -n default 。
  • 输出示例(以针对 nginx - deployment 的 HPA 为例):
  • NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE nginx-hpa Deployment/nginx-deployment 30%/50% 2 10 2 5m
    • 其中,“TARGETS” 表示当前实际资源利用率(这里以 CPU 为例)与目标利用率的比例。在这个例子中,当前实际 CPU 利用率为 30%,目标是 50%。如果实际利用率超过目标值,HPA 会开始扩容操作;如果低于目标值,可能会根据配置进行缩容。
  • 测试扩缩容功能
  • 可以通过模拟负载来测试 HPA 是否正常工作。例如,对于一个 Web 服务的 Deployment,可以使用工具(如 JMeter、Locust 等)发送大量 HTTP 请求来增加负载。
  • 当负载增加导致 CPU 或内存利用率超过 HPA 配置的目标值时,HPA 会自动增加 Pod 的副本数量。通过再次执行 kubectl get hpa 命令和 kubectl get pods -n <namespace-name> 命令,可以观察到副本数量的变化。同样地,当负载降低后,HPA 会根据实际情况减少副本数量,以优化资源利用。

4. 配置其他指标类型(可选但常见)

  • 基于自定义指标的 HPA
  • 如果需要根据自定义指标(如每秒请求数、队列长度等)进行扩缩容,需要先设置好自定义指标的收集和适配。这通常需要使用 Kubernetes 的 Custom Metrics API 和适配器(如 Prometheus Adapter 等)。
  • 假设已经配置好了自定义指标适配器,并且有一个名为 “http_requests_per_second” 表示每秒 HTTP 请求数的指标,可以按照以下方式修改 HPA 的 YAML 配置:
  • yaml
  • apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa-custom namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Pods # 基于每个 Pod 的指标 pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 100 # 目标平均每秒请求数
    • 应用此配置后,HPA 就会根据每个 Pod 的 http_requests_per_second 指标的平均值来进行扩缩容操作。当平均值超过 100 时,会触发扩容;低于 100 时,可能会触发缩容。
  • 基于外部指标的 HPA
  • 外部指标是指与集群内部资源无关的指标,例如外部系统的数据(如消息队列的消息数量等)。同样需要配置好外部指标适配器。
  • 例如,有一个名为 “rabbitmq_messages” 表示 RabbitMQ 消息队列中消息数量的外部指标,配置如下:
  • yaml
  • apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: nginx-hpa-external namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: rabbitmq_messages target: type: Value value: 500 # 目标消息数量
    • 当 RabbitMQ 消息队列中的消息数量超过 500 时,HPA 会触发扩容操作,以便处理更多的消息;当消息数量低于 500 时,可能会触发缩容操作。
原文链接:,转发请注明来源!