HPA 识别 external metric

使用 kubernetes 的运维,一定都会遇到需要配置 hpa(Horizontal Pod Autoscaling) 的时候,毕竟现在使用 kubernetes 其中一方面很大程度都是为了在业务低谷期通过 auto-scaling 省钱。

但是 kubernetes 内置的 metric 只能支持使用 CPU + memory,只有这两个 metric 肯定不足以满足现在这个时代这么复杂的需求,于是 external metric 出现了。

HPA 如何使用 external metric

这里以 KEDA 举例子(一个可以支持 scale to zero 的工具)。

按照 KEDA 官方文档使用 helm 安装完毕以后,可以在命令行敲一个:

$ kubectl get apiservices | grep keda

v1beta1.external.metrics.k8s.io        keda/keda-operator-metrics-apiserver    True        145d

这里的 v1beta1.external.metrics.k8s.io 就是 kubernetes hpa 会通过这个 api 来获取 external metric。按照官网定义的,hpa 默认每 15s 会从 kube-controller-manager 获取 metric。

这个 apiservice 对象 yaml 为:

apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  annotations:
    meta.helm.sh/release-name: keda
    meta.helm.sh/release-namespace: keda
  labels:
    app.kubernetes.io/component: operator
    app.kubernetes.io/instance: keda
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: v1beta1.external.metrics.k8s.io
    app.kubernetes.io/part-of: keda-operator
    app.kubernetes.io/version: 2.16.1
    helm.sh/chart: keda-2.16.1
  name: v1beta1.external.metrics.k8s.io
spec:
  caBundle: ....
  group: external.metrics.k8s.io
  groupPriorityMinimum: 100
  service:
    name: keda-operator-metrics-apiserver
    namespace: keda
    port: 443
  version: v1beta1
  versionPriority: 100

可以看到这里的 apiservice 最后会路由到一个 KEDA 的 svc 上,这个 svc 最后才是实际上用来提供 external metric 的地方,这一套流程 Prometheus、Datadog 也都是一样,且这些使用 external metric 的工具,最后必须创建一个 name 为:v1beta1.external.metrics.k8s.io 的 api service,这就导致如果想要切换 external metric 只能先卸载再重装 🫠