K8s HPA 設(shè)計實現(xiàn)

介紹

Horizontal Pod Autoscaling(Pod 水平自動伸縮),簡稱HPA,HPA 通過監(jiān)控分析一些控制器控制的所有 Pod 的負載變化情況來確定是否需要調(diào)整 Pod 的副本數(shù)量纷闺,

應(yīng)對線上的各種復(fù)雜情況,我們需要能夠做到自動化去感知業(yè)務(wù),來自動進行擴縮容。

原理

HPA 控制器 定期查詢Resource Metrics API(Metrics Server)以獲取CPU內(nèi)存等核心指標和針對特定應(yīng)用程序指標的Custom Metrics API (Prometheus adapter)

擴縮容算法

desiredReplicas = ceil[currentReplicas * ( currentMetricValue / desiredMetricValue )]
即當前副本數(shù) * (當前指標值/期望的指標值)单鹿,將結(jié)果向上取整掀宋。

實踐

擴容的指標 CPU 深纲、內(nèi)存、TPS(自定義) 劲妙,系統(tǒng)將針對每種類型的指標都計算 Pod 副本的目標數(shù)量湃鹊,以最大值為準進行擴縮容操作。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: {{ metadata_name }}   #APP Name
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: {{ spec_scaleTargetRef_name }}  #APP Name
  minReplicas: {{spec_minReplicas}}  # 最小副本數(shù)
  maxReplicas: {{spec_maxReplicas}} # 擴容最大副本數(shù)
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: {{metrics_resource_targetAverageUtilization}}
  - type: Resource
    resource:
      name: memory
      targetAverageValue: {{metrics_resource_targetAverageValue}}
  - type: Pods
    pods:
      metric:
        name: http_server_requests_seconds_count # k8s-prometheus-adapter configMap 配置
      target:
        type: AverageValue
        averageValue: {{metrics_pods_target_averageValue}}

主要參數(shù)如下:

  • scaleTargetRef:目標作用對象镣奋,可以是 Deployment币呵、ReplicationController 或 ReplicaSet。
  • minReplicas 和 maxReplicas:Pod 副本數(shù)量的最小值和最大值侨颈,系統(tǒng)較臟這個范圍內(nèi)進行自動擴縮容操作余赢,并維持每個 Pod 的CPU 使用率為 50%。
  • metrics:目標指標值哈垢。在 metrics 中通過參數(shù) type 定義指標的類型妻柒,通過參數(shù) target 定義相應(yīng)的指標目標值,系統(tǒng)將在指標數(shù)據(jù)達到目標值時(考慮容忍度的區(qū)間耘分,見前面算法部分的說明)觸發(fā)擴縮容操作举塔。

可以將 metrics 中的 type(指標類型)設(shè)置為以下四種绑警,可以設(shè)置一個或多個組合,如下所述央渣。
(1)Resource:基于資源的指標值计盒,可以設(shè)置的資源為 CPU 和內(nèi)存。
(2)Pods:基于 Pod 的指標芽丹,系統(tǒng)將對全部 Pod 副本的指標值進行平均計算北启。
(3)Object:基于某種資源對象(如 Ingress)的指標或應(yīng)用系統(tǒng)的任意自定義指標。
(4)External:基于外部指標值志衍,用戶使用了公有云服務(wù)商提供的消息服務(wù)或外部負載均衡器暖庄,希望基于這些外部服務(wù)的性能指標(如消息服務(wù)的隊列長度、負載均衡器的 QPS)對自己部署在 Kubernetes 中的服務(wù)進行自動擴縮容操作

規(guī)則

1.定義metric name 和 格式 比如統(tǒng)計TPS

http_server_requests_seconds_count{application=“hello-word”,env=“test”,instance=“10.142.22.9:9090”,job=“op-app-prometheus-prod-dayu”,method=“GET”,namespace=“base”,pod=“hello-word-7cdfc8bb48-nn5vf”}

Label 必須含有 env 楼肪,pod 培廓,namespace

2.接入prometheus

Java(spring boot 和 Eureka) 引入dayu starter (內(nèi)部編寫統(tǒng)一暴露metric sdk)

Go

Python

配置

k8s-prometheus-adapter configMap 部署adapter前需要配置adapter的rule,用于預(yù)處理metrics

- seriesQuery: 'http_server_requests_seconds_count{namespace !="", pod!="",,env="test"}'
      resources:
        overrides:
          namespace: {resource: "namespace"}
          pod: {resource: "pod"}
      name:
        matches: ""
        as: ""
      metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)'

kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/base/pods/*/http_server_requests_seconds_count" | jq .

http_server_requests_seconds_count custom metrics name 春叫,環(huán)境匹配當前的env

seriesQuery 可以根據(jù)標簽進行查找(如下)肩钠,也可以直接指定metric name查找

resources 設(shè)置metric與kubernetes resources的映射關(guān)系

name 用于將prometheus metrics名稱轉(zhuǎn)化為custom metrics API所使用的metrics名稱,但不會改變其本身的metric名稱

metricsQuery 處理調(diào)用custom metrics API獲取到的metrics的value 該值最終提供給HPA進行擴縮容

未來

1暂殖,當前custom metric 需要在k8s-prometheus-adapter 創(chuàng)建rules 价匠,如果custom metric 太多了 人工修改是一個低效的工作,考慮rules 根據(jù)業(yè)務(wù)自行定義
自行動態(tài)創(chuàng)建
2呛每,以上需要滿足不了 踩窖,自行實現(xiàn) custom-metric-apiserver

資料

https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
https://github.com/kubernetes/metrics
https://github.com/DirectXMan12/k8s-prometheus-adapter
https://github.com/kubernetes-sigs/custom-metrics-apiserver

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市晨横,隨后出現(xiàn)的幾起案子洋腮,更是在濱河造成了極大的恐慌,老刑警劉巖手形,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啥供,死亡現(xiàn)場離奇詭異,居然都是意外死亡库糠,警方通過查閱死者的電腦和手機伙狐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞬欧,“玉大人贷屎,你說我怎么就攤上這事∷一ⅲ” “怎么了唉侄?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長顷帖。 經(jīng)常有香客問我美旧,道長渤滞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任榴嗅,我火速辦了婚禮妄呕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘嗽测。我一直安慰自己绪励,他們只是感情好,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布唠粥。 她就那樣靜靜地躺著疏魏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晤愧。 梳的紋絲不亂的頭發(fā)上大莫,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天,我揣著相機與錄音官份,去河邊找鬼只厘。 笑死,一個胖子當著我的面吹牛舅巷,可吹牛的內(nèi)容都是我干的羔味。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼钠右,長吁一口氣:“原來是場噩夢啊……” “哼赋元!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起飒房,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤搁凸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后情屹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坪仇,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡杂腰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年垃你,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂很。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡惜颇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出少辣,到底是詐尸還是另有隱情凌摄,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布漓帅,位于F島的核電站锨亏,受9級特大地震影響痴怨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜器予,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一浪藻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乾翔,春花似錦爱葵、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至雷则,卻和暖如春辆雾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背月劈。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工乾颁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艺栈。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓英岭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親湿右。 傳聞我的和親對象是個殘疾皇子诅妹,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345