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