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