目录

kubernetes监控-基于自定义指标的HPA(三)

阿里云 ACK HPA 基于 arms Prometheus 自定义指标的可控弹性伸缩.

简介

前文我们讲述了原生的 kubernetes 使用原生的 Prometheus 进行自定义指标的可控弹性伸缩的内容,这一节,我们来讲讲阿里云 ACKarms Prometheus 自定义指标的可控弹性伸缩1,总体没什么差别,只不过度量指标类型为:External 。前文对度量指标类型有过介绍,具体可以看度量指标类型的介绍

安装

通过阿里云的应用市场安装 arms-Prometheus

安装 ack-alibaba-cloud-metrics-adapter 这个应用

注意

URL 改为 kubernetes 集群里面的有效 url : http://arms-prom-admin.arms-prom.svc:9335/

prometheus.adapter.default: false 默认true

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
AlibabaCloudMetricsAdapter:
  affinity: {}
  annotations: {}
  commonLabels: ""
  env:
  - AccessKeyId: ""
  - AccessKeySecret: ""
  - Region: ""
  fullnameOverride: ""
  image:
    pullPolicy: IfNotPresent
    repository: registry.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64
    tag: v0.2.0-alpha-0c00ec2
  listenPort: 443
  nameOverride: ""
  nodeSelector: {}
  prometheus:
    adapter:
      rules:
        custom: {}
        default: false
    enabled: true
    logLevel: 1
    metricsRelistInterval: 1m
    url: http://arms-prom-admin.arms-prom.svc:9335/
  ramRoleType: restricted
  replicas: 1
  service:
    type: ClusterIP
  serviceAccountName: admin
  tolerations: []

配置

adapter-config 修改掉默认的规则,添加以下的规则,接收从 prometheus 获取的 app_qps_seconds 的值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
data:
  config.yaml: |
    rules:
    - seriesQuery: 'app_qps_seconds{namespace!="",pod_name!=""}'
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
      name:
        matches: "^app_(.*)"
        as: "commerce_developer_service_${1}"
      metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>})    
kind: ConfigMap
metadata:
  name: adapter-config
  namespace: kube-system
信息

app_qps_seconds 是程序暴漏给 Prometheus 的,这个可以跟后端商量好具体要怎么暴露,因为我们是拿真实案例来分享的,而我们的后端程序暴露的该指标是计算好速率后把指标作为 counter 类型暴漏出来的。

因此,我们的自定义规则里面无需再去计算速率,而是直接引用该值,还有我们需要计算的是该服务所有 podqps 总和,所以也是直接用 sum 函数就搞定了。

查看这个 commerce_xxxxx 指标他的 kindpod 还是 namespace

1
`kubectl get --raw /apis/external.metrics.k8s.io/v1beta1`

pod/xxxxxx 说明指标的资源粒度可以到 pod ,然后 namespace=true 则说明可以指定 namespace 的维度筛选

查看 commerce_developer_service_qps_seconds 指标有没有被 Prometheus 抓取

1
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/commerce_developer_service_qps_seconds|jq .

创建 HPA yaml 文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: sample-app
  namespace: commerce
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: sample-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: External
      external:
        metric:
          name: commerce_developer_service_qps_seconds
          selector:
            matchLabels:
              job: "sample-app"
        target:
          type: Value
          value: 500
          # m后缀是小数,1000m = 1

External 类型指标还有一个好处就是前文也提到过的,可以拿 pod2 的指标去扩缩 pod1 2 ,hpa 如下配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: commerce-developer-service
  namespace: commerce
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: commerce-developer-service
  minReplicas: 1
  maxReplicas: 2
  metrics:
    - type: External
      external:
        metric:
          name: commerce_developer_service_qps_seconds
          selector:
            matchLabels:
              标签: 要匹配的值
        target:
          type: AverageValue
          averageValue: 20m
技巧

通常一个 Prometheus 的指标如下

commerce_developer_service_qps_seconds{namespace!="",pod_name!=""}

selector.matchLabels 就是去匹配 {} 里面的 label ,比如:nginx_ingress_controller_requests 里面包含 service ingress 的标签,我们可以根据这个来匹配 某 serviceqps 来扩容指定的服务。

如果大家感兴趣的话,可以直接到阿里云官网直接查看他们的文档,我这边只是记录一下自己的一些操作经验,只是粗略写了一些大概,没有官网详细。