HPA基于自定义指标弹性伸缩

3,794 阅读3分钟

概念

HPA说明

HPA(Horizontal Pod Autoscaler)是kubernetes的一种资源对象,能够根据某些指标对在Statefulset、Replicacontroller、Replicaset等集合中的pod数量进行动态伸缩,使运行在上面的服务对指标的变化有一定的自适应能力。

HPA目前支持四种类型的指标,分别是Resource、Object、External、Pods。其中在稳定版本autoscaling/v1只支持对CPU指标的动态伸缩,在测试版本autoscaling/v2beta2中支持memory和自定义指标的动态伸缩,并以annotation的方式工作在autoscaling/v1版本中。

注意:Pod的自动缩放不适用于无法缩放的对象。

HPA的API有三个版本:

root@qkethd:~# kubectl api-versions | grep autoscal
autoscaling/v1
autoscaling/v2beta1
autoscaling/v2beta2
  • autoscaling/v1:只支持基于CPU指标的缩放。
  • autoscaling/v2beta1:支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)的缩放。
  • autoscaling/v2beta2:支持Resource Metrics(资源指标,如pod的CPU)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放。

度量指标详细说明

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
  namespace: default
spec:
  # HPA的伸缩对象描述,HPA会动态修改该对象的pod数量
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  # HPA的最小pod数量和最大pod数量
  minReplicas: 1
  maxReplicas: 10
  # 监控的指标数组,支持多种类型的指标共存
  metrics:
  # Object类型的指标
  - type: Object
    object:
      metric:
        # 指标名称
        name: requests-per-second
      # 监控指标的对象描述,指标数据来源于该对象
      describedObject:
        apiVersion: networking.k8s.io/v1beta1
        kind: Ingress
        name: main-route
      # Value类型的目标值,Object类型的指标只支持Value和AverageValue类型的目标值
      target:
        type: Value
        value: 10k
  # Resource类型的指标
  - type: Resource
    resource:
      name: cpu
      # Utilization类型的目标值,Resource类型的指标只支持Utilization和AverageValue类型的目标值
      target:
        type: Utilization
        averageUtilization: 50
  # Pods类型的指标
  - type: Pods
    pods:
      metric:
        name: packets-per-second
      # AverageValue类型的目标值,Pods指标类型下只支持AverageValue类型的目标值
      target:
        type: AverageValue
        averageValue: 1k
  # External类型的指标
  - type: External
    external:
      metric:
        name: queue_messages_ready
        # 该字段与第三方的指标标签相关联
        selector:
          matchLabels:
            env: "stage"
            app: "myapp"
      # External指标类型下只支持Value和AverageValue类型的目标值
      target:
        type: AverageValue
        averageValue: 30
  • metrics中target字段:target总共有3种类型:Utilization、Value、AverageValue。
    • Utilization:表示平均使用率
    • Value:表示实际值
    • AverageValue:表示平均值
  • metrics中type字段:type字段总共有4种类型:Object、Pods、Resource、External。
    • Object:这里指的是指定kubernetes内部对象的指标,数据需要第三方adapter提供,只提供Value和AverageValue类型的目标值(需配置DescribeObject,该项未必填项,租需要填apiVersion、kind(必填)、name(必填))。
    • Pods:这里指的是伸缩对象(Deployment、StagefulSet、ReplicaController、ReplicaSet)底下的Pods的指标,数据需要第三方的adapter提供。
    • Resource:这里指的是当前伸缩对象下的pod的cpu和memory指标,只支持Utilization和AverageValue类型的目标值。
    • External:这里指的是kubernetes外部的指标,数据需要第三方的adapter提供,只支持Value和AverageValue类型的目标值(需要external.metrics.k8s.io的实现,需要自己去实现)

原理架构

截图.png

K8s metrics API

hpa controller可通过以下api来获取指标实现自动扩容:

  • metrics.k8s.io(resource metric api),用于hpa 中Resource类型数据来源. 已有实现:
  • custom.metrics.k8s.io (custom metrics api),用于hpa 中object/pods类型的数据来源,需要自己实现适配器(custom metrics adapters) 已有实现:
  • external.metrics.k8s.io (external metrics api),用于 hpa 中external类型的数据来源,同样需要云厂商或平台自己实现适配器(custom metrics adapters),已有实现:

参考资料

  1. v1-17.docs.kubernetes.io/zh/docs/tas…
  2. zhuanlan.zhihu.com/p/45646697