6個優(yōu)化策略,助你降低K8S成本

Kubernetes 早已成為容器編排引擎的事實標(biāo)準(zhǔn),而隨著 Kubernetes 環(huán)境的復(fù)雜性持續(xù)增長,成本也在不斷攀升。CNCF 發(fā)布的調(diào)查報告《Kubernetes 的 FinOps》顯示,68%的受訪者表示 Kubernetes 開銷正在上漲,并且一半的人所在的組織經(jīng)歷了每年超過20%的開銷增長。
?
因此,Kubernetes 成本管理和優(yōu)化亟需得到系統(tǒng)管理員的重視。本文我們將了解6個優(yōu)化 Kubernetes 成本的策略和方法。
?
1、合理調(diào)整 Pod 和節(jié)點
降低成本最簡單的方式之一是管理 Pod 和節(jié)點使用的資源。盡管通常的建議是留有足夠的機動空間,但過度配置或允許應(yīng)用程序無限制地使用資源會帶來災(zāi)難性的后果。例如,假設(shè)一個Pod由于應(yīng)用程序的錯誤而消耗了節(jié)點的所有可用內(nèi)存,不必要地利用了資源,這會導(dǎo)致其他 Pod 完全沒有資源可用。
?
為避免這一情況的發(fā)生,用戶可以在命名空間級別用 Kubernetes 資源配額和限制區(qū)間來限制資源利用率。此外,還可以在容器層面上指定資源請求和限制,強制執(zhí)行容器可以請求多少資源以及資源的最大限制。
?
節(jié)點的大小取決于 Pod 所使用的資源。如果你的工作負載只利用了節(jié)點中50%的資源,并且短期內(nèi)資源使用量不會激增,那么用戶可以適當(dāng)縮小節(jié)點的規(guī)模以降低成本。
?
另一個考慮因素是調(diào)整在單個節(jié)點上可以運行的 Pod 數(shù)量。即便在沒有硬性限制的情況下,在單個節(jié)點上運行大量的 Pod 也會導(dǎo)致資源利用效率低下。鑒于這類情況,一部分K8S的托管服務(wù)提供商已經(jīng)限制了單個節(jié)點上可以運行 Pod 的數(shù)量。
?
2、監(jiān)控集群和基礎(chǔ)設(shè)施
合理監(jiān)控集群環(huán)境,包括底層或依賴項資源,有助于管理成本。無論你是使用托管的 Kubernetes 集群還是自建的集群,監(jiān)控資源利用率和總體成本都是降低成本的第一步,這能夠讓用戶一目了然地了解計算、存儲、網(wǎng)絡(luò)利用率等情況,以及成本在它們之間的分布情況。
?
云廠商通常能夠提供內(nèi)置工具和基本的監(jiān)控功能。而利用 Prometheus、Kubecost 等工具可以讓用戶獲得更為全面的洞察。近日發(fā)布的應(yīng)用統(tǒng)一部署與管理平臺 Seal AppManager 中也內(nèi)置了成本管理視圖,提供 Kubernetes 的資源開銷、共享費用(如空閑費用、管理費用)的成本匯算和分攤,并內(nèi)置多維度成本分析視圖為用戶提供成本洞察。另外,用戶也可以依據(jù)集群、項目、應(yīng)用等維度自定義成本視圖。

?
3、配置彈性伸縮
Kubernetes 支持3類彈性伸縮:
HPA:自動水平伸縮
VPA:垂直自動伸縮
集群自動伸縮
?
自動充分利用 Kubernetes 彈性伸縮的特性可以幫助用戶以一種簡單、高效的方式降低整體 Kubernetes 成本。
?
HPA 可以監(jiān)控 Pod 的使用情況,自動調(diào)整大小,以保持預(yù)期的使用水平。VPA 則可以調(diào)整集群中的資源請求和容器限制。自動伸縮會根據(jù)需求自動從 Kubernetes 集群中添加或刪除節(jié)點,它有助于確保工作負載總是有足夠的基礎(chǔ)設(shè)施資源來完成它們的工作,但又不至于讓用戶最終為閑置的基礎(chǔ)設(shè)施付費。
?
現(xiàn)階段而言,并非所有的 Kubernetes 服務(wù)或發(fā)行版都支持自動伸縮。但是,如果你所采用的服務(wù)支持,那么它可以幫助你大幅降低 Kubernetes 成本。
?
4、為 K8s 工作負載選擇不同的購買策略
對于 AWS 或者 GCP 來說,按需實例是最昂貴的選項。因此,我們應(yīng)該充分利用預(yù)留的實例甚至是 Spot instances(競價型實例)。
?
相較于按需價格,Spot instances 最高可獲得90%的折扣(即1折)。它們是短期工作或無狀態(tài)服務(wù)的最佳選擇,可以快速重新調(diào)度,同時不會丟失數(shù)據(jù)。為避免中斷,用戶可以使用工作負載管理工具,將 Spot 實例保留在某個固定時段內(nèi)。
?
為每個節(jié)點都規(guī)劃購買策略,并在可能的情況下優(yōu)先使用 Spot 實例,以充分利用購買折扣。如果 Spot 實例不適合你的工作負載,比如你的容器正在運行數(shù)據(jù)庫,那么可以購買具備穩(wěn)定可用性的節(jié)點。在任何情況下,盡量減少使用按需資源。
?
5、Kubernetes 調(diào)度
調(diào)整 Pod 和節(jié)點的大小和規(guī)模后,需要確保 pod 被調(diào)度到了正確的節(jié)點上。K8s 調(diào)度流程將 Pod 與節(jié)點相匹配,并且調(diào)度器的默認行為可以自定義。假設(shè)你想把具有關(guān)鍵業(yè)務(wù)功能的容器放在一個高性能的節(jié)點上,而把其他不太關(guān)鍵的組件放在相對較低性能的節(jié)點上。默認情況下,即便在不同性能層上配置節(jié)點,K8s 也無法匹配正確的節(jié)點。
?
如果一個非關(guān)鍵的pod被安排在一個高性能的節(jié)點上,會導(dǎo)致性能浪費并最終提高成本。Kubernetes 提供諸如 nodeSelector、親和性以及污點和容忍等特性以解決此類問題并優(yōu)化調(diào)度。它們可以用來完全配置Kubernetes的調(diào)度過程,以滿足用戶的需求,從而使用戶能夠有效地使用整個節(jié)點的可用資源。
?
6、簡化開發(fā)
盡管容器化的浪潮愈演愈烈,但并不意味著一切都需要容器化。一些開發(fā)團隊試圖為了容器化而容器化應(yīng)用程序或工作負載,這可能會導(dǎo)致在 Kubernetes 集群上運行不必要的工作負載。這類工作負載在其他技術(shù)上也可以輕松運行,并且成本會更低。譬如,可以將無服務(wù)器技術(shù)用于基于事件的特性,而主要將 Kubernetes 用于高可用性和關(guān)鍵任務(wù)的功能。
?
總結(jié)
成本管理并不總是開發(fā)人員的最高優(yōu)先級,但是確實是必須考慮的方面。正確的解決方案可以使Kubernetes的成本管理變得及時、經(jīng)濟和毫不費力,使企業(yè)能夠在成本和性能之間實現(xiàn)完美的平衡。
?
利用不同的云供應(yīng)商建立多云環(huán)境可以使用戶從每個平臺提供的折扣中獲益,甚至可以在平臺之間遷移工作負載以選擇最優(yōu)惠的選項,同時不會出現(xiàn)服務(wù)中斷或服務(wù)質(zhì)量下降的情況。另外,也可以選擇使用不同的技術(shù),將功能卸載到最符合要求的技術(shù)或服務(wù)上。這種選擇可以在有效管理整個應(yīng)用程序的同時,更深度地管理成本。