Kubernetes Pod驅逐策略

Kubelet 可以主動監測和防止計算資源的全面短缺。 在資源短缺的狀況下,kubelet 能夠主動地結束一個或多個 Pod 以回收短缺的資源。 當 kubelet 結束一個 Pod 時,它將終止 Pod 中的全部容器,而 Pod 的 Phase 將變爲 Failed。 若是被驅逐的 Pod 由 Deployment 管理,這個 Deployment 會建立另外一個 Pod 給 Kubernetes 來調度。
配置資源不足時的處理方式:node

驅逐信號

kubelet 支持按照如下信號觸發驅逐決定。
docker

92428b9095a47d010cc49d0087e6efa9.png

驅逐閾值

kubelet支持指定驅逐閾值,用於觸發 kubelet 回收資源。
每一個閾值形式以下:shell

[eviction-signal][operator][quantity]

合法的 eviction-signal 標誌如上圖所示。
operator 是所需的關係運算符,例如 <,>。
quantity 是驅逐閾值值標誌,例如 1Gi。合法的標誌必須匹配 Kubernetes 使用的數量表示。 驅逐閾值也可使用 % 標記表示百分比。

舉例說明,若是一個節點有 10Gi 內存,但願在可用內存降低到 1Gi 如下時引發驅逐操做, 則驅逐閾值可使用下面任意一種方式指定(但不是二者同時)。ide

memory.available<10%
memory.available<1Gi

軟驅逐閾值

軟驅逐閾值使用一對由驅逐閾值和管理員必須指定的寬限期組成的配置對。在超過寬限期前,kubelet不會採起任何動做回收和驅逐信號關聯的資源。若是沒有提供寬限期,kubelet啓動時將報錯。spa

此外,若是達到了軟驅逐閾值,操做員能夠指定從節點驅逐 pod 時,在寬限期內容許結束的 pod 的最大數量。 若是指定了 pod.Spec.TerminationGracePeriodSeconds 值, kubelet 將使用它和寬限期兩者中較小的一個。 若是沒有指定,kubelet將當即終止 pod,而不會優雅結束它們。code

軟驅逐閾值的配置支持下列標記:orm

92428b9095a47d010cc49d0087e6efa9.png

硬驅逐閾值

硬驅逐閾值沒有寬限期,一旦察覺,kubelet將當即採起行動回收關聯的短缺資源。 若是知足硬驅逐閾值,kubelet將當即結束 pod 而不是優雅終止。blog

硬驅逐閾值的配置支持下列標記:
eviction-hard 描述了驅逐閾值的集合(例如 memory.available<1Gi),若是知足條件將觸發 pod 驅逐。排序

b4f50b65b639f42a70871368865777d4.png

驅逐監控時間間隔

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 排在服務質量範圍內,該服務會消耗大量的磁盤並首先結束這些磁盤。

相關文章
相關標籤/搜索