重調度(Descheduling)通常是指將部署在某個節點上調度不合理的Pod重新調度到另一個節點,適用於叢集資源利用不均衡、節點負載過高或有新的調度策略需求等情境。重調度功能有助於維護叢集健康、最佳化資源使用以及提高工作負載的服務品質。本文以節點汙點校正外掛程式RemovePodsViolatingNodeTaints
為例,介紹如何基於ack-koordinator組件開啟重調度功能。
閱讀前提示
使用本文前,建議您已參見重調度概述瞭解重調度的功能介紹、使用情境、工作流程和基本概念。
本文以節點汙點校正外掛程式
RemovePodsViolatingNodeTaints
為例,請參見Kubernetes官方文檔瞭解汙點和容忍度的工作原理、驅逐效果(例如NoSchedule)等概念。如果您是社區Kubernetes Descheduler使用者,建議您參見Koordinator Descheduler與Kubernetes Descheduler瞭解Koordinator Descheduler與Kubernetes Descheduler的差異,並完成組件的遷移。
如果您已經瞭解基礎使用方法,需要瞭解系統、模板概要、策略外掛程式、驅逐器外掛程式的進階配置參數以實現更精細化的重調度策略,可直接閱讀進階配置參數。
前提條件
已建立ACK叢集Pro版。具體操作,請參見建立ACK託管叢集。
說明重調度功能不支援在虛擬節點中使用。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
注意事項
Koordinator Descheduler只負責驅逐正在啟動並執行Pod,並不負責Pod驅逐後的重建以及調度。Pod被驅逐後的重建由其工作負載對應的Controller實現(例如Deployment、Statfulset),重建後Pod的調度流程仍然調度器負責。
重調度在執行過程中會先驅逐舊Pod,再建立新Pod。請確保您的應用有充足的冗餘副本(
replicas
),避免驅逐時影響應用可用性。
樣本說明
本文以開啟節點汙點校正外掛程式RemovePodsViolatingNodeTaints
為例,介紹如何基於ack-koordinator組件開啟重調度功能,並實現重調度策略。
RemovePodsViolatingNodeTaints
策略預設檢查並驅逐違反了節點上effect
為NoSchedule
的汙點的Pod。例如,對於一個已經有Pod在啟動並執行節點,當管理員在節點上新增一個汙點deschedule=not-allow:NoSchedule
後,若節點上的Pod沒有配置相應的容忍策略,則Pod就會被該重調度策略驅逐。更多資訊,請參見RemovePodsViolatingNodeTaints。
RemovePodsViolatingNodeTaints
策略支援通過excludedTaints
欄位定義哪些節點汙點不在策略的考慮範圍內。如果節點上的任何汙點的鍵(key
)或索引值對(key=value
)與 excludedTaints
列表中的條目匹配,那麼策略會自動忽略這些汙點。
本樣本將該外掛程式對汙點的檢查配置為:
節點上存在
effect
為NoSchedule
的汙點屬性。在
NoSchedule
的汙點屬性中,key
不等於deschedule
,且value
不等於not-allow
。
在符合以上要求的節點上,如果已經完成調度並運行中的Pod未配置相應的容忍策略,則會被重調度器驅逐。
步驟一:安裝或修改ack-koordinator組件並開啟重調度
您可以參見本小節步驟安裝ack-koordinator組件,使用其提供的Koordinator Descheduler重調度器功能。Koordinator Descheduler會以Deployment的形式部署在節點上。
如果您已安裝ack-koordinator組件,請確保組件版本為v1.2.0-ack.2及以上。
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
定位ack-koordinator組件,單擊右下角的安裝,在安裝對話方塊上面勾選開啟重調度模組,按頁面提示完成組件的配置和安裝。
步驟二:開啟重調度外掛程式RemovePodsViolatingNodeTaints
使用如下YAML檔案,建立koord-descheduler-config.yaml。
koord-descheduler-config.yaml是ConfigMap格式的對象,用於啟用和配置重調度外掛程式
RemovePodsViolatingNodeTaints
。# koord-descheduler-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: koord-descheduler-config namespace: kube-system data: koord-descheduler-config: | # 以下為Koordinator Descheduler系統配置,請保持不變。 apiVersion: descheduler/v1alpha2 kind: DeschedulerConfiguration leaderElection: resourceLock: leases resourceName: koord-descheduler resourceNamespace: kube-system deschedulingInterval: 120s # 執行循環間隔,120s執行一次重調度外掛程式。 dryRun: false # 全域唯讀模式開關,開啟後Koordinator Descheduler整體不做任何操作。 # 以上為系統配置。 profiles: - name: koord-descheduler plugins: deschedule: enabled: - name: RemovePodsViolatingNodeTaints # 配置開啟節點汙點校正外掛程式。 pluginConfig: - name: RemovePodsViolatingNodeTaints # 節點汙點校正外掛程式配置。 args: excludedTaints: - deschedule=not-allow # 忽略包含key為"deschedule"且value為"not-allow"的汙點的節點。
執行如下命令,部署koord-descheduler-config.yaml,將配置更新到叢集中。
kubectl apply -f koord-descheduler-config.yaml
執行如下命令,重啟重調度器模組Koordinator Descheduler。
kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0 # 預期輸出 # deployment.apps/ack-koord-descheduler scaled kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1 # 預期輸出 # deployment.apps/ack-koord-descheduler scaled
通過將
ack-koord-descheduler
的Deployment副本數量設定為0
,然後再設定為1
,重調度器模組Koordinator Descheduler將重啟啟動,並在啟動後使用最新配置。
步驟三:驗證重調度能力
下文以擁有3台節點的叢集為例進行說明。
使用如下YAML檔案,建立stress-demo.yaml。
stress-demo.yaml中定義了一個應用程式範例。
執行以下命令,部署stress-demo.yaml,建立測試Pod。
kubectl create -f stress-demo.yaml
執行如下命令,觀察Pod的狀態,直至開始運行。
kubectl get pod -o wide
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-5f6cddf9-9**** 1/1 Running 0 10s 192.XX.XX.27 cn-beijing.192.XX.XX.247 <none> <none> stress-demo-5f6cddf9-h**** 1/1 Running 0 10s 192.XX.XX.20 cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Running 0 10s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none>
執行如下命令,分別為節點增加汙點
key=value:NoSchedule
。為節點
cn-beijing.192.XX.XX.247
增加deschedule=not-allow:NoSchedule
汙點。kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoSchedule
預期輸出:
node/cn-beijing.192.XX.XX.247 tainted
為節點
cn-beijing.192.XX.XX.248
增加deschedule=allow:NoSchedule
汙點。kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoSchedule
預期輸出:
node/cn-beijing.192.XX.XX.248 tainted
執行如下命令,觀察Pod變化。
kubectl get pod -o wide -w
等待重調度器檢查節點汙點,並執行驅逐遷移操作。
預期輸出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES stress-demo-5f6cddf9-9**** 1/1 Running 0 5m34s 192.XX.XX.27 cn-beijing.192.XX.XX.247 <none> <none> stress-demo-5f6cddf9-h**** 1/1 Running 0 5m34s 192.XX.XX.20 cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Running 0 5m34s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none> stress-demo-5f6cddf9-v**** 1/1 Terminating 0 7m58s 192.XX.XX.32 cn-beijing.192.XX.XX.248 <none> <none> stress-demo-5f6cddf9-j**** 0/1 ContainerCreating 0 0s <none> cn-beijing.192.XX.XX.249 <none> <none> stress-demo-5f6cddf9-j**** 1/1 Running 0 2s 192.XX.XX.32 cn-beijing.192.XX.XX.249 <none> <none>
預期輸出表明:
增加了
deschedule=allow:NoSchedule
汙點的節點cn-beijing.192.XX.XX.248
上的Podstress-demo-5f6cddf9-v****
被驅逐。增加了
deschedule=not-allow:NoSchedule
汙點的節點cn-beijing.192.XX.XX.247
上的Podstress-demo-5f6cddf9-9****
沒有被驅逐。被驅逐的Pod
stress-demo-5f6cddf9-v****
重新調度到沒有NoSchedule
汙點的節點cn-beijing.192.XX.XX.249
。
執行如下命令,觀察被驅逐Pod的Event。
kubectl get event | grep stress-demo-5f6cddf9-v****
預期輸出:
3m24s Normal Evicting podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798**** Pod "default/stress-demo-5f6cddf9-v****" evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints" 2m51s Normal EvictComplete podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798**** Pod "default/stress-demo-5f6cddf9-v****" has been evicted 3m24s Normal Descheduled pod/stress-demo-5f6cddf9-v**** Pod evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints" 3m24s Normal Killing pod/stress-demo-5f6cddf9-v**** Stopping container stress
預期輸出中顯示了Pod的遷移記錄,此Pod所在節點
cn-beijing.192.XX.XX.248
沒有容忍汙點deschedule=not-allow
,導致該Pod被重調度到其他節點。結果符合預期。
進階配置參數
除了上述標準操作之外,您還可以使用ConfigMap對Koordinator Descheduler進行進階配置。
進階配置參數樣本
下方YAML展示了Koordinator Descheduler的進階配置參數樣本。該配置通過DeschedulerConfiguration
API修改Koordinator Descheduler的行為,開啟了RemovePodsViolatingNodeTaint
節點汙點校正重調度策略,並使用MigrationController
作為Pod的驅逐器。
您可結合後續章節的說明,瞭解樣本配置中各欄位的詳細含義。
系統配置
DeschedulerConfiguration
中支援對Koordinator Descheduler全域的系統級行為進行配置。
參數 | 類型 | 取值 | 說明 | 樣本值 |
| boolean |
| 唯讀模式開關,開啟後將不會發起Pod遷移。 | false |
| time.Duration | >0s | 重調度的執行循環。 | 120s |
| 結構體 | 不涉及 | 限制重調度器生效的節點。重調度策略只會在Node Selector指定的節點中生效。關於Node Selector的更多資訊,請參見Kubernetes labelSelector。 |
|
| int | ≥0(預設不限制) | 限制節點上能夠同時驅逐的Pod的最大數量。在驅逐過程中生效。 | 10 |
| int | ≥0(預設不限制) | 限制命名空間內能夠同時驅逐的Pod的最大數量。在驅逐過程中生效。 | 10 |
模板概要配置
Koordinator Descheduler使用重調度範本管理員重調度策略和Pod驅逐器。在DeschedulerConfiguration
的profiles
欄位中支援定義一個或多個重調度模板。在每個重調度模板中,重調度策略和Pod驅逐器都以外掛程式的形式進行配置。重調度模板中包含以下三部分。
name
string類型。自訂重調度模板的名稱。
plugins
配置需要啟用或禁用的重調度策略(
deschedule
、balance
)、Pod驅逐外掛程式(evict
)以及Pod驅逐前的篩選策略(filter
)。支援配置的參數與說明如下所示。參數
類型
取值
說明
樣本值
deschedule
結構體,資料結構為:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
其中,
Enabled
和Disabled
均為Plugin
結構體類型的列表,分別表示開啟和禁用外掛程式。預設全部禁用。選擇開啟的Deschedule類型的重調度策略。
plugins: deschedule: enabled: - name: PodLifeTime - name: RemovePodsViolatingNodeTaints
RemovePodsViolatingInterPodAntiAffinity
驅逐違反Pod間反親和性的Pod。
RemovePodsViolatingNodeAffinity
驅逐違反節點親和性的Pod。
RemovePodsViolatingNodeTaints
驅逐違反節點汙點的Pod。
RemovePodsHavingTooManyRestarts
驅逐重啟次數過多的Pod。
PodLifeTime
驅逐超出存活時間限制的Pod。
RemoveFailedPod
驅逐狀態為Failed的Pod。
balance
結構體,資料結構為:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
其中,
Enabled
和Disabled
均為Plugin
結構體類型的列表,分別表示開啟和禁用外掛程式。預設全部禁用。選擇開啟的Balance類型的重調度策略。
plugins: balance: enabled: - name: RemoveDuplicates - name: LowNodeLoad
RemoveDuplicates
應用副本打散
LowNodeUtilization
按節點資源分派率進行熱點打散。
HighNodeUtilization
按節點資源分派率進行負載彙總,即在策略允許的情況下將Pods從資源使用率較低的節點調度或遷移到資源使用率較高的節點。
RemovePodsViolatingTopologySpreadConstraint
驅逐違反拓撲分布約束的Pod。
LowNodeLoad
按節點資源使用率進行熱點打散。
evict
結構體,資料結構為:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
其中,Enabled和Disabled均為Plugin結構體類型的列表。在Enabled列表中開啟外掛程式,在Disabled中禁用外掛程式。
MigrationController
DefaultEvictor
選擇開啟的Pod驅逐器。預設啟用
MigrationController
。請勿同時開啟多個
evict
外掛程式。plugins: evict: enabled: - name: MigrationController
filter
結構體,資料結構為:
type PluginList struct { Enabled []Plugin Disabled []Plugin } type Plugin struct { Name string }
其中,Enabled和Disabled均為Plugin結構體類型的列表。在Enabled列表中開啟外掛程式,在Disabled中禁用外掛程式。
MigrationController
DefaultEvictor
選擇Pod驅逐前的篩選策略。預設啟用
MigrationController
。請勿同時開啟多個
filter
外掛程式。plugins: filter: enabled: - name: MigrationController
pluginConfig
配置每個外掛程式的進階參數。以
name
欄位指定所配置的外掛程式名。關於如何在args
欄位配置外掛程式。請參見策略外掛程式配置和驅逐器外掛程式配置。
策略外掛程式配置
Koordinator Descheduler支援6種Deschedule策略外掛程式和5種Balance策略外掛程式。其中,熱點打散重調度策略外掛程式LowNodeLoad由社區Koordinator提供,請參見使用負載熱點打散重調度瞭解詳細配置;其他重調度策略外掛程式由社區Kubernetes Descheduler提供,如下所示。
策略類型 | 策略功能 | 策略配置 |
Deschedule | 驅逐違反Pod間反親和性的Pod | |
驅逐違反節點親和性的Pod | ||
驅逐違反節點汙點的Pod | ||
驅逐重啟次數過多的Pod | ||
驅逐超出存活時間限制的Pod | ||
驅逐狀態為Failed的Pod | ||
Balance | 應用副本打散 | |
按節點資源分派率進行熱點打散 | ||
按節點資源分派率進行負載彙總 | ||
驅逐違反拓撲分布約束的Pod |
驅逐器外掛程式配置
Koordinator Descheduler支援DefaultEvictor
和MigrationController
兩種驅逐器外掛程式。
MigrationController
MigrationController
驅逐器外掛程式的進階配置參數如下所示。
參數 | 類型 | 取值 | 說明 | 樣本值 |
| boolean |
| 是否允許配置了HostPath或EmptyDir的Pod參與重調度。出於安全性考量,預設不開啟。 | false |
| int64 | ≥0(預設值為2) | 每個節點處於遷移狀態的Pod的最大數量。0表示不限制。 | 2 |
| int64 | ≥0(預設不限制) | 每個命名空間處於遷移狀態的Pod的最大數量。0表示不限制。 | 1 |
| intOrString | ≥0(預設值為10%) | 每個工作負載(例如Deployment)中處於遷移狀態的Pod的最大數量或百分比。0表示不限制。 若工作負載只有單副本,則不參與重調度。 | 1或10% |
| intOrString | ≥0(預設值為10%),且小於工作負載對應的副本總數 | 每個工作負載(例如Deployment)最大不可用副本數或百分比。0表示不限制。 | 1或10% |
| 結構體,資料格式為:
|
| 工作負載層級Pod遷移的流量控制。
|
表示5分鐘內單個工作負載內最多遷移1個副本。 |
| string | 目前支援三種模式:
|
| Eviction |
DefaultEvictor
DefaultEvictor外掛程式由社區Kubernetes Descheduler提供,請參見DefaultEvictor瞭解詳細配置。
差異對比
DefaultEvictor與MigrationController在Pod驅逐能力方面的詳細對比如下所示。
對比項 | DefaultEvictor | MigrationController |
驅逐方法 | 調用Eviction API驅逐Pod。 | 支援多種驅逐方法,請參見驅逐器外掛程式配置。 |
驅逐限額 |
|
|
驅逐限流 | 不支援 | 支援基於時間視窗的流控機制,保證同一工作負載中Pod的遷移不會過於頻繁。 |
驅逐觀測 | 支援通過組件日誌觀測Pod驅逐資訊。 |
|
相關文檔
部分重調度功能依賴需要與ACK調度器配合使用,請參見使用負載熱點打散重調度。
您可以搭配啟用成本洞察功能,瞭解叢集資源使用量及成本分布,擷取成本節約建議,從而提升叢集資源使用率。更多資訊,請參見成本洞察概述。
如果您在使用調度功能中遇到問題,可參見調度FAQ進行排查。
關於ack-koordinator組件的詳細介紹及變更記錄,請參見ack-koordinator(ack-slo-manager)。
ack-descheduler已停止維護,建議您遷移至當前維護的組件模組Koordinator Descheduler。更多資訊,請參見如何將ack-descheduler遷移至Koordinator Descheduler。