6-Kubernetes節點資源使用問題

Kubernetes系列文章請點選這裡。

6-Kubernetes節點資源使用問題

1、問題描述

叢集排程, work 節點資源使用較高情況下,仍有會很多容器被排程到該節點執行,影響業務執行。

2、問題分析

k8s 叢集排程中,會根據 pod 預留資源值,作為選擇節點排程的一個條件。因此,建議合理對 pod 的設定 QoS,使得節點資源得到更合理利用。

以 JAVA 為例,建議設定 JVM 引數,避免容器被 OOM。

3、問題處理

3。1 POD QoS

3。1。1 分類

Guaranteed:

如果Pod中所有容器的 Resource 定義中的 limit 和 request 都相等且不為0,則這個 Pod 的 QoS 就為 Guaranteed。

Burstable:

如果Pod中所有容器的 Resource 定義中 request 值小於 limit 的值,則這個 Pod 的 QoS 就為 Burstable。

BestEffort:

除如上兩種型別外,其他的Pod QoS Class都是BestEffort,即Pod裡面的所有容器都沒有設定任何 request 和 limit 值,當 limit 值未指定時,其有效值為 Node 的容量值。

3。1。2 優先順序

Guaranteed:是最高優先順序的。只有pod 超出 limit 或者低優先順序的已經殺光了的情況會被殺掉。

Burstable:當pod超出 request 並且沒有更低優先順序的pod 會被殺掉

BestEffort:最低優先順序。記憶體有壓力時首當其衝被殺掉。

對於一些重要的線上應用,我們應該合理設定limit和request,limit和request 設定一致,資源不足時k8s會優先保證這些pod正常執行。

注:記憶體是不可壓縮資源,所以在記憶體低的時候,最低優先順序的容器會被kill。

3。2 POD 排程

以一臺 16C/32G work 節點為例,那麼排程與 QoS 的關係:

假設資源需求為 4C/8G 。如果 POD 的 request 和 limit 的 CPU 和記憶體都設定為4c/8g,這時,POD 為 Guaranteed 型別。那麼該節點最多可被排程執行 4 個同類資源 pod,之後不會再叢集排程;(注:如果設定了 limit 沒有設定 request,那麼k8s 預設會把 request 設定為與 limit 同等值)

假設資源需求為 4C/8G 。如果 POD 的 request CPU 和記憶體設定為2c/4g,而 limit 設定為4c/8g。這時,POD 為 Burstable 型別。那麼該節點最多可被排程執行8個2c/4g資源 pod,之後不會再叢集排程。(注:如果容器的 Request 中資源申請的越多,或者越接近 limit 值,在因資源不足發生驅逐時,其被驅逐的機率越小)

假設資源需求為 4C/8G 。如果 POD 的 request 和 limit 都沒有設定,或者設定為0。這時, POD 為 BestEffort 型別。那麼該節點只要狀態為 Ready,都仍有可能有 pod 被排程到上面執行。即使該節點已經出現資源使用緊張情況。

3。3 POD 設定

為了提高資源利用率。對一些非核心,並且資源不長期佔用的應用,可以適當減少pod的request,這樣pod在排程時可以被分配到資源不是十分充裕的節點,提高使用率。但是當節點的資源不足時,也會優先被驅逐或被oom kill。

因此,當叢集部署應用時,對應高要求的業務,應該把 pod 設定為 Guaranteed。

3。3。1 Guaranteed 型別

資源配置示例:

6-Kubernetes節點資源使用問題

3。3。2 Burstable 型別

資源配置示例:

6-Kubernetes節點資源使用問題

3。3。3 BestEffort型別

不建議 POD 為 BestEffort 型別。這樣,容易直接導致節點資源緊張,仍有大量 pod 被排程執行。造成節點 pod 頻繁 OOM 或者被驅逐,甚至資源問題引起節點宕機。

3。4 應用設定

以 JAVA 為例,在容器平臺上部署的應用通常會記憶體限制,該記憶體限制透過linux cgroup反映到容器內,而java應用預設會獲取宿主機的記憶體大小來作為JVM最大可用記憶體。當宿主機記憶體大於容器記憶體限制時,就會導致容器在佔滿記憶體後被迫停止等問題。

我們應該為每個JAVA 容器設定 JVM 引數。防止容器 OOM。

透過環境變數方式,為容器注入 JVM。yaml 示例:

6-Kubernetes節點資源使用問題

說明:

透過環境變數方式注入容器,需要注意應用啟動程式必須有引用改變數值。否則配置不生效。

官方映象 Tomcat 主要檢視環境變數 JAVA_OPTS 或 CATALINA_OPTS。官方映象openJDK主要檢視 JAVA_OPTS 。

-Xms 是 JVM 初始分配的堆記憶體,預設是物理記憶體的1/64。

-Xmx 是 JVM 最大允許分配的堆記憶體,預設是物理記憶體的1/4。

一般設定 -Xms、-Xmx 相等以避免在每次 GC 後調整堆的大小。如果在 JAVA_OPTS 中只設置了 -Xmx,那麼容器的記憶體限制必須大於 -Xmx,否則會容易引發容器被 oom-kill。

可以使用 -XX:MaxRAM 來限制 JAVA 應用總的使用記憶體。

根據已有的實踐,推薦採用以下規格的配置(需要根據業務實際情況參照壓力測試結果來決定):

頂部