Kubernetes優秀實踐:如何正確設置資源請求和限制?
譯文?譯者 | 布加迪
審校 | 孫淑娟
Kubernetes是一個動態系統,可以自動適應用戶工作負載的資源利用率。
Kubernetes有兩個擴展級別。每個單獨的Kubernetes部署都可以使用Horizontal Pod Autoscaler(HPA)來自動擴展,而整個集群使用Cluster Autoscaler來擴展。HPA監測部署中各個pod的目標指標(通常是CPU或內存使用情況),必要時添加或刪除pod,使該指標接近指定的目標。同時,Cluster Autoscaler處理集群本身的擴展。它監視無法調度的pod,并為集群添加節點或從集群刪除節點,以容納這些pod。
Kubernetes支持這兩種擴展操作的一項關鍵特性是,能夠針對工作負載設置特定的資源請求和限制。通過為每個pod使用多少CPU和內存設置合理的限制和請求,您可以盡量提高基礎架構的利用率,同時確保應用程序性能很高。想最大限度地有效利用Kubernetes集群,正確設置資源限制和請求很重要。對應用程序設置過低的限制會導致問題。比如說,如果內存限制太低,Kubernetes一定會因應用程序違反限制而終止它。與此同時,如果把限制設置得太高,就會因過度分配而浪費資源,這意味著最終支付更高的費用。
雖然Kubernetes優秀實踐要求您應該始終對工作負載設置資源限制和請求,但知道為每個應用程序使用什么樣的值并非總是易事。因而,一些團隊從不設置請求或限制,而另一些團隊在初始測試過程中設置得過高,然后從不確保設置正確。確保擴展操作合理的關鍵是,對每個工作負載正確設置資源限制和請求,以便工作負載有效地運行。
設置資源限制和請求是在Kubernetes集群上盡可能高效、可靠地運行應用程序的關鍵。
1、如何設置Kubernetes資源?
Fairwinds的開源項目Goldilocks幫助團隊將資源分配給他們的Kubernetes部署,并做好這些資源的調校。Goldilocks是一個Kubernetes控制器,收集運行中的pod方面的數據,并就如何設置資源請求和限制提供建議。它可以幫助組織了解資源使用情況、資源成本和確保效率的優秀實踐。Goldilocks使用Kubernetes Vertical Pod Autoscaler(VPA)。它考慮到工作負載以往的內存和CPU使用情況,以及pod的當前資源使用情況,以便建議如何設置資源請求和限制。(雖然VPA可以為您設置限制,但通常最好只使用VPA引擎來提供建議。)實際上,該工具為命名空間中的每個部署創建一個VPA,然后查詢該VPA以獲取信息。
要查看這些建議,必須使用Kubectl來查詢每個VPA對象,這對于大中型部署來說很快會變得繁瑣。這時候儀表板就有了用武之地。一旦您的VPA部署到位,建議會出現在Goldilocks儀表板中。
儀表板根據您希望為部署獲得的服務質量(QoS)類別提供兩種類型的建議:
保證式,這意味著應用程序將被授予比其他工作負載更高的優先級,以便保證可用資源。在這個類別中,您將資源請求和限制設置為完全相同的值,這將保證在調度時容器請求的資源對其可用。這個QoS類別通常適合最穩定的Kubernetes集群。
突發式,這意味著應用程序將保證得到最低數量的資源,但如果資源可用,將獲得更多的資源。實際上,您的資源請求低于限制。調度程序將使用請求將pod放置到節點上,但隨后pod可以在被終止或遏制之前使用更多的資源,直至達到上限。在決定資源匱乏時刪除哪些工作負載時,該QoS類別被授予較低的優先級。
儀表板為保證式和突發式QoS類別提供了建議。在保證式類別中,我們建議將請求和限制設置為VPA“目標”字段。
注意,第三個QoS類別:盡力式(BestEffort)意味著不設置請求或限制,只有當所有其他請求都得到滿足時才為應用程序分配資源。不建議使用盡力式。
2、為集群使用專門的實例組
如果您對微調實例(工作負載在其上面運行)感興趣,可以使用不同的實例組類型和節點標簽將工作負載引導到特定的實例類型。
不同的業務系統常常有不同大小的資源需求,以及專門的硬件需求(比如GPU)。Kubernetes中的節點標簽概念讓您可以將標簽放在所有不同的節點上。同時,pod經過配置后,可以使用特定的“nodeSelectors”以匹配特定的節點標簽,這些標簽決定了pod可以調度到哪些節點上。通過利用具有適當標記的不同實例類型的實例組,您可以將所選擇的云提供商提供的底層硬件與Kubernetes中的工作負載混合搭配。
如果您有不同大小、不同需求的工作負載,將這些工作負載放在不同的實例類型上,并使用標簽將工作負載引導到這些不同的實例類型上從戰略上和成本上來說都是明智之舉。
競價實例(spot instance)與這一想法密切有關。大多數組織熟悉按需購買實例或在固定期限內按保留條款購買實例的模式。但是如果工作負載可能被中斷,您可能需要考慮使用競價實例。這種實例讓您可以以相當大的折扣使用云提供商的剩余容量,面臨的風險是對常規按需實例的需求加大時,您的實例可能會被終止。
如果您的某些業務工作負載可以容忍實例隨機終止的風險,那么可使用同樣的節點標簽概念,將這些工作負載專門調度到這些類型的實例組上,從而大幅節省成本。
3、如何使用Kubernetes資源方面的建議?
Goldilocks是Fairwinds Insights用于提供工作負載效率和性能優化的工具之一。有了Fairwinds Insights,Goldilocks可以跨多個集群部署,這樣團隊可以通過單一管理平臺獲得信息。Fairwinds Insights為Goldilocks添加了數據和建議,包括潛在的成本節約。出現的儀表板包括命名空間和部署列表,附有平均總成本和成本方面的建議。
許多組織將CPU和內存請求及限制設置過高,所以當它們運用Fairwinds Insights的建議時,能夠將更多的pod放在更少的Kubernetes worker節點上。啟用Cluster Autoscaler后,任何多余的節點都將在它們不使用時被刪除,這節省了時間和資金。
使用像Fairwinds Insights這樣的軟件或像Goldilocks這樣的開源工具,開發人員可以通過為自己自動建議來避免不靠譜的猜測。反過來,這讓您有機會提高集群效率和減少云開銷。
原文鏈接:https://www.cncf.io/blog/2022/10/20/kubernetes-best-practice-how-to-correctly-set-resource-requests-and-limits/