6個優化策略,助你降低K8S成本

2023-04-27 12:01:04

Kubernetes 早已成為容器編排引擎的事實標準,而隨著 Kubernetes 環境的複雜性持續增長,成本也在不斷攀升。CNCF 釋出的調查報告《Kubernetes 的 FinOps》顯示,68%的受訪者表示 Kubernetes 開銷正在上漲,並且一半的人所在的組織經歷了每年超過20%的開銷增長。
 

因此,Kubernetes 成本管理和優化亟需得到系統管理員的重視。本文我們將瞭解6個優化 Kubernetes 成本的策略和方法。
 

1、合理調整 Pod 和節點

降低成本最簡單的方式之一是管理 Pod 和節點使用的資源。儘管通常的建議是留有足夠的機動空間,但過度設定或允許應用程式無限制地使用資源會帶來災難性的後果。例如,假設一個Pod由於應用程式的錯誤而消耗了節點的所有可用記憶體,不必要地利用了資源,這會導致其他 Pod 完全沒有資源可用。
 

為避免這一情況的發生,使用者可以在名稱空間級別用 Kubernetes 資源配額和限制區間來限制資源利用率。此外,還可以在容器層面上指定資源請求和限制,強制執行容器可以請求多少資源以及資源的最大限制。
 

節點的大小取決於 Pod 所使用的資源。如果你的工作負載只利用了節點中50%的資源,並且短期內資源使用量不會激增,那麼使用者可以適當縮小節點的規模以降低成本。
 

另一個考慮因素是調整在單個節點上可以執行的 Pod 數量。即便在沒有硬性限制的情況下,在單個節點上執行大量的 Pod 也會導致資源利用效率低下。鑑於這類情況,一部分K8S的託管服務提供商已經限制了單個節點上可以執行 Pod 的數量。
 

2、監控叢集和基礎設施

合理監控叢集環境,包括底層或依賴項資源,有助於管理成本。無論你是使用託管的 Kubernetes 叢集還是自建的叢集,監控資源利用率和總體成本都是降低成本的第一步,這能夠讓使用者一目瞭然地瞭解計算、儲存、網路利用率等情況,以及成本在它們之間的分佈情況。
 

雲廠商通常能夠提供內建工具和基本的監控功能。而利用 Prometheus、Kubecost 等工具可以讓使用者獲得更為全面的洞察。近日釋出的應用統一部署與管理平臺 Seal AppManager 中也內建了成本管理檢視,提供 Kubernetes 的資源開銷、共用費用(如空閒費用、管理費用)的成本彙算和分攤,並內建多維度成本分析檢視為使用者提供成本洞察。另外,使用者也可以依據叢集、專案、應用等維度自定義成本檢視。


 

3、設定彈性伸縮

Kubernetes 支援3類彈性伸縮:

  • HPA:自動水平伸縮
  • VPA:垂直自動伸縮
  • 叢集自動伸縮
     

自動充分利用 Kubernetes 彈性伸縮的特性可以幫助使用者以一種簡單、高效的方式降低整體 Kubernetes 成本。
 

HPA 可以監控 Pod 的使用情況,自動調整大小,以保持預期的使用水平。VPA 則可以調整叢集中的資源請求和容器限制。自動伸縮會根據需求自動從 Kubernetes 叢集中新增或刪除節點,它有助於確保工作負載總是有足夠的基礎設施資源來完成它們的工作,但又不至於讓使用者最終為閒置的基礎設施付費。
 

現階段而言,並非所有的 Kubernetes 服務或發行版都支援自動伸縮。但是,如果你所採用的服務支援,那麼它可以幫助你大幅降低 Kubernetes 成本。
 

4、為 K8s 工作負載選擇不同的購買策略

對於 AWS 或者 GCP 來說,按需範例是最昂貴的選項。因此,我們應該充分利用預留的範例甚至是 Spot instances(競價型範例)。
 

相較於按需價格,Spot instances 最高可獲得90%的折扣(即1折)。它們是短期工作或無狀態服務的最佳選擇,可以快速重新排程,同時不會丟失資料。為避免中斷,使用者可以使用工作負載管理工具,將 Spot 範例保留在某個固定時段內。
 

為每個節點都規劃購買策略,並在可能的情況下優先使用 Spot 範例,以充分利用購買折扣。如果 Spot 範例不適合你的工作負載,比如你的容器正在執行資料庫,那麼可以購買具備穩定可用性的節點。在任何情況下,儘量減少使用按需資源。
 

5、Kubernetes 排程

調整 Pod 和節點的大小和規模後,需要確保 pod 被排程到了正確的節點上。K8s 排程流程將 Pod 與節點相匹配,並且排程器的預設行為可以自定義。假設你想把具有關鍵業務功能的容器放在一個高效能的節點上,而把其他不太關鍵的元件放在相對較低效能的節點上。預設情況下,即便在不同效能層上設定節點,K8s 也無法匹配正確的節點。
 

如果一個非關鍵的pod被安排在一個高效能的節點上,會導致效能浪費並最終提高成本。Kubernetes 提供諸如 nodeSelector、親和性以及汙點和容忍等特性以解決此類問題並優化排程。它們可以用來完全設定Kubernetes的排程過程,以滿足使用者的需求,從而使使用者能夠有效地使用整個節點的可用資源。
 

6、簡化開發

儘管容器化的浪潮愈演愈烈,但並不意味著一切都需要容器化。一些開發團隊試圖為了容器化而容器化應用程式或工作負載,這可能會導致在 Kubernetes 叢集上執行不必要的工作負載。這類工作負載在其他技術上也可以輕鬆執行,並且成本會更低。譬如,可以將無伺服器技術用於基於事件的特性,而主要將 Kubernetes 用於高可用性和關鍵任務的功能。
 

總結

成本管理並不總是開發人員的最高優先順序,但是確實是必須考慮的方面。正確的解決方案可以使Kubernetes的成本管理變得及時、經濟和毫不費力,使企業能夠在成本和效能之間實現完美的平衡。
 

利用不同的雲供應商建立多雲環境可以使使用者從每個平臺提供的折扣中獲益,甚至可以在平臺之間遷移工作負載以選擇最優惠的選項,同時不會出現服務中斷或服務質量下降的情況。另外,也可以選擇使用不同的技術,將功能解除安裝到最符合要求的技術或服務上。這種選擇可以在有效管理整個應用程式的同時,更深度地管理成本。