在 K8s 1.18 以前,HPA 擴容是沒法調整靈敏度的:web
kube-controller-manager
的 --horizontal-pod-autoscaler-downscale-stabilization-window
參數控制縮容時間窗口,默認 5 分鐘,即負載減少後至少須要等 5 分鐘纔會縮容。這樣的設計邏輯致使用戶沒法自定義 HPA 的擴縮容靈敏度,而不一樣的業務場景對於擴容容靈敏度要求多是不同的,好比:算法
HPA 在 K8s 1.18 迎來了一次更新,在以前 v2beta2 版本上新增了擴縮容靈敏度的控制,不過版本號依然保持 v2beta2 不變。後端
此次更新實際就是在 HPA Spec 下新增了一個 behavior
字段,下面有 scaleUp
和 scaleDown
兩個字段分別控制擴容和縮容的行爲,具體可參考官方 API 文檔: https://v1-18.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#horizontalpodautoscalerbehavior-v2beta2-autoscalingapi
下面給出一些使用場景的示例。網絡
當你的應用須要快速擴容時,可使用相似以下的 HPA 配置:併發
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: web spec: minReplicas: 1 maxReplicas: 1000 metrics: - pods: metric: name: k8s_pod_rate_cpu_core_used_limit target: averageValue: "80" type: AverageValue type: Pods scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web behavior: # 這裏是重點 scaleUp: policies: - type: percent value: 900%
上面的配置表示擴容時當即新增當前 9 倍數量的副本數,即當即擴容到當前 10 倍的 Pod 數量,固然也不能超過 maxReplicas
的限制。app
假如一開始只有 1 個 Pod,若是遭遇流量突發,它將以飛快的速度進行擴容,擴容時 Pod 數量變化趨勢以下:ide
1 -> 10 -> 100 -> 1000
沒有配置縮容策略,將等待全局默認的縮容時間窗口 (--horizontal-pod-autoscaler-downscale-stabilization-window
,默認5分鐘) 後開始縮容。編碼
若是流量高峯過了,併發量驟降,若是用默認的縮容策略,等幾分鐘後 Pod 數量也會隨之驟降,若是 Pod 縮容後忽然又來一個流量高峯,雖然能夠快速擴容,但擴容的過程畢竟仍是須要必定時間的,若是流量高峯足夠高,在這段時間內仍是可能形成後端處理能力跟不上,致使部分請求失敗。這時候咱們能夠爲 HPA 加上縮容策略,HPA behavior
配置示例以下:設計
behavior: scaleUp: policies: - type: percent value: 900% scaleDown: policies: - type: pods value: 1 periodSeconds: 600 # 每 10 分鐘只縮掉 1 個 Pod
上面示例中增長了 scaleDown
的配置,指定縮容時每 10 分鐘才縮掉 1 個 Pod,大大下降了縮容速度,縮容時的 Pod 數量變化趨勢以下:
1000 -> … (10 min later) -> 999
這個可讓關鍵業務在可能有流量突發的狀況下保持處理能力,避免流量高峯致使部分請求失敗。
若是想要你的應用不太關鍵,但願擴容時不要太敏感,可讓它擴容平穩緩慢一點,爲 HPA 加入下面的 behavior
:
behavior: scaleUp: policies: - type: pods value: 1 # 每次擴容只新增 1 個 Pod
假如一開始只有 1 個 Pod,擴容時它的 Pod 數量變化趨勢以下:
1 -> 2 -> 3 -> 4
若是應用很是關鍵,但願擴容後不自動縮容,須要人工干預或其它本身開發的 controller 來判斷縮容條件,可使用類型以下的 behavior
配置來禁止自動縮容:
behavior: scaleDown: policies: - type: pods value: 0
縮容默認時間窗口是 5 min (--horizontal-pod-autoscaler-downscale-stabilization-window
),若是咱們須要延長時間窗口以免一些流量毛刺形成的異常,能夠指定下縮容的時間窗口,behavior
配置示例以下:
behavior: scaleDown: stabilizationWindowSeconds: 600 # 等待 10 分鐘再開始縮容 policies: - type: pods value: 5 # 每次只縮掉 5 個 Pod
上面的示例表示當負載降下來時,會等待 600s (10 分鐘) 再縮容,每次只縮容 5 個 Pod。
有些應用常常會有數據毛刺致使頻繁擴容,而擴容出來的 Pod 其實沒太大必要,反而浪費資源。好比數據處理管道的場景,擴容指標是隊列中的事件數量, 當隊列中堆積了大量事件時,咱們但願能夠快速擴容,但又不但願太靈敏,由於可能只是短期內的事件堆積,即便不擴容也能夠很快處理掉。
默認的擴容算法會在較短的時間內擴容,針對這種場景咱們能夠給擴容增長一個時間窗口以免毛刺致使擴容帶來的資源浪費,behavior
配置示例以下:
behavior: scaleUp: stabilizationWindowSeconds: 300 # 擴容前等待 5 分鐘的時間窗口 policies: - type: pods value: 20 # 每次擴容新增 20 個 Pod
上面的示例表示擴容時,須要先等待 5 分鐘的時間窗口,若是在這段時間內負載降下來了就再也不擴容,若是負載持續超過擴容閥值才擴容,每次擴容新增 20 個 Pod。
本文介紹瞭如何利用 K8s 1.18 的 HPA 新特性來控制擴縮容的靈敏度,以更好的知足各類不一樣場景對擴容速度的需求。