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

至今单身的哑铃發表於2024-03-01

一、背景
業務程式非 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_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 在執行。

相關文章