很多場景中需要根據自定義指標(例如HTTP請求的QPS、消息隊列的長度等)對應用進行擴縮容。AHPA(Autoscaling Horizontal Pod Autoscaler)提供了External Metrics機制,結合alibaba-cloud-metrics-adapter組件,可以為應用提供更加豐富的擴縮容機制。本文介紹如何通過AHPA配置自定義指標以實現應用擴縮容。
前提條件
已創建ACK托管集群或ACK Serverless集群。詳細信息,請參見創建Kubernetes托管版集群、創建集群。
步驟一:準備示例
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在無狀態頁面,單擊使用YAML創建資源。
在創建頁面,使用如下YAML,創建應用sample-app、對應的Service以及壓測示例fib-loader-qps,然后單擊創建。
說明此容器暴露出自定義指標requests_per_second,用來標識每秒訪問次數。
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: registry.cn-hangzhou.aliyuncs.com/acs/knative-sample-fib-server:v1 name: metrics-provider ports: - name: http containerPort: 8080 env: - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name
在創建頁面,使用如下YAML,創建ServiceMonitor,然后單擊創建。
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: sample-app namespace: default spec: endpoints: - interval: 30s port: http path: /metrics namespaceSelector: any: true selector: matchLabels: app: sample-app
開啟ServiceMonitor。
登錄ARMS控制臺。
在左側導航欄選擇 ,進入可觀測監控 Prometheus 版的實例列表頁面。
在頁面頂部,選擇Prometheus實例所在的地域,單擊目標實例名稱(與集群同名)。
在左側導航欄選擇服務發現,然后在右側頁面單擊配置頁簽,然后單擊ServiceMonitor頁簽。
在sample-app所在行,開啟操作列的開關。
步驟二:部署Metrics Adapter
獲取HTTP API的內網地址。
登錄ARMS控制臺。
在左側導航欄選擇 ,進入可觀測監控 Prometheus 版的實例列表頁面。
在實例列表頁面頂部,選擇Prometheus實例所在的地域,然后單擊目標實例名稱(格式為arms_metrics_{RegionId}_XXX)。
在左側導航欄單擊設置,在HTTP API地址(Grafana 讀取地址)區域,查看并記錄內網地址(Prometheus URL)。
(可選)如果開啟了Token,則需要設置訪問Token。請記錄Token的值。
查看并記錄內網地址(Prometheus URL)。
部署ack-alibaba-cloud-metrics-adapter。
登錄容器服務管理控制臺,在左側導航欄選擇 。
單擊應用目錄頁簽,搜索并單擊ack-alibaba-cloud-metrics-adapter。
在ack-alibaba-cloud-metrics-adapter頁面,單擊右上角的一鍵部署。
在基本信息配置向導中,選擇集群和命名空間,然后單擊下一步。
在參數配置配置向導中,選擇Chart版本。根據在獲取HTTP API的內網地址獲取的值,在參數區域配置
prometheus.url
和prometheus.prometheusHeader
,然后單擊確定。prometheus: enabled: true # 填寫HTTP API的內網地址,即阿里云Prometheus監控的URL地址。 url: http://cn-beijing-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/6b4b40986a3bec4f92ea418534****/115964845466****/arms-metrics-6fae216078e4****/cn-beijing # 阿里云Prometheus開啟鑒權Token后,請配置prometheusHeader Authorization。 prometheusHeader: - Authorization: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjIwMDc1MTY0MDksImlzcyI6Imh0dHA6******liYWJhY2xvdWQuY29tIiwiaWF0IjoxNjkyMTU2NDA5LCJqdGkiOiI3NmRkOWJkOS0zYzBkLTRjY2MtOTFkYy1lZTU1OGFkNjg3NmMifQ.gltEJ7g4j-QPao2durNk3OiEBYhv2F_nzG-cncVfFtY
配置自定義指標。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在alibaba-cloud-metrics-adapter所在行,單擊操作列的更新。
將下面的YAML文件內容復制,然后粘貼并覆蓋模板中對應的參數。注意下面示例說明中的
requests_per_second
,需要修改為實際對應的指標,對應Prometheus每秒請求數指標。然后單擊更新。...... prometheus: adapter: rules: custom: - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) name: as: requests_per_second resources: overrides: namespace: resource: namespace seriesQuery: requests_per_second # 設置指標名稱,請確保阿里云Prometheus中指標和此處一致。 default: false enabled: true # 這里設置為true,打開Prometheus Adapter。 ......
執行如下命令,通過Custom Metrics指標查詢方式,查看可用指標詳情。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second" {"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{},"items":[{"metricName":"requests_per_second","metricLabels":{},"timestamp":"2023-08-15T07:59:09Z","value":"10"}]}
步驟三:部署AHPA
創建如下AHPA資源。
設置
external.metric
, 指定指標名稱以及matchLabels。指標名稱與配置自定義指標中的指標名稱保持一致。這里指定自定義指標為requests_per_second。設置目標閾值,這里指定AverageValue為10, 表示每秒請求數超過10就開始擴容。
執行如下命令,查看AHPA結果。
custom-metric % kubectl get ahpa NAME STRATEGY REFERENCE METRIC TARGETS DESIREDPODS REPLICAS MINPODS MAXPODS AGE customer-deployment observer Deployment/sample-app requests_per_second 60000m/10 6 1 1 50 7h53m
K8s需要高精度時,會使用單位m或k。例如1001m=1.001,這里60000m=60。預期輸出表明,每秒請求數為60,超過了設置的目標閾值10,計算出期望Pod數(DESIREDPODS)為6。