默認HPA只支持基于CPU和內存的自動伸縮,并不能滿足日常的運維需求。阿里云Prometheus監控全面對接開源Prometheus生態,支持類型豐富的組件監控,提供多種開箱即用的預置監控大盤,且提供全面托管的Prometheus服務。本文介紹如何將阿里云Prometheus指標轉換成HPA可用的指標,從而為應用提供更加便捷的擴縮機制。
前提條件
已部署阿里云Prometheus監控組件。具體操作,請參見使用阿里云Prometheus監控ACS集群狀態。
操作步驟
部署ack-alibaba-cloud-metrics-adapter
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在Helm頁面,單擊左上角的創建。
在創建面板中,Chart搜索選擇ack-alibaba-cloud-metrics-adapter,然后單擊下一步。
在參數配置頁面,選擇版本號并設置相應參數,然后單擊確定。
在Helm頁面可看到ack-alibaba-cloud-metrics-adapter組件已成功部署到集群中。
在Helm頁面,找到ack-alibaba-cloud-metrics-adapter,并單擊右側的更新。
使用以下內容,替換模板中對應的參數,然后單擊更新。
...... prometheus: enabled: true # 填寫阿里云Prometheus監控的地址。 url: https://cn-beijing.arms.aliyuncs.com:9443/api/v1/prometheus/xxxx/xxxx/xxxx/cn-beijing # 阿里云Prometheus開啟鑒權Token后,請配置prometheusHeader Authorization。 prometheusHeader: Authorization: xxxxxxx adapter: rules: custom: # 添加新的轉換規則,請確保阿里云Prometheus中指標標簽和此處一致,如果不一致,請參見阿里云Prometheus中指標標簽修改。 - seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: # 此處resource為Kubernetes的API Resource,可通過kubectl api-resources -o wide查看。 # 此處key對應Prometheus數據中的LabelName,請確認Prometheus指標數據中有此LabelName。 namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>) default: false enabled: true # 這里設置為true,打開Prometheus adapter。 ......
參數名
說明
AlibabaCloudMetricsAdapter.prometheus.url
填寫阿里云Prometheus監控的地址。
關于如何獲取Prometheus數據請求URL,請參見如何獲取Prometheus數據請求URL。
AlibabaCloudMetricsAdapter.prometheus.prometheusHeader.Authorization
填寫Token。
關于如何獲取Token,請參見如何獲取Prometheus數據請求URL。
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.custom
字段內容修改為下面示例YAML中對應的內容。
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.default
默認創建預置指標,推薦關閉,配置為
false
。說明關于ack-alibaba-cloud-adapter配置文件詳細說明,請參見ack-alibaba-cloud-adapter配置文件詳解。
部署示例應用
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在無狀態頁面,單擊右上角的使用YAML創建資源。
在創建頁面,部署以下YAML文件創建一個名為sample-app的應用及對應的Service,然后單擊創建。
說明此容器暴露出http_requests_total的指標,用來標識訪問次數。
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 --- apiVersion: v1 kind: Service metadata: name: sample-app namespace: default labels: app: sample-app spec: ports: - port: 8080 name: http protocol: TCP targetPort: 8080 selector: app: sample-app type: ClusterIP
添加ServiceMonitor
登錄ARMS控制臺。
在左側導航欄,單擊接入中心,然后在搜索框中搜索自定義指標采集,單擊自定義指標采集卡片。
在彈出面板的開始接入頁簽下,選中容器服務環境,并選擇目標ACS集群。
參考下表在配置信息區域填寫ServiceMonitor的配置信息,然后單擊確定。
配置項
示例值
接入名稱
sample-app
服務發現方式
ServiceMonitor
命名空間
default
端口名稱
http
指標采集路徑
/metrics
采集間隔(秒)
30
標簽匹配
app
sample-app
等待接入狀態檢查完成。出現接入成功,開始您的觀測之旅字樣則說明接入操作已完成。
單擊接入管理,確認監控狀態。效果如下圖。
ack-alibaba-cloud-adapter配置文件詳解
以上文中sample-app容器中暴露出來的http_requests_total
指標轉換成HPA中的http_requests_per_second
為例,完整的ack-alibaba-cloud-adapter配置文件如下。
- seriesQuery: http_requests_total{namespace!="",pod!=""}
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: ^(.*)_total
as: ${1}_per_second
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
配置項 | 說明 |
| PromQL請求數據。 |
| 對 |
| PromQL里的數據Label,與resource進行匹配。這里的resource是指集群內的api-resource,例如Pod、Namespace。可通過 |
| 根據正則匹配把Prometheus指標名轉為比較可讀的指標名,這里是把 |
Discovery:ack-alibaba-cloud-adapter組件會從Prometheus發現可用的指標。
指定待轉換的Prometheus指標,您可以通過seriesFilters精確過濾指標。seriesQuery可以根據標簽進行查找(示例代碼如下)。
seriesQuery: http_requests_total{namespace!="",pod!=""} seriesFilters: - isNot: "^container_.*_seconds_total"
說明seriesFilters為非必填項,用來過濾指標:
is:<regex>,匹配包含該正則表達式的指標。
isNot:<regex>,匹配不包含該正則表達式的指標。
Association:將指標與Kubernetes資源(Pod、Namespace)相關聯。
設置Prometheus指標標簽與Kubernetes中的資源映射關系。
http_requests_total
指標的標簽包括namespace!=""
和pod!=""
。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"}
Naming:定義轉換后的HPA可用指標名稱。
用于將Prometheus指標名稱轉換成HPA的指標名稱,但不會改變Prometheus本身的指標名稱。如果使用Prometheus原來的指標,可以不設置。
說明您可以通過執行命令
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
查看HPA可用的所有指標。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: "^(.*)_total" as: "${1}_per_second"
Querying:定義查詢Prometheus語句。
查詢Prometheus API的模板。ack-alibaba-cloud-adapter會根據HPA中的參數,填充參數到此模板中,然后發送給Prometheus API請求,并將獲得的值最終提供給HPA進行彈性擴縮。
- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
如何獲取Prometheus數據請求URL
阿里云Prometheus監控
登錄ARMS控制臺。
在左側導航欄選擇 ,進入可觀測監控 Prometheus 版的實例列表頁面。
在Prometheus監控頁面左上角選擇ACS集群所在的地域,然后單擊目標實例名稱進入對應實例頁面。
在左側導航欄單擊設置,然后單擊設置頁簽。
在設置頁簽下獲取HTTP API地址(Grafana讀取地址)和Token。
推薦使用內網,如無法使用內網時,可使用公網。
開源Prometheus監控
部署Prometheus監控方案。
登錄容器計算服務控制臺,在左側導航欄選擇集群。
在集群頁面,單擊目標集群ID,然后在左側導航欄,選擇
。在Helm頁面,單擊左上角的創建。
在創建面板中,Chart搜索選擇ack-prometheus-operator,然后單擊下一步。
在參數配置頁面,設置相應參數,然后單擊確定。
查看部署結果:
執行以下命令,將集群中的Prometheus映射到本地9090端口。
kubectl port-forward svc/ack-prometheus-operator-prometheus 9090:9090 -n monitoring
在瀏覽器中訪問localhost:9090,即可查看Prometheus。
選擇菜單欄
,查看所有采集任務。如果所有任務的狀態為UP,表示所有采集任務均已正常運行。
查看Labels中對應的service和namespace。
以ServiceName是ack-prometheus-operator-prometheus,ServiceNamespace是monitoring為例說明該開源Prometheus數據請求的URL:
http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090
相關文檔
本文通過Prometheus監控指標轉換為HPA數據來實現了容器的水平伸縮,更多關于容器水平伸縮的操作,請參見容器水平伸縮(HPA)。