本文分享自華為雲社群《【自定義指標HPA】基於容器網路流量指標進行彈性伸縮》,作者: 可以交個朋友。
一、背景
業務程式非CPU、memeory敏感類業務,希望可以基於流量指標進行HPA彈性伸縮,但是大部分程式並沒有整合Prometheus SDK相關程式碼進行插樁。此時可以透過cAdvisor提供的容器網路流量指標實現業務峰谷期間的彈性擴縮容。
二、方案介紹
cAdvisor負責節點上的容器和節點本身資源的統計,內建在kubelet中,並透過kubelet的/metrics/cadvisor
介面對外提供API。它可以採集容器網路累積接收資料總量
和容器網路累積傳輸資料總量
,即網路流入和流出指標。
參考指標:
container_network_receive_bytes_total
容器接受的網路流量,單位是位元組數
container_network_transmit_bytes_total
容器傳輸的網路流量,單位是位元組數
上面兩個指標都是counter
計數器型別,對應的值只增不減。在配置自定義指標轉換規則時需要做下速率換算,將總量換算成每秒接受多少位元組數的流量指標。
三、實踐操作
3.1 安裝Prometheus相關外掛
建議使用華為雲CCE產品,外掛市場整合了kube-prometheus-stack,同時該外掛也已經對接了CCE叢集節點實現了節點cadvisor的指標監控。
外掛安裝完成後,可以透過訪問prometheus UI檢視指標資訊:
3.2 配置Prometheus-adapter指標轉換規則
kubectl -n monitoring edit configmap user-adapter-config
- seriesQuery: 'container_network_receive_bytes_total{namespace!="",pod!=""}' seriesFilters: [] resources: overrides: namespace: resource: namespace pod: resource: pod name: matches: container_(.*)_total as: "pod_${1}_per_second" metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000 - seriesQuery: 'container_network_transmit_bytes_total{namespace!="",pod!=""}' seriesFilters: [] resources: overrides: namespace: resource: namespace pod: resource: pod name: matches: container_(.*)_total as: "pod_${1}_per_second" metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000
注意: 修改後需要重啟monitoring名稱空間下的custom-metrics-apiserver
負載例項。
其中metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[3m])) by (<<.GroupBy>>)/1000
配置表示 最近3min內pod每秒接受的請求量,由於container_network_receive_bytes_total
和container_network_transmit_bytes_total
是counter型別的指標,指標數值會一直遞增,所以需要將指標做下速率換算。 除以/1000 則表示以kb為單位,預設單位是位元組數,查出來的值會很大,該處可以根據實際情況進行配置。
resources
處配置則是將Prometheus中查詢的指標和K8s叢集中的資源進行匹配對映。
name
處配置則是將Prometheus查詢出來的指標,進行重新命名處理,增強指標可讀性。
3.3 驗證自定義彈性指標是否可用
呼叫介面訪問自定義指標:
kubectl get --raw="/apis/custom.metrics.k8s.io/v1beta1/namespaces/default/pods/*/pod_network_receive_bytes_per_second" |jq
可以看到對應的指標和其返回的值。
也可以在CCE控制檯進行自定義指標的檢視,發現該指標已經可用:
3.4 測試HPA彈性功能
主要是觀測能否根據該指標,即容器每秒接受的網路流量指標進行動態闊縮容。
編寫HPA yaml檔案,建立HPA彈性伸縮策略
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-app07 namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: app07 minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: pod_network_receive_bytes_per_second target: type: AverageValue averageValue: 10
然後透過執行命令 while true; do curl clusterIP:port;done
進行壓測,創造訪問流量。
觀測HPA實時動態kubectl get hpa xxx -w
可以看到隨著流量指標數值的攀升,pod例項逐步開始擴容。直到擴容到例項上限。
停止壓測觀察HPA縮容變化,直到最後只剩下一個pod在執行。
四、補充
如何在CCE測檢視負載例項的網路流量指標資訊
負載級別網路流量指標展示:
Pod例項級別網路流量指標展示:
也可前往雲原生觀測-監控中心-儀表盤-選擇Pod檢視檢視流量指標資訊:
對比上述配置的自定義指標計算方式求的值基本吻合
點選關注,第一時間瞭解華為雲新鮮技術~