目錄
Taint(污點)與Toleration(容忍)
Taint(污點):節點的排斥標記
Toleration(容忍):Pod的適配聲明
與節點親和性的對比
警戒(cordon)和轉移(drain)
Cordon:節點隔離(阻止新 Pod 調度)
Drain:節點驅逐(安全遷移所有 Pod)
Cordon vs Drain:核心區別
親和性和非親和性
節點親和性(Node Affinity)
硬性要求(Required During Scheduling Ignored During Execution)
軟性偏好(Preferred During Scheduling Ignored During Execution)
Pod 親和性(Pod Affinity)
硬性要求(Required During Scheduling Ignored During Execution)
軟性偏好(Preferred During Scheduling Ignored During Execution)
親和性規則的核心操作符
親和性與非親和性的關系
關鍵對比與注意事項
Taint(污點)與Toleration(容忍)
在Kubernetes(K8s)中,Taint(污點)和Toleration(容忍)是用于控制Pod調度到節點的核心機制,二者協同工作以實現靈活的節點資源分配。
Taint(污點):節點的排斥標記
- 作用:Taint是節點級別的屬性,用于標記節點的特殊限制或要求,阻止不符合條件的Pod被調度到該節點。
- 組成:每個Taint由三部分構成:
- Key(鍵):標識污點的唯一名稱(如
dedicated=special
中的dedicated
)。 - Value(值):可選的附加標識(如
special
),與Key共同構成唯一標識。 - Effect(效果):定義污點對Pod的排斥行為,支持以下三種類型:
- NoSchedule:禁止Pod調度到該節點(除非Pod有匹配的Toleration)。
- PreferNoSchedule:盡量避免調度,但無其他可用節點時仍可調度。
- NoExecute:不僅禁止新Pod調度,還會驅逐節點上已存在的、無匹配Toleration的Pod。
- Key(鍵):標識污點的唯一名稱(如
Toleration(容忍):Pod的適配聲明
- 作用:Toleration是Pod級別的屬性,聲明Pod可以容忍哪些節點的污點,從而允許調度到這些節點。
- 匹配規則:Toleration需與節點的Taint在Key和Effect上完全一致,且滿足以下條件之一:
- Operator為Equal:Value必須相同(如
key: "dedicated", operator: "Equal", value: "special", effect: "NoSchedule"
)。 - Operator為Exists:忽略Value(如
key: "dedicated", operator: "Exists"
,表示容忍所有以dedicated
為Key的污點)。 - 空Key和Exists:匹配所有污點(如
operator: "Exists"
,表示容忍所有污點)。
- Operator為Equal:Value必須相同(如
- 特殊參數:
- tolerationSeconds:僅對
NoExecute
有效,指定Pod在節點被標記污點后繼續運行的時間(超時后驅逐)。
- tolerationSeconds:僅對
與節點親和性的對比
- 污點/容忍:通過“排斥”機制控制調度,節點設置污點,Pod聲明容忍。
- 節點親和性:通過“吸引”機制控制調度,Pod聲明偏好或硬性要求,節點無需額外標記。
警戒(cordon)和轉移(drain)
在 Kubernetes 中,Cordon?和?Drain?是用于節點管理的兩個核心命令,分別通過“隔離”和“驅逐”機制控制 Pod 的調度與遷移,確保節點維護或故障處理時的服務連續性。
Cordon:節點隔離(阻止新 Pod 調度)
- 作用:將節點標記為?不可調度(SchedulingDisabled),阻止新 Pod 被分配到該節點,但已運行的 Pod 不受影響。
- 典型場景:
- 節點維護:升級內核、更換硬件等操作前,避免新工作負載干擾。
- 故障排查:節點異常但未完全宕機時,隔離新 Pod 以專注問題修復。
- 資源優化:臨時將節點從調度池中移除,平衡集群負載。
Drain:節點驅逐(安全遷移所有 Pod)
- 作用:主動驅逐節點上的所有 Pod,并將節點標記為不可調度,確保負載平穩遷移至其他節點。
- 典型場景:
- 節點下線:替換故障節點或退役舊硬件。
- 批量維護:同時操作多個節點(如滾動升級集群)。
- 資源回收:釋放節點資源以重新分配。
- 關鍵特性:
- Pod 驅逐策略:
- 默認忽略?DaemonSet?管理的 Pod(如日志收集器),因其與節點強綁定。
- 可通過?
--force
?強制驅逐所有 Pod(慎用,可能導致數據丟失)。
- 優雅終止:
- 尊重 Pod 的?
terminationGracePeriodSeconds
,允許進程完成清理。 - 若 Pod 定義了?PodDisruptionBudget(PDB),Kubernetes 會檢查驅逐是否違反最小可用副本數限制。
- 尊重 Pod 的?
- 數據安全:
--delete-emptydir-data
:強制刪除使用?emptyDir
?卷的 Pod(數據會丟失)。- 對于持久化卷(PV),需確保數據可跨節點訪問(如云盤或分布式存儲)。
- Pod 驅逐策略:
Cordon vs Drain:核心區別
特性 | Cordon | Drain |
---|---|---|
作用對象 | 節點調度狀態 | 節點上的 Pod |
已運行 Pod | 不影響 | 主動驅逐 |
典型場景 | 臨時隔離節點 | 節點下線或長期維護 |
數據安全 | 無影響 | 需處理?emptyDir ?或本地存儲 |
命令組合 | 常單獨使用 | 通常與?cordon ?隱式配合(drain ?會自動標記節點為不可調度) |
親和性和非親和性
在 Kubernetes 中,親和性(Affinity)?主要分為?節點親和性(Node Affinity)?和?Pod 親和性(Pod Affinity)?兩大類,每類又包含?硬性要求(Required)?和?軟性偏好(Preferred)?兩種規則。
節點親和性(Node Affinity)
作用:控制 Pod 調度到滿足特定節點標簽條件的節點。
硬性要求(Required During Scheduling Ignored During Execution)
- 規則:Pod?必須調度到滿足條件的節點,否則調度失敗。
- 適用場景:
- 節點必須具備特定硬件(如 GPU、SSD)。
- 節點必須運行特定軟件(如特定內核版本)。
- 節點必須屬于特定環境(如生產環境、測試環境)。
軟性偏好(Preferred During Scheduling Ignored During Execution)
- 規則:調度器優先選擇滿足條件的節點,但不強制。
- 適用場景:
- 優先使用高性能節點,但允許回退到普通節點。
- 優先選擇負載較低的節點。
- 優先選擇與當前節點標簽匹配的節點(如相同區域)。
Pod 親和性(Pod Affinity)
作用:控制 Pod 調度到與已運行的特定 Pod 共存(或靠近)的節點。
硬性要求(Required During Scheduling Ignored During Execution)
- 規則:Pod?必須與滿足條件的 Pod 運行在同一拓撲域(如節點、可用區)。
- 關鍵參數:
topologyKey
:定義拓撲域的范圍(如?kubernetes.io/hostname
?表示節點級,topology.kubernetes.io/zone
?表示可用區級)。
- 適用場景:
- 確保相關服務(如 Web 和緩存)共存以減少網絡延遲。
- 確保數據庫副本分散在不同節點以避免單點故障。
軟性偏好(Preferred During Scheduling Ignored During Execution)
- 規則:調度器優先將 Pod 與滿足條件的 Pod 共存,但不強制。
- 適用場景:
- 優先將 Pod 調度到與目標 Pod 相同的節點或可用區,但允許分散。
- 優化數據本地性(如計算任務靠近數據存儲節點)。
親和性規則的核心操作符
在定義親和性條件時,可通過以下操作符匹配節點或 Pod 的標簽:
In
:標簽值在指定列表中。NotIn
:標簽值不在指定列表中。Exists
:標簽鍵存在(忽略值)。DoesNotExist
:標簽鍵不存在。Gt
(僅節點親和性):標簽值為數字且大于指定值。Lt
(僅節點親和性):標簽值為數字且小于指定值。
親和性與非親和性的關系
- 親和性(Affinity):通過標簽匹配實現 Pod 與節點或其他 Pod 的吸引。
- 非親和性(Anti-Affinity):通過標簽匹配實現 Pod 與節點或其他 Pod 的排斥。
- 例如:Pod 非親和性可確保同一服務的副本不運行在同一節點,提高高可用性。
關鍵對比與注意事項
分類 | 類型 | 規則類型 | 核心作用 |
---|---|---|---|
節點親和性 | 硬性要求 | RequiredDuringScheduling | 強制匹配節點標簽 |
軟性偏好 | PreferredDuringScheduling | 優先匹配節點標簽 | |
Pod 親和性 | 硬性要求 | RequiredDuringScheduling | 強制共存于指定拓撲域 |
軟性偏好 | PreferredDuringScheduling | 優先共存于指定拓撲域 |
特性 | 親和性(Affinity) | 非親和性(Anti-Affinity) |
---|---|---|
目的 | 吸引 Pod 共存或選擇特定節點 | 排斥 Pod 共存或避開特定節點 |
類型 | 節點親和性、Pod 親和性 | 節點非親和性、Pod 非親和性 |
硬性/軟性 | 支持 Required 和 Preferred | 支持 Required 和 Preferred |
拓撲域(TopologyKey) | 用于 Pod 親和性定義共存范圍 | 用于 Pod 非親和性定義隔離范圍 |
性能影響 | 復雜規則可能增加調度延遲 | 同上 |
- 親和性:通過標簽匹配實現 Pod 與節點或其他 Pod 的吸引,適用于性能優化、共存等場景。
- 非親和性:通過標簽匹配實現 Pod 與節點或其他 Pod 的排斥,適用于高可用、資源隔離等場景。
- 靈活組合:結合硬性/軟性規則、拓撲鍵和權重,可構建復雜的調度策略,滿足多樣化業務需求。