成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇學(xué)會用 KEDA 根據(jù)工作負(fù)載進行快速擴容

開發(fā) 前端
雖說云原生架構(gòu)的復(fù)雜性問題越來越被強調(diào),但是這一生態(tài)的宗旨應(yīng)該還是沒有變化——用簡單的透明的手段解決復(fù)雜問題。

歷史問題

眾所周知,Kubernetes 有個親生的 HPA 組件,在云原生早期,這個名義上的自動擴縮容的能力給 Kubernetes 贏得了不少掌聲。當(dāng)然現(xiàn)在回頭看看,僅僅根據(jù) CPU 和內(nèi)存這樣“貧瘠”的指標(biāo),不論是用于判斷負(fù)載水平,還是用于計算擴容目標(biāo),都不是很夠用的。這個階段里,HPA 的擴縮容效率也是廣受詬病的一個問題,在一個多級微服務(wù)調(diào)用的業(yè)務(wù)場景里,壓力是逐級傳遞的,下圖展示了一個常見情況:

圖片圖片

如上圖,用戶流量進入集群之后:

  1. 首先在 Deploy A 造成負(fù)載,指標(biāo)變化迫使 Deploy A 擴容
  2. A 擴容之后,吞吐量變大,B 受到壓力,再次采集到指標(biāo)變化,擴容 Deploy B
  3. B 吞吐變大,C ..

這個逐級傳遞的過程不僅緩慢,而且可以說是步步驚心——每一級的擴容都是直接被 CPU 或內(nèi)存的飆高觸發(fā)的,被“沖垮”的可能性是普遍存在的。這種被動、滯后的方式,很明顯是有問題的。

推陳出新

造成 HPA 窘境的原因之一,就是“自掃門前雪”,每個 Pod 都只能根據(jù)自身負(fù)載情況來進行擴縮容決策。如果能夠直接根據(jù)業(yè)務(wù)流量的變化進行決策,并且將流量流經(jīng)的所有微服務(wù)進行擴縮容,看起來情況就會好很多了。HPA 的自定義指標(biāo)支持,給這個問題了一個可行的方案。該能力讓 HPA 可以用其它的指標(biāo)來作為擴縮容的觸發(fā)器,例如我們可以用 Promethues 采集消息中間件的深度或者負(fù)載均衡器的隊列長度,作為一個更能如實反映業(yè)務(wù)流量的指標(biāo),直接用來觸發(fā)相關(guān)的多個微服務(wù)的擴縮容,如下圖所示:

圖片圖片

在上圖中:

  1. Prometheus 采集消息隊列和負(fù)載均衡等更能反映業(yè)務(wù)流量的指標(biāo)
  2. 使用 Prometheus Adapter 將 Promethues Metrics 轉(zhuǎn)換為 Kubernetes 的 Aggregated API
  3. HPA 使用自定義指標(biāo),同時對多個應(yīng)用進行擴縮容。

這中間涉及到的 Prometheus Adapter,通過配置文件完成步驟 2 的轉(zhuǎn)換:

- seriesQuery: '{__name__=~"^container_.*_total",container!="POD",namespace!="",pod!=""}'
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  seriesFilters:
  # since this is a superset of the query above, we introduce an additional filter here
  - isNot: "^container_.*_seconds_total$"
  name: {matches: "^container_(.*)_total$"}
  metricsQuery: "sum(rate(<<.Series>>{<<.LabelMatchers>>,container!="POD"}[2m])) by (<<.GroupBy>>)"

當(dāng)然,完全可以自行實現(xiàn) Aggregated API 來支持這種指標(biāo)的采集和呈現(xiàn)工作。Prometheus 所提供的大量 Exporter 是吸引我們寫這種古怪語法的最大動力。

那么如果是 KEDA 的話,這個問題又如何呢?KEDA 提供了幾十個被稱為 Scaler 的東西,其中除了 Promethues 之外,還包括 Kafka、Redis、PostgreSQL 等多種選擇。所以在很多場景中,無需 Promethues,也能使用 Scaler 完成對輸入指標(biāo)的讀取和判斷。下面用 KEDA 為例,看看這種伸縮方法的具體實現(xiàn)。

KEDA

假設(shè)一個容器化應(yīng)用由多個工作負(fù)載組成:

  • Ingress:負(fù)責(zé)接收業(yè)務(wù)流量
  • Backend 1、Backend 2:負(fù)責(zé)處理 Ingress 發(fā)來的任務(wù)
  • Database:數(shù)據(jù)庫

我們希望達成的效果是 —— Ingress、Backend 1、Backend 2、Database,實例數(shù)量保持在 1:2:1.5:2 的關(guān)系,Keda 的大致流程如下圖所示:

圖片圖片

首先使用 Helm 安裝 KEDA:

$ helm repo add kedacore https://kedacore.github.io/charts
$ helm install keda kedacore/keda --namespace default
NAME: keda
LAST DEPLOYED: Wed Nov 29 18:56:36 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
...

隨便創(chuàng)建幾個工作負(fù)載,冒充微服務(wù):

$ kubectl create deploy ingress --image=nginx
deployment.apps/ingress created
$ kubectl create deploy backend1 --image=nginx
deployment.apps/backend1 created
$ kubectl create deploy backend2 --image=nginx
deployment.apps/backend2 created
$ kubectl create deploy database --image=nginx
deployment.apps/database created
$ kubectl get pods | cut -d - -f 1 | grep -v keda | sort
...
backend1
backend2
database
ingress

運行成功后,我們可以看到,四個微服務(wù),每個微服務(wù)都有一個實例。

按照剛才瞎掰的比例,編寫一個 ScaleObject:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: bk1
spec:
  scaleTargetRef:
    name: backend1
  triggers:
  - type: kubernetes-workload
    metadata: 
      podSelector: 'app=ingress'
      value: '0.5'
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: bk2
spec:
  scaleTargetRef:
    name: backend2
  triggers:
  - type: kubernetes-workload
    metadata: 
      podSelector: 'app=ingress'
      value: '0.67'      
---
apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: db
spec:
  scaleTargetRef:
    name: database
  triggers:
  - type: kubernetes-workload
    metadata: 
      podSelector: 'app=ingress'
      value: '0.5'

上述代碼引入了 kubernetes-workload 類型的觸發(fā)器,他會監(jiān)控 app=ingress 的容器,并對 scaleTargetRef 中提到的工作負(fù)載數(shù)量比例進行擴縮容。

提交到集群之后,會看到實例數(shù)量數(shù)量發(fā)生了變化:

$ kubectl get pods | cut -d - -f 1 | sort | uniq --count
...
   2 backend1
   2 backend2
   2 database
   1 ingress
   3 keda

我們把 Ingress 擴容到 2 實例,再次統(tǒng)計:

$ kubectl scale deployment ingress --replicas=2
deployment.apps/ingress scaled
$ kubectl get pods | cut -d - -f 1 | sort | uniq --count
...
   4 backend1
   3 backend2
   4 database
   2 ingress
   3 keda

可以看到,的確是按照我們設(shè)定的比例,同步產(chǎn)生了縮放。如果縮減 Ingress 服務(wù)實例數(shù),幾分鐘之后,其它工作負(fù)載也會隨之縮容。

$ kubectl scale deployment ingress --replicas=1
deployment.apps/ingress scaled
$ kubectl get pods | cut -d - -f 1 | sort | uniq --count                                                         \
...
   2 backend1
   2 backend2
   2 database
   1 ingress

結(jié)論

雖說云原生架構(gòu)的復(fù)雜性問題越來越被強調(diào),但是這一生態(tài)的宗旨應(yīng)該還是沒有變化——用簡單的透明的手段解決復(fù)雜問題。

責(zé)任編輯:武曉燕 來源: 偽架構(gòu)師
相關(guān)推薦

2022-01-02 08:43:46

Python

2022-02-07 11:01:23

ZooKeeper

2021-05-11 08:54:59

建造者模式設(shè)計

2021-07-02 09:45:29

MySQL InnoDB數(shù)據(jù)

2021-07-06 08:59:18

抽象工廠模式

2023-01-03 08:31:54

Spring讀取器配置

2022-08-26 09:29:01

Kubernetes策略Master

2021-07-05 22:11:38

MySQL體系架構(gòu)

2023-11-28 08:29:31

Rust內(nèi)存布局

2022-08-23 08:00:59

磁盤性能網(wǎng)絡(luò)

2023-11-06 07:38:42

自定義消息管理器

2021-07-02 08:51:29

源碼參數(shù)Thread

2021-09-28 08:59:30

復(fù)原IP地址

2021-10-14 10:22:19

逃逸JVM性能

2022-04-12 08:30:52

回調(diào)函數(shù)代碼調(diào)試

2021-07-16 22:43:10

Go并發(fā)Golang

2023-03-13 21:38:08

TCP數(shù)據(jù)IP地址

2021-10-27 09:59:35

存儲

2022-10-20 07:39:26

2021-04-29 10:18:18

循環(huán)依賴數(shù)組
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区久久 | 999观看免费高清www | 久久黄色 | 免费v片在线观看 | 一区二区三区四区在线 | 国产特黄一级 | 午夜成人免费视频 | 日韩蜜桃视频 | 国产视频一区二区在线观看 | 韩三级在线观看 | 中文字幕一区二区三区乱码在线 | 一区二区三区播放 | 欧美激情精品久久久久久 | 日韩精品人成在线播放 | 亚洲成人在线免费 | 成人中文字幕在线 | 亚洲人成在线播放 | 精品一区二区久久久久久久网站 | 男女视频免费 | 久久免费国产 | 日韩综合在线播放 | 亚洲日本激情 | 精品国产一二三区 | 涩色视频在线观看 | 日韩成人一区 | 日本久草视频 | 夜夜骑天天干 | 日韩在线视频免费观看 | 亚洲视频免费在线播放 | 一区二区中文字幕 | 免费在线观看成年人视频 | 日韩五月天 | 在线免费观看成人 | 福利网址| 久久国产精品-国产精品 | 欧美日韩国产一区二区三区 | 成人在线播放 | 久久精品日产第一区二区三区 | 中文字幕精品一区 | 国产一区二区在线观看视频 | 亚洲一区电影 |