本文主要介绍创建指标伸缩时,通过 YAML 方式定义 HPA(Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)的自定义指标,并进行弹性伸缩的操作步骤。
默认情况下,HPA (Horizontal Pod Autoscaler,水平 Pod 弹性伸缩)只支持基于 CPU 和内存的自动扩缩容,并不能满足复杂业务的诉求。通过在集群中开启云原生观测接入,可以监控、采集和查询集群中组件的各项指标。配合 prometheus-adapter 组件即可通过这些指标实现工作负载的自动扩缩容,使得业务负载可以更好地按需扩展,保证稳定性并平衡成本。
使用自定义指标进行弹性伸缩主要分为三个步骤:
默认情况下,系统中的 HPA 组件无法识别托管 Prometheus 中采集到的原始指标。因此,需要使用 prometheus-adapter 组件进行指标映射,将托管 Prometheus 中的原始指标映射为自定义指标,然后 HPA 组件才能识别和使用。
prometheus-adapter 组件安装完成后,会在集群的kube-system
命名空间下新增配置项prometheus-adapter-config
,用于记录预置的指标映射关系,配置项中的参数样式如下所示:
rules: - seriesQuery: 'container_network_receive_bytes_total' resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: {as: 'k8s_pod_network_receive_throughput'} metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>,cluster="ccmketollk1b***",pod!=""}[1m])) by (<<.GroupBy>>) / 125000.0'
映射配置中的参数说明,如下表所示。
参数 | 说明 |
---|---|
seriesQuery | 托管 Prometheus 中的原始指标,支持配置标签,例如container_network_receive_bytes_total{cluster="ccm5pq1j5i7***"} |
| 将 Kubernetes 原生资源映射为托管 Prometheus 中指标的标签,其中:
说明 您可以通过 |
name | 自定义指标名称,例如k8s_pod_network_receive_throughput ,该自定义指标支持在 HPA 中使用。 |
| 聚合托管 Prometheus 中指标的查询语句。其中:
|
注意
为了避免 prometheus-adapter 查询的指标量过大,seriesQuery
和metricsQuery
建议配置过滤标签。同时,由于托管 Prometheus 的工作区可以对接多个集群,因此为查询参数配置标签时务必添加集群标签。
配置自定义指标后,您可以通过kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/" | jq .
命令查看自定义指标。
{ "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "custom.metrics.k8s.io/v1beta2", "resources": [ { "name": "pods/k8s_pod_network_receive_throughput", "singularName": "", "namespaced": true, "kind": "MetricValueList", "verbs": [ "get" ] }, { "name": "namespaces/k8s_pod_network_receive_throughput", "singularName": "", "namespaced": false, "kind": "MetricValueList", "verbs": [ "get" ] } ] }
您可以通过kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta2/namespaces/kube-system/pods/*/k8s_pod_network_receive_throughput" | jq .
查询kube-system
命名空间下所有 Pod 的入带宽指标。
{ "kind": "MetricValueList", "apiVersion": "custom.metrics.k8s.io/v1beta2", "metadata": {}, "items": [ { "describedObject": { "kind": "Pod", "namespace": "kube-system", "name": "coredns-59f55659db-s94hm", "apiVersion": "/v1" }, "metric": { "name": "k8s_pod_network_receive_throughput", "selector": null }, "timestamp": "2024-04-12T10:13:04Z", "value": "1m" }, { "describedObject": { "kind": "Pod", "namespace": "kube-system", "name": "metrics-server-6c487585c5-fl792", "apiVersion": "/v1" }, "metric": { "name": "k8s_pod_network_receive_throughput", "selector": null }, "timestamp": "2024-04-12T10:13:04Z", "value": "18m" } // ... ] }
说明
请将 prometheus-adapter 组件升级至 v1.1.0 及以上版本。如使用旧版本,则需要确保安装 prometheus-adapter 组件时配置的托管 Prometheus 工作区与集群绑定的托管 Prometheus 工作区一致。否则 prometheus-adapter 组件将无法正常转换数据。
kube-system
命名空间下找到prometheus-adapter-config
配置项,在 操作 栏中单击 编辑 Yaml,增加自定义指标的映射关系,本文以container_network_receive_bytes_total
指标为例,自定义指标名称为k8s_pod_network_receive_throughput
。rules: - seriesQuery: 'container_network_receive_bytes_total' resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: {as: 'k8s_pod_network_receive_throughput'} metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>,cluster="ccmketollk1b***",pod!=""}[1m])) by (<<.GroupBy>>) / 125000.0'
apiVersion: apps/v1 kind: Deployment metadata: name: workload-demo namespace: default spec: replicas: 1 selector: matchLabels: app: workload-demo template: metadata: labels: app: workload-demo spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
metrics.type
指定为Pods
。metrics.pods.metric.name
为上文中配置的自定义指标名称,即k8s_pod_network_receive_throughput
。metrics.pods.target.type
指定为AverageValue
类型。metrics.pods.target.averageValue
指定为触发扩容行为的阈值。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-demo spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: workload-demo minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: k8s_pod_network_receive_throughput # 配置为自定义指标名称 target: type: AverageValue # AverageValue 类型的目标值,Pod 指标类型下只支持 AverageValue 类型的目标值 averageValue: 20 # 配置 HPA 触发阈值
...
> 更新。预期返回结果如下,Deployment 的副本数扩容到 2。kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-demo Deployment/workload-demo 23/20m 1 10 2 62s
预期返回结果如下,Deployment 的副本数缩容到 1。kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE hpa-demo Deployment/workload-demo 0/20m 1 10 1 20m