容器的資源需求和資源限制
requests:需求,最低保障, 保證被調度的節點上至少有的資源配額
limits:限制,硬限制, 容器可以分配到的最大資源配額
QoS Classes分類
如果Pod中所有Container的所有Resource的limit和request都相等且不為0,則這個Pod的QoS Class就是Guaranteed。
注意,如果一個容器只指明了limit,而未指明request,則表明request的值等於limit的值。
Burstable
至少有一個容器設置CPU或內存資源的requests屬性
Best-Effort
如果Pod中所有容器的所有Resource的request和limit都沒有賦值,則這個Pod的QoS Class就是Best-Effort.
Qos Class優先級排名
Guaranteed > Burstable > Best-Effort
可壓縮資源與不可壓縮資源
Pod 使用的資源最重要的是 CPU、內存和磁盤 IO,這些資源可以被分為可壓縮資源(CPU)和不可壓縮資源(內存,磁盤 IO)。
可壓縮資源(CPU)不會導致pod被驅逐
因為當 Pod 的 CPU 使用量很多時,系統可以通過重新分配權重來限制 Pod 的 CPU 使用
不可壓縮資源(內存)則會導致pod被驅逐
於不可壓縮資源來說,如果資源不足,也就無法繼續申請資源(內存用完就是用完了),此時 Kubernetes 會從該節點上驅逐一定數量的 Pod,以保證該節點上有充足的資源。
那么,Kubernetes 為 Pod 設置這樣三種 QoS 類別,具體有什么作用呢?實際上,QoS 划分的主要應用場景,是當宿主機資源緊張的時候,kubelet 對 Pod 進行 Eviction(即資源回收)時需要用到的。具體地說,當 Kubernetes 所管理的宿主機上不可壓縮資源短缺時,就有可能觸發 Eviction。比如,可用內存(memory.available)、可用的宿主機磁盤空間(nodefs.available),以及容器運行時鏡像存儲空間(imagefs.available)等等。
目前,Kubernetes 為你設置的 Eviction 的默認閾值如下所示:
memory.available<100Mi
nodefs.available<10%
nodefs.inodesFree<5%
imagefs.available<15%
當然,上述各個觸發條件在 kubelet 里都是可配置的。比如下面這個例子:
kubelet --eviction-hard=imagefs.available<10%,memory.available<500Mi,nodefs.available<5%,nodefs.inodesFree<5% --eviction-soft=imagefs.available<30%,nodefs.available<10% --eviction-soft-grace-period=imagefs.available=2m,nodefs.available=2m --eviction-max-pod-grace-period=600
在這個配置中,你可以看到 Eviction 在 Kubernetes 里其實分為 Soft 和 Hard 兩種模式。
其中,Soft Eviction 允許你為 Eviction 過程設置一段“優雅時間”,比如上面例子里的 imagefs.available=2m,就意味着當 imagefs 不足的閾值達到 2 分鍾之后,kubelet 才會開始 Eviction 的過程。
而 Hard Eviction 模式下,Eviction 過程就會在閾值達到之后立刻開始。Kubernetes 計算 Eviction 閾值的數據來源,主要依賴於從 Cgroups 讀取到的值,以及使用 cAdvisor 監控到的數據。當宿主機的 Eviction 閾值達到后,就會進入 MemoryPressure 或者 DiskPressure 狀態,從而避免新的 Pod 被調度到這台宿主機上。而當 Eviction 發生的時候,kubelet 具體會挑選哪些 Pod 進行刪除操作,就需要參考這些 Pod 的 QoS 類別了。首當其沖的,自然是 BestEffort 類別的 Pod。其次,是屬於 Burstable 類別、並且發生“飢餓”的資源使用量已經超出了 requests 的 Pod。最后,才是 Guaranteed 類別。並且,Kubernetes 會保證只有當 Guaranteed 類別的 Pod 的資源使用量超過了其 limits 的限制,或者宿主機本身正處於 Memory Pressure 狀態時,Guaranteed 的 Pod 才可能被選中進行 Eviction 操作。當然,對於同 QoS 類別的 Pod 來說,Kubernetes 還會根據 Pod 的優先級來進行進一步地排序和選擇。