阿里云 ACK HPA 基于 arms Prometheus 自定义指标的可控弹性伸缩.
简介
前文我们讲述了原生的 kubernetes
使用原生的 Prometheus
进行自定义指标的可控弹性伸缩的内容,这一节,我们来讲讲阿里云 ACK
的 arms Prometheus
自定义指标的可控弹性伸缩,总体没什么差别,只不过度量指标类型为:External
。前文对度量指标类型有过介绍,具体可以看度量指标类型的介绍。
安装
通过阿里云的应用市场安装 arms-Prometheus
安装 ack-alibaba-cloud-metrics-adapter
这个应用
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
类型暴漏出来的。
因此,我们的自定义规则里面无需再去计算速率,而是直接引用该值,还有我们需要计算的是该服务所有 pod
的 qps
总和,所以也是直接用 sum
函数就搞定了。
查看这个 commerce_xxxxx
指标他的 kind
是 pod
还是 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
,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
的标签,我们可以根据这个来匹配 某 service
的 qps
来扩容指定的服务。
如果大家感兴趣的话,可以直接到阿里云官网直接查看他们的文档,我这边只是记录一下自己的一些操作经验,只是粗略写了一些大概,没有官网详细。