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

本文分享自華爲雲社區《【自定義指標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

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章