一起學(xué)習(xí)Kubernetes:自動(dòng)擴(kuò)縮容
在 Kubernetes 中,您可以根據(jù)當(dāng)前的資源需求來擴(kuò)展工作負(fù)載。 這使您的集群能夠更靈活、更高效地對資源需求的變化做出反應(yīng)。
縮放工作負(fù)載時(shí),可以增加或減少由工作負(fù)載,或就地調(diào)整副本可用的資源。
第一種方法稱為水平縮放,而第二種方法稱為垂直縮放。
- 水平縮放:運(yùn)行應(yīng)用的多個(gè)實(shí)例
- 垂直縮放:調(diào)整分配給容器的 CPU 和內(nèi)存資源的大小
有手動(dòng)和自動(dòng)方法可以擴(kuò)展工作負(fù)載,重點(diǎn)是自動(dòng)方法。
手動(dòng)擴(kuò)展工作負(fù)載
Kubernetes 支持手動(dòng)擴(kuò)展工作負(fù)載。可以進(jìn)行水平縮放使用 kubeclt CLI。 對于垂直縮放,需要 patch 工作負(fù)載的資源定義。
自動(dòng)擴(kuò)展工作負(fù)載
Kubernetes 也支持工作負(fù)載的自動(dòng)縮放,即自動(dòng)水平縮放和自動(dòng)垂直縮放。
Kubernetes 中的自動(dòng)縮放是指自動(dòng)更新管理一組 Pod 的對象。
水平擴(kuò)展工作負(fù)載
在 Kubernetes 中,可以使用 HorizontalPodAutoscaler (HPA)自動(dòng)水平縮放工作負(fù)載。
它被實(shí)現(xiàn)為 Kubernetes API 資源和控制器并定期調(diào)整數(shù)量副本以匹配觀察到的資源利用率,例如 CPU 或內(nèi)存使用率。
HPA工作流程
HPA
垂直擴(kuò)展工作負(fù)載
功能狀態(tài): Kubernetes v1.25 [stable]
Kubernetes也支持使用 VerticalPodAutoscaler (VPA) 自動(dòng)垂直縮放工作負(fù)載。但與 HPA 不同的是,VPA 默認(rèn)不附帶 Kubernetes,而是一個(gè)單獨(dú)的項(xiàng)目:
VPA項(xiàng)目地址
https://github.com/kubernetes/autoscaler/tree/9f87b78df0f1d6e142234bb32e8acbd71295585a/vertical-pod-autoscaler。
安裝后,可以通過創(chuàng)建CustomResourceDefinitions(CRD),用于定義如何以及何時(shí)縮放托管副本的資源。
注意:需要將 Metrics Server 安裝到集群中,HPA 才能正常工作。
VPA工作流程:
VPA
目前,VPA可以在四種不同的模式下運(yùn)行:
模式 | 描述 |
Auto | 當(dāng)前使用Recreate,將來可能會(huì)更改為原地更新 |
Recreate | VPA 在創(chuàng)建 Pod 時(shí)分配資源請求,并在請求的資源與新建議有顯著差異時(shí)逐出現(xiàn)有Pod 來更新它們,也就是通過重建Pod方式更新資源 |
Initial | VPA 僅在創(chuàng)建 Pod 時(shí)分配資源請求,以后從不更改它們。 |
Off | VPA 不會(huì)自動(dòng)更改 Pod 的資源要求。 |
原地調(diào)整大小的限制
功能狀態(tài): Kubernetes v1.27 [alpha]
目前在不重新啟動(dòng)的情況下就地調(diào)整Pod和容器工作負(fù)載的大小需要 Kubernetes 版本 1.27 或更高版本。
此外,還需要啟用功能門:InPlaceVerticalScaling。
基于集群大小的自動(dòng)縮放
對于需要根據(jù)集群大小(例如或其他系統(tǒng)組件)進(jìn)行擴(kuò)展的工作負(fù)載,可以使用集群比例自動(dòng)縮放器,Cluster Proportional Autoscaler(CPA)。
與 VPA 一樣,CPA不是 Kubernetes 核心的一部分,而是作為其在GitHub 上擁有自己的項(xiàng)目:
CPA項(xiàng)目地址
https://github.com/kubernetes-sigs/cluster-proportional-autoscaler。
Cluster Proportional Autoscaler 監(jiān)視可調(diào)度的數(shù)量節(jié)點(diǎn)并相應(yīng)地核心和縮放目標(biāo)工作負(fù)載的副本數(shù)。
如果副本數(shù)應(yīng)保持不變,則可以使用以下命令根據(jù)群集大小垂直擴(kuò)展工作負(fù)載 Cluster Proportional Vertical Autoscaler。 該項(xiàng)目目前處于測試階段。
當(dāng)群集比例自動(dòng)縮放程序縮放工作負(fù)載的副本數(shù)時(shí),群集比例垂直自動(dòng)縮放程序根據(jù)節(jié)點(diǎn)或核心的數(shù)量調(diào)整工作負(fù)載(例如 Deployment 或 DaemonSet)的資源請求在群集中。
事件驅(qū)動(dòng)的自動(dòng)縮放
還可以根據(jù)事件擴(kuò)展工作負(fù)載,例如使用 Kubernetes 事件驅(qū)動(dòng)的自動(dòng)縮放程序 (KEDA)。
KEDA
KEDA 是一個(gè)輕量級的開源 Kubernetes 事件驅(qū)動(dòng)的自動(dòng)縮放器,DevOps、SRE 和 Ops 團(tuán)隊(duì)使用它來根據(jù)外部事件或觸發(fā)器水平擴(kuò)展 Pod。KEDA 有助于擴(kuò)展本機(jī) Kubernetes 自動(dòng)縮放解決方案的功能,這些解決方案依賴于標(biāo)準(zhǔn)資源指標(biāo),如 CPU 或內(nèi)存。您可以將 KEDA 部署到 Kubernetes 集群中,并使用自定義資源定義 (CRD) 管理 Pod 的擴(kuò)展。
KEDA 是 CNCF 畢業(yè)項(xiàng)目,能夠根據(jù)要處理的事件數(shù)數(shù)量擴(kuò)展工作負(fù)載,例如隊(duì)列中的消息數(shù)。存在多種適配器可供選擇,供不同的事件源使用。
基于計(jì)劃的自動(dòng)縮放
擴(kuò)展工作負(fù)載的另一種策略是計(jì)劃擴(kuò)展操作,例如,為了減少非高峰時(shí)段的資源消耗。
與事件驅(qū)動(dòng)的自動(dòng)縮放類似,這種行為可以結(jié)合使用 KEDA 和 它的 Cron 縮放控制器,允許您定義計(jì)劃,用于向內(nèi)或向外擴(kuò)展工作負(fù)載。
擴(kuò)展群集基礎(chǔ)結(jié)構(gòu)
如果擴(kuò)展工作負(fù)載不足以滿足你的需求,您還可以擴(kuò)展群集基礎(chǔ)結(jié)構(gòu)本身。
集群縮放
擴(kuò)展群集基礎(chǔ)結(jié)構(gòu)通常意味著添加或刪除節(jié)點(diǎn). 這可以使用以下兩個(gè)可用的自動(dòng)縮放程序之一來完成:
- Cluster Autoscaler
- Karpenter
兩個(gè)擴(kuò)展器的工作方式都是監(jiān)視標(biāo)記為不可調(diào)度或未充分利用的節(jié)點(diǎn),然后根據(jù)需要添加或刪除節(jié)點(diǎn)。
總結(jié)
Kubernetes 中的自動(dòng)縮放是指自動(dòng)更新管理Pod的工作負(fù)載,然后工作負(fù)載最終更新Pod定義來實(shí)現(xiàn)自動(dòng)縮放。主要有以下幾種方案:
- HPA:水平縮放,擴(kuò)縮容Pod實(shí)例數(shù)量
- VPA:垂直縮放,擴(kuò)縮容Pod中容器的cpu或mem資源
- CPA:比例縮放,根據(jù)集群大小按比例進(jìn)行HPA
- KEDA:事件驅(qū)動(dòng)縮放,根據(jù)外部事件或觸發(fā)器水平擴(kuò)展 Pod
- 集群節(jié)點(diǎn)縮放:據(jù)需要添加或刪除集群中的worker節(jié)點(diǎn)