Kubernetes 的 Pod 調度、搶占和驅逐的區別與關系
Kubernetes(K8s)作為一個容器編排平臺,其調度(Scheduling)、搶占(Preemption)和驅逐(Eviction)機制是確保集群資源合理分配、高效使用并保證應用健康運行的關鍵部分。
- 調度(scheduling)指的是確保 Pod 匹配到合適的節點, 以便 kubelet 能夠運行它們。
- 搶占(Preemption)指的是終止低優先級的 Pod 以便高優先級的 Pod 可以調度到 Node 上的過程。
- 驅逐(Eviction)是在資源匱乏的節點上,主動讓一個或多個 Pod 失效的過程。
接下來將詳細介紹這三個概念。

一、調度(Scheduling)
1. 調度概述
調度器通過 Kubernetes 的監測(Watch)機制來發現集群中新創建且尚未被調度到節點上的 Pod。調度的主要任務是將Pod分配到集群中的合適的節點上。調度器根據Pod的需求(如CPU、內存、存儲等)和節點的資源狀況(如可用CPU、內存、節點標簽等)來決定Pod部署在哪個節點上。
2. 調度過程
Kubernetes調度過程主要包括以下步驟:
- 資源需求:每個Pod可以聲明它對資源的需求,如CPU、內存等。這些信息由resources.requests和resources.limits字段描述。
- 節點篩選:調度器會根據Pod的資源需求以及節點的資源狀況來篩選合適的節點。篩選是通過一系列的調度策略(如節點的可用資源、Pod的親和性和反親和性等)來進行的。
- 節點優選:一旦節點被篩選出來,調度器將評估每個節點的優劣。優選是基于一組優先級策略(例如,Pod親和性、負載均衡、Pod優先級等)。
- Pod調度:調度器最終會選擇一個最佳節點,并將Pod調度到該節點上。Pod在被調度之前,狀態是Pending,調度后它的狀態變為Running。
3. 調度策略
Kubernetes調度器默認采用的是kube-scheduler, 以下是最常用的調度策略:
- Pod親和性和反親和性:定義Pod是否應該與特定的Pod運行在同一節點上。
- 優先級和搶占:Pod可以設置優先級,較高優先級的Pod可以搶占低優先級Pod的資源。
- Taints和Tolerations:節點可以有Taints,Pod可以設置Tolerations,如果Pod不容忍節點的Taint,它就不能被調度到該節點上。
- Resource Limits:控制Pod在節點上分配的資源,避免資源超載。
二、搶占(Preemption)
1. 搶占概述
搶占機制是Kubernetes中用于保證高優先級Pod能夠在資源不足時“搶占”低優先級Pod的資源,從而確保關鍵任務的運行。搶占的目標是保證高優先級的Pod能夠優先調度到集群中的節點。
2. 搶占機制工作原理
搶占機制發生的條件是:
- 高優先級 Pod 請求調度時,當前沒有足夠的資源
- 集群資源不足時,調度器會查找那些資源消耗較大的、優先級較低的 Pod,并嘗試將其驅逐,以便為高優先級 Pod 騰出空間。
(1) 搶占的觸發
① 優先級設置:Pod 的優先級由 PriorityClass 控制。PriorityClass 是一個 API 資源,定義了 Pod 的優先級。Pod 的優先級越高,被調度的優先級越高,且越有可能觸發搶占。
② PreemptionPolicy:搶占策略由 Pod 的 preemptionPolicy 字段定義,常見的設置包括:
- PreemptLowerPriority:默認設置,允許高優先級 Pod 搶占低優先級 Pod。
- DoNotPreempt:禁止搶占,Pod 只能在資源可用時調度,不會搶占其他 Pod。
(2) 搶占過程
- 資源緊張:當集群的資源(如 CPU、內存)不足時,調度器會評估哪些 Pod 可能被驅逐。
- 驅逐低優先級 Pod:調度器會選擇優先級低的、符合資源釋放條件的 Pod 驅逐。被驅逐的 Pod 狀態會變為 Evicted,并重新進入調度隊列。
- Pod 重新調度:驅逐后的低優先級 Pod 會被調度器重新調度到其他節點上,前提是有足夠資源。
3. 搶占對調度的影響
- 高優先級任務的保障:通過搶占機制,Kubernetes 能夠確保關鍵任務(如高優先級應用)能夠及時獲得資源。
- 搶占和驅逐的區別:搶占通常指的是調度器主動將低優先級的 Pod 從節點上移除,而驅逐是在節點資源壓力過大或 Pod 不健康時,由 Kubernetes 自動觸發的操作。
三、驅逐(Eviction)
1. 驅逐概述
驅逐是指Kubernetes將運行中的Pod從節點上強制移除,通常是因為節點資源不足(如CPU、內存不足)或者Pod違反了某些限制(如超出資源配額)。
2. 驅逐的觸發條件
- 資源壓力:當節點的資源(如內存、CPU)達到某個閾值時,Kubernetes會嘗試通過驅逐Pod來釋放資源。特別是在節點內存壓力較大時,Kubernetes會優先驅逐使用大量內存的Pod。
- 節點資源的超限:節點上的資源消耗達到配置的閾值時,Kubernetes會進行Pod驅逐以恢復節點的資源平衡。驅逐會遵循一定的優先級策略,通常低優先級、非持久化Pod(如ephemeral類型)會被優先驅逐。
- Pod的liveness或readiness探針失敗:如果Pod的健康檢查失敗,Kubernetes會將其驅逐,并且嘗試重新調度到其他節點。
- OOM(Out of Memory)殺死Pod:當節點上的內存不足時,操作系統可能會觸發OOM Killer(操作系統的內存回收機制)殺死部分進程,Kubernetes則會根據OOM事件驅逐相關的Pod。
3. 驅逐策略
Kubernetes中的驅逐策略有兩種類型:
- 優先驅逐策略:優先驅逐高資源消耗的Pod(如內存占用高的Pod),并且通常會優先驅逐低優先級的Pod。
- 優先級驅逐:如果Pod的優先級較低,Kubernetes會優先考慮驅逐這些Pod,從而確保高優先級Pod能夠獲得資源。
4. 驅逐過程
- 驅逐請求:當節點的資源壓力增大時,Kubernetes會評估當前節點上所有Pod的資源使用情況。
- Pod選擇:Kubernetes會根據Pod的優先級、資源使用量、Pod的類型(如持久性或臨時性)來選擇哪些Pod需要被驅逐。
- 驅逐Pod:一旦Pod被選擇驅逐,Kubernetes會通過API向該Pod發出驅逐命令,通知調度器將其從節點上移除。
5. 驅逐的影響
- Pod重新調度:被驅逐的Pod會被重新調度到其他節點上,前提是集群中有足夠的資源。
- Pod的生命周期:Pod被驅逐后,會進入Pending狀態,然后調度器會嘗試根據集群的資源狀況將其調度到其他節點。
四、調度、搶占和驅逐的交互
調度、搶占和驅逐之間存在緊密的聯系,它們共同決定了Pod在集群中的運行和資源分配。調度器不僅負責Pod的初始調度,還會根據Pod的優先級、資源需求以及集群的負載情況,在運行過程中做出合理的資源分配決策。
1. 調度與搶占
調度器在初次調度時可能會考慮搶占機制(特別是當資源緊張時)。如果集群資源不足,優先級較高的Pod會搶占低優先級Pod的資源。
2. 驅逐與搶占
搶占機制和驅逐機制有些相似。驅逐是節點資源壓力下自動發生的,而搶占是通過調度器主動發起的。
在資源緊張時,搶占和驅逐可以結合使用,通過優先級調整、驅逐低優先級Pod來保證高優先級Pod的運行。
3. 調度和驅逐
調度器也需要在節點資源變動時(如節點資源不足或發生故障時)做出決策。如果Pod運行在一個資源即將耗盡的節點上,調度器可能會選擇將Pod重新調度到一個資源充足的節點。
理解這三個機制如何協同工作,有助于更好地管理Kubernetes集群,優化資源分配,并確保高優先級應用能夠在集群中正常運行。




























