Kubernetes容器資源要求-第2部分:CPU

CPU請求,限制,保證或可擴展?

Kubernetes容器資源要求-第2部分:CPU

在第1部分中,我們研究了Kubernetes(K8)的請求和限制資源要求的含義,以及Docker容器運行時內存的含義。 在本文中,我們將介紹K8中CPU的含義,請求和限制在這種情況下的含義,以及如何為您的組件確定合適的配置。

CPU的意義

那麼,CPU在K8中的確切含義是什麼? 一個CPU完全等同於節點操作系統提供的一個CPU,無論該提供的CPU是映射到物理內核,物理內核的超線程還是EC2 vCPU(其本身就是超線程)。 物理核心的線程)。

限度 Limits

與內存相比,CPU在K8s看來是可壓縮的,這意味著它可以被節流。 當您指定容器的CPU限制時,實際上是在所有節點的CPU上限制其CPU時間,而不是將容器設置為對特定CPU或一組CPU的親和力。 這意味著,即使您指定的限制少於節點上的CPU總數,您的容器仍會看到(並使用)該節點的所有CPU,這只是有限的時間。

例如,在具有8個CPU的節點上將CPU限制指定為4意味著該容器將使用等效的4個CPU,但分佈在所有CPU上。 對於在專用節點上運行的單個容器,在此示例中,所有節點CPU上的最大允許CPU使用率將為50%。

那麼,這如何轉換為Docker? K8s通過傳遞cpu-period和cpu-quota選項來控制CPU限制。 cpu-period始終設置為100000µs(100毫秒),表示跟蹤容器CPU利用率的時間段。 cpu-quota是容器在每個cpu期間可以使用的CPU時間總量。 這兩個設置都控制著內核的完全公平調度程序(CFS)。 以下是不同的K8s CPU限制如何轉換為Docker配置的信息:

· 限制1:cpu-quota = 100000

· 限制4:cpu-quota = 400000

· 限制0.5:cpu-quota = 50000

限制1表示每100毫秒可使用100%的等效1個CPU,限制4表示每100毫秒可使用400%的等效1個CPU(即等效4個CPU),依此類推。 別忘了,這分佈在所有CPU中。 由於CFS配額的工作方式,在給定時期內超出其配額的任何容器都將不允許再次運行,直到下一個時期-這意味著您可能會注意到莫名其妙的暫停,尤其是在您的組件受CPU限制且對延遲敏感的情況下。

要求 Request

對於每個內存,您可以通過指定組件的請求來指定組件所需的CPU(或CPU的分數)-在調度組件時會考慮到這一點,並且K8不允許在CPU方面超額預定節點(累積容器)請求不能超過該工作程序節點上顯示的CPU數量)。您可以保證具有相等數量的CPU,但是當工作節點承受過多負載時,例如在100%CPU利用率和/或平均負載過高的情況下會發生什麼?在此,容器的CPU調度優先級由請求配置值確定,該值乘以1024並作為cpu-shares選項傳遞給Docker。這純粹是一個權重。如果節點上運行的所有容器具有相等的權重,則在負載過大的情況下(沒有空閒的CPU週期時),所有容器將具有相同的CPU調度優先級。如果一個容器的重量比其他容器大,則在負載過大的情況下,它將具有更高的CPU調度優先級,並比其他容器具有更多的CPU時間。

保證還是可爆?

對於第1部分,可突發的QoS配置意味著您的容器可以在不被其他地方使用的情況下,通過機會來節省額外的CPU時間。 這樣可以潛在地更有效地利用基礎資源,但具有更大的不可預測性,例如,受CPU約束的組件的等待時間可能會受到同一工作節點(嘈雜的鄰居)上其他容器的短暫共置的影響,從而莫名其妙地受到影響。 在最壞的情況下,給定工作節點上足夠多的可破裂容器會導致過多的負載,從而破壞所有人的工作。

同樣,如果您不熟悉K8,最好通過設置與請求相同的限制來確保使用QoS保證類來確保可預測性。 當您更好地瞭解堆棧的資源利用特性,並可能發現您在CPU方面的配置已過剩時,您可以考慮引入Burstable容器,以期獲得更大的收益,甚至可能降低總體佔用空間。

多少個CPU?

您應該為容器分配多少個CPU? 不幸的是,這裡沒有一種千篇一律的答案,它取決於組件的特性,可接受的性能,容器放置策略,雲實例類型,成本等。 抱歉。

但是-如果您擁有良好的儀器,並且像手背一樣瞭解組件,則可以在性能測試環境中甚至在生產環境中嘗試各種配置。 您可能正在尋找在成本和性能之間取得平衡的最佳位置,但是在Hotels.com,我們發現容器節流是我們在Linux上運行的CPU密集型組件的重要因素。 我們通常使用Prometheus來確定有用的容器限制統計信息,但是另一種怪異的方法是跳入容器本身並檢查cgroup CPU記帳統計信息:

cat /sys/fs/cgroup/cpu,cpuacct/cpu.stat

這為您提供了調度程序週期的總數,容器被節流的總次數以及累積節流時間(以納秒為單位)。

總結

希望您現在知道容器資源要求,QoS類以及在K8和Docker上下文中意味著什麼內存和CPU。 此處的主要要點是確保您瞭解組件的資源利用特徵並適當地配置其請求和限制,以使您充分利用群集資源並使其與其他組件協調工作。

請務必關注TheHotels.com技術博客,以獲得更多與K8s相關的優勢!


(本文翻譯自Will Tomlin的文章《Kubernetes Container Resource Requirements — Part 2: CPU》,參考:
https://medium.com/expedia-group-tech/kubernetes-container-resource-requirements-part-2-cpu-83ca227a18b1)


分享到:


相關文章: