如何立足AWS對Amazon EKS進行成本優(yōu)化?這四種方式,輕松又高效!

來源: AWS云計算
作者:AWS云計算
時間:2020-09-10
17229
本文來介紹一項完全托管的Kubernetes服務Amazon Elastic Kubernetes Service(Amazon EKS)。那么該如何立足Amazon Web Services(AWS),對Amazon EKS進行成本優(yōu)化呢?本文將為您提供一些建議,幫助您以更節(jié)省、更高效地方式

你知道最值得信賴的

運行Kubernetes的方式是什么嗎?

嘿嘿,小編今天就來為你介紹一項

完全托管的Kubernetes服務

Amazon Elastic Kubernetes Service

(Amazon EKS)

那么該如何立足Amazon Web Services(AWS)

對Amazon EKS進行成本優(yōu)化呢?

本文將為您提供一些建議

幫助您以更節(jié)省、更高效地方式

在Amazon EKS中運行Kubernetes工作負載

將Amazon Elastic Kubernetes Service(Amazon EKS)提供的全托管Kubernetes控制平面,與運行在Amazon EC2上彈性的Kubernetes工作節(jié)點組合起來,就構成了一套理想的容器化工作負載運行環(huán)境。這不僅使構建者能夠快速創(chuàng)建出Kubernetes集群,同時也能夠按需擴展集群,支持靈活多變的業(yè)務需求。但正確的選擇只是成功的第一步,我們還需要充分考量AWS Well-Architected Framework中提出的成本優(yōu)化支柱原則。

Kubernetes集群的總體運行成本涉及了許多服務,Amazon EKS控制平面是其中最易于理解的部分。接下來,我們還需要有Amazon EC2實例用作Kubernetes集群的工作節(jié)點。而Amazon EC2實例的成本涉及多個方面,除了計算成本還包括塊存儲與數(shù)據(jù)傳輸兩部分。而這兩項成本與實際的工作負載高度相關,所以本文暫時不做深入討論。換個角度,本文將深入研究Amazon EC2成本中最大的兩個方面:實例運行小時數(shù)和實例價格。

Amazon EC2成本=實例運行小時數(shù)x實例價格

在Kubernetes集群當中,實例運行小時數(shù)與集群內的Pod數(shù)量、以及分配給這些Pod的對應資源成正比。

實例運行小時數(shù)=Pod運行小時數(shù)x Pod對應資源

在本文中,我們將通過一下四種技術了解如何將Amazon EC2的資源使用成本降低80%甚至更高:

·Auto Scaling(規(guī)模自動伸縮)——通過使集群內的節(jié)點和pod數(shù)量與需求保持一致,以優(yōu)化實例運行時間。

·Right Sizing(正確調整大?。?/strong>——通過為各Pod分配適當?shù)腃PU與內存資源,以優(yōu)化Pod資源。

·Down Scaling(規(guī)模縮減)——在夜間及周末等非必要時段關閉Pod以優(yōu)化Pod運行小時數(shù)。

·Purchase Options(購買選項)——利用競價實例替代按需實例,以優(yōu)化實例價格。

640.png

Auto Scaling(規(guī)模自動伸縮)

AWS良好架構框架中的成本優(yōu)化支柱,通過專門的章節(jié)討論了“供需匹配”這部分內容,相關建議如下:

“……(供需匹配)可通過Auto Scaling實現(xiàn),它可以幫助您根據(jù)定義的條件自動擴展或縮減Amazon EC2實例和Spot Fleet的容量?!?/em>

因此,在Kubernetes集群上進行成本優(yōu)化的先決條件是確保您已經(jīng)在集群之上使用了Cluster Autoscaler。這款工具能夠在Kubernetes集群中執(zhí)行兩項關鍵功能:

第一,它會監(jiān)控集群中那些由于資源分配不足而無法正常運行的Pod。一旦出現(xiàn)這樣的情況,Cluster Autoscaler都會自動更新Amazon EC2彈性伸縮組,從而在集群當中增加一定數(shù)量的節(jié)點。

第二,Cluster Autoscaler會檢測資源利用率較低的節(jié)點,并將其中的Pod調度到其他節(jié)點之上。接下來,Cluster Autoscaler會自動縮減Auto Scaling組所需的節(jié)點數(shù)量,實現(xiàn)集群規(guī)??s減。

640.png

Amazon EKS用戶指南對Cluster Autoscaler的使用方式做出了詳盡介紹。在配置Cluster Autoscaler時,大家需要注意以下幾點:

服務賬戶的IAM角色——Cluster Autoscaler需要具備對應的訪問權限,才能更新Auto Scaling組中的必要容量參數(shù)。推薦的方法是根據(jù)所需的策略及信任策略創(chuàng)建一個新的IAM角色,借此限制Cluster Autoscaler對于服務賬戶的訪問權限。另外,請務必在服務賬戶上標注該角色的名稱:

apiVersion: v1

kind: ServiceAccount

metadata:

  name: cluster-autoscaler

  annotations:

    eks.amazonaws.com/role-arn: arn:aws:iam::000000000000:role/my_role_name

當Cluster Autoscaler進行橫向擴展時,它會直接增加Auto Scaling組內的節(jié)點數(shù)量,而啟動新Amazon EC2實例的實際任務將由AWS彈性伸縮服務負責執(zhí)行。如果在多個可用區(qū)內都配置了彈性伸縮組,則可以在這些可用區(qū)內啟動新的實例。

對于使用持久存儲卷的部署方案,我們需要在各個可用區(qū)內建立一個獨立的Auto Scaling組。這樣,當Cluster Autoscaler檢測到需要對特定Pod進行橫向擴展的情況時,即可根據(jù)當前可用區(qū)內已經(jīng)存在的持久存儲卷聲明為接下來的擴展節(jié)點操作指定正確的可用區(qū)。

在使用多個Auto Scaling組時,請確保在Cluster Autoscaler的Pod規(guī)范中啟用以下參數(shù):

--balance-similar-node-groups=true

到目前位置,Cluster Autoscaler已經(jīng)可以在集群當中正常運行,實例運行時間(Instance Hours)也將始終與集群內的Pod資源需求量緊密匹配。下一步是根據(jù)特定的Pod指標使用Horizontal Pod Autoscaler(HPA)對Pod數(shù)量進行橫向擴展或縮減,借此優(yōu)化Pod運行小時數(shù)(Pod Hours)以進一步優(yōu)化我們的實例運行小時數(shù)。

640 (1).png

Kubernetes已經(jīng)提供了HPA控制器,因此配置HPA時只需要考慮一項前提,即確保已經(jīng)將Kubernetes指標服務器部署在您的集群中,然后在您的部署中定義HPA資源。例如,以下定義的HPA資源配置將持續(xù)監(jiān)控名為nginx-ingress-controller的部署的CPU使用率。接下來,HPA將在1到5之間擴縮Pod數(shù)量,以確保所有Pod的平均CPU使用率都能達到80%:

apiVersion: autoscaling/v1

kind: HorizontalPodAutoscaler

metadata:

  name: nginx-ingress-controller

spec:

  scaleTargetRef:

    apiVersion: apps/v1

    kind: Deployment

    name: nginx-ingress-controller

  minReplicas: 1

  maxReplicas: 5

  targetCPUUtilizationPercentage: 80

把Cluster Autoscaler與Horizontal Pod Autoscaler相結合,能夠幫助我們將Amazon EC2實例小時數(shù)與集群內所運行工作負載的資源利用率盡可能統(tǒng)一起來。

640 (2).png

Right sizing(正確調整大小)

回到AWS良好架構框架中的成本優(yōu)化支柱部分,在其中的“成本效益資源”章節(jié)處,對Right Sizing的定義為:

“……使用成本最低的資源,同時仍然滿足特定工作負載的技術規(guī)格要求。”

使用Kubernetes,我們可以隨時對Pod內容器的計算、CPU與內存資源進行大小調整,借此找到最合理的配額水平。各個Pod中的容器對于所能夠使用的CPU與內存資源都有著一定的要求及限制。

640 (3).png

請謹慎嘗試,并保證這些資源的實際使用率與業(yè)務需求盡量匹配。如果設定的值太低,則容器可能存在資源不足并影響實際業(yè)務性能。而如果設定的值過高,則會浪費大量資源,導致各容器中都存在一部分未得到使用的資源。在實際利用率低于資源必要值時,我們將二者之間的差額稱為閑置成本(slack cost)。

以kube-resource-report為代表的多種工具能夠對閑置成本進行可視化,同時正確判斷Pod內的容器資源需求。在安裝說明部分,我們可以通過以下helm圖表了解如何安裝這款工具:

$helm upgrade--install kube-resource-report chart/kube-resource-report.

640 (4).png

如以上圖所示,像Jenkins這類應用能夠顯著降低CPU與內存需求,每月可以節(jié)約高達66.53美元的閑置成本。而在對Kubernetes集群內所有應用程序正確調整Pod資源大小之后,我們實現(xiàn)了20%的成本節(jié)約,具體如下圖所示。

640 (5).png

Down scaling(規(guī)??s減)

除了根據(jù)需求的自動擴展之外,AWS良好架構框架成本優(yōu)化支柱中的供需匹配章節(jié)還提出以下建議:

“可以安排系統(tǒng)在特定時間(例如工作日營業(yè)時間開始時)按預定義進行規(guī)模伸縮,借此保證資源始終與用戶需求相匹配。”


在示例集群中,有相當一部分部署方案只需要在營業(yè)時段之內運行。我們可以將kube-downscaler工具部署在集群上,借此根據(jù)一天中的時間對集群資源進行規(guī)模伸縮。下面,我們通過環(huán)境變量為kube-downscaler配置默認運行時間:

640 (6).png

在這種情況下,周一至周五上午5:00至下午7:00以外的所有時間段,集群所有部署節(jié)點資源大小都將設置為0。通過annotation標注,名稱空間與部署可以根據(jù)業(yè)務需求來自定義他們的啟停時間。主要通過設置downscaler/uptime標注來自定義啟停時間,甚至可以通過設置downscaler/exclude標注來禁用該功能。

如下圖所示:

640 (7).png

Amazon CloudWatch–Amazon EC2實例數(shù)量

640 (8).png

Grafana–集群CPU資源使用率

各Amazon EC2實例在啟用規(guī)??s減之后,我們可以減少Pod運行小時數(shù),并借此達成15%的額外資源節(jié)約比例,具體如下圖所示。

640 (9).png

購買選項

AWS良好架構框架成本優(yōu)化支柱中的最后一部分為“購買選項”,相關建議如下:

“競價實例使您以遠低于按需Amazon EC2實例的成本(最高節(jié)約比例達90%)使用AWS中的備用計算資源。”

在Amazon EC2控制臺中查看競價實例的價格歷史記錄時,我們發(fā)現(xiàn)m5.large類型的競價實例,在實際使用成本上始終比按需實例低55%至60%。

640 (10).png

要將您的節(jié)點設定為在競價實例(而非按需實例)上運行,請參閱題為《配合Amazon EKS,在Amazon EC2競價實例上運行您的Kubernetes工作負載(Run your Kubernetes Workloads on Amazon EC2 Spot Instances with Amazon EKS)》的AWS Compute博文。

更多資訊

識別左側二維碼即可訪問將節(jié)點

設定為競價實例上運行的相關博客

需要注意的是,此文在示例中安裝了kube-spot-termination-notice-handler工具以運行自定義終止處理程序。這是一項故障轉移功能,用于在競價實例發(fā)生服務中斷時,將各Pod安全轉移至其他節(jié)點。

除了由競價實例組成的Auto Scaling組之外,對于無法容忍實例意外中斷的各類Pod,大多數(shù)集群還會為其保留一套由按需實例構成的Auto Scaling組。在配置這些節(jié)點時,請注意向各Auto Scaling組內的kubelet傳遞額外參數(shù),借此將各節(jié)點標記為essential或者preemptible:

Essential:--node-labels=kubernetes.io/lifecycle=essential

Preemptible:--node-labels=kubernetes.io/lifecycle=preemptible

接下來,我們可以在容器規(guī)范中使用node affinity,以確保在適當?shù)墓?jié)點上調度容器:

affinity:

nodeAffinity:

requiredDuringSchedulingIgnoredDuringExecution:

nodeSelectorTerms:

-matchExpressions:

-key:"kubernetes.io/lifecycle"

operator:"In"

values:

-essential

在將大多數(shù)節(jié)點轉移至競價實例之后,我們能夠降低實例的運行成本,實現(xiàn)了40%的額外費用節(jié)約,如下圖所示。請注意,面向競價實例的轉移不會對使用方式造成影響,只是大幅降低了資源使用費率。

640 (11).png

總結

通過自動擴縮集群中節(jié)點及Pod,正確調整分配給Pod中容器的資源的大小,縮減業(yè)務時段以外的部署規(guī)模,并將大部分Pod轉移至競價實例,能夠為Kubernetes集群節(jié)省超過80%的Amazon EC2實例成本。這四種重要的方式,均來自AWS良好架構構架中成本優(yōu)化支柱原則所提到的最佳實踐。事實也再次證明,這些建議確實能夠幫助客戶以更節(jié)省和更高效地方式在Amazon EKS中運行Kubernetes工作負載。

立即登錄,閱讀全文
版權說明:
本文內容來自于AWS云計算,本站不擁有所有權,不承擔相關法律責任。文章內容系作者個人觀點,不代表快出海對觀點贊同或支持。如有侵權,請聯(lián)系管理員(zzx@kchuhai.com)刪除!