Kubelet 能夠主動監測和防止計算資源的全面短缺。 在資源短缺的情況下,kubelet 可以主動地結束一個或多個 Pod 以回收短缺的資源。 當 kubelet 結束一個 Pod 時,它將終止 Pod 中的所有容器,而 Pod 的 Phase 將變為 Failed。 如果被驅逐的 Pod 由 Deployment 管理,這個 Deployment 會建立另一個 Pod 給 Kubernetes 來排程。 配置資源不足時的處理方式:
驅逐訊號
kubelet 支援按照以下訊號觸發驅逐決定。
驅逐閾值
kubelet支援指定驅逐閾值,用於觸發 kubelet 回收資源。 每個閾值形式如下:
[eviction-signal][operator][quantity]
合法的 eviction-signal 標誌如上圖所示。
operator 是所需的關係運算子,例如 <,>。
quantity 是驅逐閾值值標誌,例如 1Gi。合法的標誌必須匹配 Kubernetes 使用的數量表示。 驅逐閾值也可以使用 % 標記表示百分比。
舉例說明,如果一個節點有 10Gi 記憶體,希望在可用記憶體下降到 1Gi 以下時引起驅逐操作, 則驅逐閾值可以使用下面任意一種方式指定(但不是兩者同時)。
memory.available<10%
memory.available<1Gi
軟碟機逐閾值
軟碟機逐閾值使用一對由驅逐閾值和管理員必須指定的寬限期組成的配置對。在超過寬限期前,kubelet不會採取任何動作回收和驅逐訊號關聯的資源。如果沒有提供寬限期,kubelet啟動時將報錯。
此外,如果達到了軟碟機逐閾值,操作員可以指定從節點驅逐 pod 時,在寬限期內允許結束的 pod 的最大數量。 如果指定了 pod.Spec.TerminationGracePeriodSeconds 值, kubelet 將使用它和寬限期二者中較小的一個。 如果沒有指定,kubelet將立即終止 pod,而不會優雅結束它們。
軟碟機逐閾值的配置支援下列標記:
硬驅逐閾值
硬驅逐閾值沒有寬限期,一旦察覺,kubelet將立即採取行動回收關聯的短缺資源。 如果滿足硬驅逐閾值,kubelet將立即結束 pod 而不是優雅終止。
硬驅逐閾值的配置支援下列標記: eviction-hard 描述了驅逐閾值的集合(例如 memory.available<1Gi),如果滿足條件將觸發 pod 驅逐。
驅逐監控時間間隔
kubelet 根據其配置的整理時間間隔計算驅逐閾值。 housekeeping-interval 是容器管理時間間隔。
驅逐終端使用者的 pod
如果 kubelet 在節點上無法回收足夠的資源,kubelet將開始驅逐 pod。
kubelet 首先根據他們對短缺資源的使用是否超過請求來排除 pod 的驅逐行為, 然後通過優先順序, 然後通過相對於 pod 的排程請求消耗急需的計算資源。
kubelet 按以下順序對要驅逐的 pod 排名:
- BestEffort 或 Burstable,其對短缺資源的使用超過了其請求,此類 pod 按優先順序排序,然後使用高於請求。
- Guaranteed pod 和 Burstable pod,其使用率低於請求,最後被驅逐。 Guaranteed Pod 只有為所有的容器指定了要求和限制並且它們相等時才能得到保證。 由於另一個 Pod 的資源消耗,這些 Pod 保證永遠不會被驅逐。 如果系統守護程式(例如 kubelet、docker、和 journald)消耗的資源多於通過 system-reserved 或 kube-reserved 分配保留的資源,並且該節點只有 Guaranteed 或 Burstable Pod 使用少於剩餘的請求,然後節點必須選擇驅逐這樣的 Pod 以保持節點的穩定性並限制意外消耗對其他 pod 的影響。 在這種情況下,它將首先驅逐優先順序最低的 pod。
必要時,kubelet會在遇到 DiskPressure 時逐個驅逐 Pod 來回收磁碟空間。 如果 kubelet 響應 inode 短缺,它會首先驅逐服務質量最低的 Pod 來回收 inodes。 如果 kubelet 響應缺少可用磁碟,它會將 Pod 排在服務質量範圍內,該服務會消耗大量的磁碟並首先結束這些磁碟。