基于Prometheus指标的弹性伸缩实践
Kubernetes默认的HPA策略只支持基于CPU和内存的自动伸缩,在复杂的业务场景中,仅使用CPU和内存使用率指标进行弹性伸缩往往无法满足日常运维需求。为此,CCE提供云原生监控插件(kube-prometheus-stack),可全面对接开源Prometheus生态,支持类型丰富的组件监控,并提供了多种开箱即用的预置监控大盘。本文介绍如何将华为云Prometheus指标转换成HPA可用的指标,从而为应用提供更加便捷的扩缩机制。
前提条件
- 已创建一个集群。
- 已通过kubectl连接集群,详情请参见通过kubectl连接集群。
步骤一:安装云原生监控插件
- 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”。
- 在“插件中心”页面右侧找到云原生监控插件,单击“安装”。
建议您关注以下配置,其他配置可按需进行设置。详情请参见云原生监控插件。
- 本地数据存储:使用本地存储监控数据,监控数据可选择是否上报至AOM或三方监控平台。
- 自定义指标采集:该配置在本实践中必须选择开启,否则将无法采集自定义指标。
- 插件配置完成后,单击“安装”。
步骤二:获取Prometheus监控数据
本文中通过与Pod相关的指标进行HPA扩缩,例如Pod自身维度的指标。您也可以通过与Pod不相关的的指标进行HPA扩缩,例如外部ELB指标,请参见基于ELB监控指标的弹性伸缩实践。
下文介绍如何部署sample-app应用,并通过Prometheus标准方式暴露container_memory_working_set_bytes_per_second的指标用来标识容器内存工作集每秒字节。关于Prometheus指标的更多信息,请参见metric_type。
- 部署测试应用。
- 创建sample-app.yaml文件,内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: sample-app labels: app: sample-app spec: replicas: 1 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - image: swr.cn-east-3.myhuaweicloud.com/container/autoscale-demo:v0.1.2 #示例镜像 name: metrics-provider resources: requests: cpu: 250m memory: 512Mi limits: cpu: 250m memory: 512Mi ports: - name: http containerPort: 8080 #容器暴露的端口 imagePullSecrets: - name: default-secret --- apiVersion: v1 kind: Service metadata: name: sample-app namespace: default labels: app: sample-app spec: ports: - port: 80 name: http protocol: TCP targetPort: 8080 selector: app: sample-app type: ClusterIP
该应用将暴露指标container_memory_working_set_bytes_per_second,用于查看容器每秒的工作内存大小。
- 创建工作负载。
kubectl apply -f sample-app.yaml
- 创建sample-app.yaml文件,内容如下:
- 创建ServiceMonitor监控自定义指标。
- 创建servicemonitor.yaml文件,内容如下:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: sample-app # ServiceMonitor名称 namespace: default spec: endpoints: # 定义要监控的服务的端点,包括名称、端口、路径、协议等信息 - interval: 30s # 表示Prometheus Operator将每30秒检查一次服务是否需要添加到监控目标列表中 port: http path: /metrics namespaceSelector: any: true selector: matchLabels: app: sample-app #需要采集数据的对象标签
- 创建ServiceMonitor。
kubectl apply -f servicemonitor.yaml
- 创建servicemonitor.yaml文件,内容如下:
步骤三:修改配置文件
- 修改Prometheus的adapter-config配置项,通过修改adapter-config中rules字段将Prometheus暴露出的指标转换为HPA可关联的指标。
kubectl -n monitoring edit configmap user-adapter-config
- 在rules字段下添加自定义指标采集规则。如果您需要增加多个采集规则,可在rules字段下添加多个配置,关于采集规则配置详情请参见Metrics Discovery and Presentation Configuration。
自定义采集规则示例如下:
rules: - seriesQuery: container_memory_working_set_bytes{namespace!="",pod!=""} resources: overrides: namespace: resource: namespace pod: resource: pod name: matches: ^(.*)_bytes as: ${1}_bytes_per_second #此处${1}取值为matches:"^(.*)_bytes"中^(.*)匹配到的值 metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)
- seriesQuery:PromQL请求数据(用户需要查询的指标,可根据实际情况填写)。
- metricsQuery:对seriesQuery中PromQL请求的数据进行聚合操作。
- resources:是PromQL里的数据Label,与resource进行匹配。此处的resource是指集群内的api-resource,例如Pod、Namespace和Node。您可以通过kubectl api-resources -o wide命令查看。此处Key对应Prometheus数据中的LabelName,请确认Prometheus指标数据中有此LabelName。
- name:指根据正则匹配把Prometheus指标名转为比较可读的指标名,此处将container_memory_working_set_bytes转为container_memory_working_set_bytes_per_second。
- 重新部署monitoring命名空间下的custom-metrics-apiserver工作负载。
kubectl -nmonitoring delete pod -l app=custom-metrics-apiserver
- 执行命令查看指标是否添加成功。
kubectl get --raw /apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/container_memory_working_set_bytes_per_second
步骤四:创建HPA策略
- 使用自定义指标创建HPA策略。
- 创建hpa.yaml文件,内容如下:
kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata: name: sample-app-memory-high spec: # HPA的伸缩对象描述,HPA会动态修改该对象的Pod数量。 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app # HPA的最小Pod数量和最大Pod数量。 minReplicas: 1 maxReplicas: 10 # 监控的指标数组,支持多种类型的指标共存。 metrics: - type: Pods pods: metric: name: container_memory_working_set_bytes_per_second # 使用自定义容器指标 target: type: AverageValue # AverageValue类型的目标值,Pods指标类型下只支持AverageValue类型的目标值 averageValue: 1024000m # 此处1024000m代表1KB
- 创建HPA策略。
kubectl apply -f hpa.yaml
- 创建hpa.yaml文件,内容如下:
- 查看HPA策略是否生效。
kubectl get hpa sample-app-memory-high
可见副本数已由初始1扩容至10。