如何基於容器網路流量指標進行彈性伸縮

华为云开发者联盟發表於2024-03-06

本文分享自華為雲社群《【自定義指標HPA】基於容器網路流量指標進行彈性伸縮》,作者: 可以交個朋友。

一、背景

業務程式非CPU、memeory敏感類業務,希望可以基於流量指標進行HPA彈性伸縮,但是大部分程式並沒有整合Prometheus SDK相關程式碼進行插樁。此時可以透過cAdvisor提供的容器網路流量指標實現業務峰谷期間的彈性擴縮容。

二、方案介紹

cAdvisor負責節點上的容器和節點本身資源的統計,內建在kubelet中,並透過kubelet的/metrics/cadvisor 介面對外提供API。它可以採集容器網路累積接收資料總量容器網路累積傳輸資料總量,即網路流入和流出指標。

參考指標:

container_network_receive_bytes_total 容器接受的網路流量,單位是位元組數

image.png

container_network_transmit_bytes_total 容器傳輸的網路流量,單位是位元組數

image.png

上面兩個指標都是counter計數器型別,對應的值只增不減。在配置自定義指標轉換規則時需要做下速率換算,將總量換算成每秒接受多少位元組數的流量指標。

三、實踐操作

3.1 安裝Prometheus相關外掛

建議使用華為雲CCE產品,外掛市場整合了kube-prometheus-stack,同時該外掛也已經對接了CCE叢集節點實現了節點cadvisor的指標監控。

image.png

外掛安裝完成後,可以透過訪問prometheus UI檢視指標資訊:

image.png

3.2 配置Prometheus-adapter指標轉換規則

kubectl -n monitoring edit configmap user-adapter-config

image.png
 - 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_totalcontainer_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

可以看到對應的指標和其返回的值。

image.png

也可以在CCE控制檯進行自定義指標的檢視,發現該指標已經可用:

image.png

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

image.png

可以看到隨著流量指標數值的攀升,pod例項逐步開始擴容。直到擴容到例項上限。

image.png

停止壓測觀察HPA縮容變化,直到最後只剩下一個pod在執行。

image.png

四、補充

如何在CCE測檢視負載例項的網路流量指標資訊

image.png

負載級別網路流量指標展示:

image.png

Pod例項級別網路流量指標展示:

image.png

也可前往雲原生觀測-監控中心-儀表盤-選擇Pod檢視檢視流量指標資訊:

image.png

對比上述配置的自定義指標計算方式求的值基本吻合

image.png

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章