排程器組態
Kubernetes v1.25 [穩定]
您可以藉由編寫組態檔並將其路徑作為命令列引數傳遞,來自訂 kube-scheduler
的行為。
排程 Profile 允許您在 kube-scheduler 中組態排程的不同階段。每個階段都會在擴充點中公開。外掛程式藉由實作一或多個這些擴充點來提供排程行為。
您可以透過執行 kube-scheduler --config <filename>
,使用 KubeSchedulerConfiguration v1 結構來指定排程 Profile。
最小組態如下所示
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
clientConnection:
kubeconfig: /etc/srv/kubernetes/kube-scheduler/kubeconfig
注意
KubeSchedulerConfiguration v1beta3 在 v1.26 中已棄用,並在 v1.29 中移除。請將 KubeSchedulerConfiguration 遷移到 v1。Profile
排程 Profile 允許您在 kube-scheduler 中組態排程的不同階段。每個階段都會在擴充點中公開。外掛程式藉由實作一或多個這些擴充點來提供排程行為。
您可以組態 kube-scheduler
的單一執行個體來執行多個 Profile。
擴充點
排程發生在一系列階段中,這些階段透過下列擴充點公開
queueSort
:這些外掛程式提供排序功能,用於排序排程佇列中待處理的 Pod。一次只能啟用一個佇列排序外掛程式。preFilter
:這些外掛程式用於在篩選之前預先處理或檢查關於 Pod 或叢集的資訊。它們可以將 Pod 標記為無法排程。filter
:這些外掛程式相當於排程策略中的 Predicates,用於篩選掉無法執行 Pod 的節點。篩選器會按照組態順序呼叫。如果沒有節點通過所有篩選器,則 Pod 會標記為無法排程。postFilter
:當找不到 Pod 的可行節點時,會按照組態順序呼叫這些外掛程式。如果任何postFilter
外掛程式將 Pod 標記為可排程,則不會呼叫剩餘的外掛程式。preScore
:這是一個資訊性擴充點,可用於執行預先評分工作。score
:這些外掛程式為每個通過篩選階段的節點提供分數。然後,排程器將選取加權分數總和最高的節點。reserve
:這是一個資訊性擴充點,用於在資源已為給定的 Pod 保留時通知外掛程式。外掛程式也實作Unreserve
呼叫,該呼叫會在Reserve
期間或之後發生失敗時呼叫。permit
:這些外掛程式可以阻止或延遲 Pod 的繫結。preBind
:這些外掛程式執行在繫結 Pod 之前所需的任何工作。bind
:外掛程式將 Pod 繫結到節點。bind
外掛程式會依序呼叫,一旦其中一個完成繫結,就會跳過剩餘的外掛程式。至少需要一個繫結外掛程式。postBind
:這是一個資訊性擴充點,在 Pod 繫結後呼叫。multiPoint
:這是一個僅限組態的欄位,允許同時為所有適用的擴充點啟用或停用外掛程式。
對於每個擴充點,您可以停用特定的預設外掛程式或啟用您自己的外掛程式。例如
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- plugins:
score:
disabled:
- name: PodTopologySpread
enabled:
- name: MyCustomPluginA
weight: 2
- name: MyCustomPluginB
weight: 1
您可以在停用陣列中使用 *
作為名稱,以停用該擴充點的所有預設外掛程式。如果需要,這也可以用於重新排列外掛程式順序。
排程外掛程式
以下預設啟用的外掛程式實作一或多個這些擴充點
ImageLocality
:偏好已具有 Pod 執行之容器映像檔的節點。擴充點:score
。TaintToleration
:實作污點和容忍度。實作擴充點:filter
、preScore
、score
。NodeName
:檢查 Pod 規格節點名稱是否與目前的節點相符。擴充點:filter
。NodePorts
:檢查節點是否有可用的連接埠供請求的 Pod 連接埠使用。擴充點:preFilter
、filter
。NodeAffinity
:實作節點選擇器和節點親和性。擴充點:filter
、score
。PodTopologySpread
:實作 Pod 拓撲分散。擴充點:preFilter
、filter
、preScore
、score
。NodeUnschedulable
:篩選掉.spec.unschedulable
設定為 true 的節點。擴充點:filter
。NodeResourcesFit
:檢查節點是否具有 Pod 請求的所有資源。分數可以使用三種策略之一:LeastAllocated
(預設)、MostAllocated
和RequestedToCapacityRatio
。擴充點:preFilter
、filter
、score
。NodeResourcesBalancedAllocation
:偏好如果 Pod 排程在那裡,資源使用率會更平衡的節點。擴充點:score
。VolumeBinding
:檢查節點是否具有或是否可以繫結請求的磁碟區。擴充點:preFilter
、filter
、reserve
、preBind
、score
。注意
當啟用VolumeCapacityPriority
功能時,會啟用score
擴充點。它會優先處理可以容納請求磁碟區大小的最小 PV。VolumeRestrictions
:檢查節點中掛載的磁碟區是否滿足磁碟區提供者特定的限制。擴充點:filter
。VolumeZone
:檢查請求的磁碟區是否滿足它們可能具有的任何區域需求。擴充點:filter
。NodeVolumeLimits
:檢查是否可以滿足節點的 CSI 磁碟區限制。擴充點:filter
。EBSLimits
:檢查是否可以滿足節點的 AWS EBS 磁碟區限制。擴充點:filter
。GCEPDLimits
:檢查是否可以滿足節點的 GCP-PD 磁碟區限制。擴充點:filter
。AzureDiskLimits
:檢查是否能滿足節點的 Azure 磁碟區限制。擴充點:filter
。InterPodAffinity
:實作 Pod 間親和性與反親和性。擴充點:preFilter
、filter
、preScore
、score
。PrioritySort
:提供預設的基於優先順序的排序。擴充點:queueSort
。DefaultBinder
:提供預設的綁定機制。擴充點:bind
。DefaultPreemption
:提供預設的搶佔機制。擴充點:postFilter
。
您也可以透過元件配置 API 啟用以下預設未啟用的外掛程式
CinderLimits
:檢查是否能滿足節點的 OpenStack Cinder 磁碟區限制。擴充點:filter
。
多個設定檔
您可以配置 kube-scheduler
執行多個設定檔。每個設定檔都有一個關聯的排程器名稱,並且可以在其擴充點中配置一組不同的外掛程式。
透過以下範例配置,排程器將以兩個設定檔執行:一個使用預設外掛程式,另一個停用所有評分外掛程式。
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: default-scheduler
- schedulerName: no-scoring-scheduler
plugins:
preScore:
disabled:
- name: '*'
score:
disabled:
- name: '*'
想要根據特定設定檔進行排程的 Pod 可以在其 .spec.schedulerName
中包含對應的排程器名稱。
預設情況下,會建立一個排程器名稱為 default-scheduler
的設定檔。此設定檔包含上述的預設外掛程式。當宣告多個設定檔時,每個設定檔都需要唯一的排程器名稱。
如果 Pod 未指定排程器名稱,kube-apiserver 會將其設定為 default-scheduler
。因此,應該存在具有此排程器名稱的設定檔,以便排程這些 Pod。
注意
Pod 的排程事件將 .spec.schedulerName
作為其 reportingController
。領導者選舉的事件使用列表中第一個設定檔的排程器名稱。
如需更多資訊,請參閱 Event API 參考 下的 reportingController
區段。
注意
所有設定檔都必須在queueSort
擴充點中使用相同的外掛程式,並且具有相同的配置參數(如果適用)。這是因為排程器只有一個待處理 Pod 佇列。適用於多個擴充點的外掛程式
從 kubescheduler.config.k8s.io/v1beta3
開始,設定檔配置中新增了一個欄位 multiPoint
,可以輕鬆地跨多個擴充點啟用或停用外掛程式。multiPoint
配置的目的是簡化使用者和管理員在使用自訂設定檔時所需的配置。
考慮一個外掛程式 MyPlugin
,它實作了 preScore
、score
、preFilter
和 filter
擴充點。若要為其所有可用的擴充點啟用 MyPlugin
,設定檔配置看起來會像這樣
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
multiPoint:
enabled:
- name: MyPlugin
這相當於手動為其所有擴充點啟用 MyPlugin
,就像這樣
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
preScore:
enabled:
- name: MyPlugin
score:
enabled:
- name: MyPlugin
preFilter:
enabled:
- name: MyPlugin
filter:
enabled:
- name: MyPlugin
在此處使用 multiPoint
的一個好處是,如果 MyPlugin
將來實作了另一個擴充點,multiPoint
配置將自動為新的擴充點啟用它。
可以使用該擴充點的 disabled
欄位,將特定的擴充點從 MultiPoint
擴展中排除。這適用於停用預設外掛程式、非預設外掛程式或使用萬用字元 ('*'
) 停用所有外掛程式。以下是一個範例,停用 Score
和 PreScore
,看起來會像這樣
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: non-multipoint-scheduler
plugins:
multiPoint:
enabled:
- name: 'MyPlugin'
preScore:
disabled:
- name: '*'
score:
disabled:
- name: '*'
從 kubescheduler.config.k8s.io/v1beta3
開始,所有 預設外掛程式 都透過 MultiPoint
在內部啟用。但是,個別的擴充點仍然可用,以允許彈性地重新配置預設值(例如排序和評分權重)。例如,考慮兩個評分外掛程式 DefaultScore1
和 DefaultScore2
,每個權重為 1
。可以使用不同的權重重新排序它們,如下所示
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
score:
enabled:
- name: 'DefaultScore2'
weight: 5
在此範例中,無需在 MultiPoint
中明確指定外掛程式,因為它們是預設外掛程式。並且在 Score
中唯一指定的外掛程式是 DefaultScore2
。這是因為透過特定擴充點設定的外掛程式將始終優先於 MultiPoint
外掛程式。因此,此程式碼片段實際上重新排序了兩個外掛程式,而無需指定它們兩者。
配置 MultiPoint
外掛程式時,一般優先順序階層如下
- 特定擴充點首先執行,並且它們的設定會覆寫在其他地方設定的任何內容
- 透過
MultiPoint
手動配置的外掛程式及其設定 - 預設外掛程式及其預設設定
為了示範上述階層,以下範例基於這些外掛程式
外掛程式 | 擴充點 |
---|---|
DefaultQueueSort | QueueSort |
CustomQueueSort | QueueSort |
DefaultPlugin1 | Score 、Filter |
DefaultPlugin2 | Score |
CustomPlugin1 | Score 、Filter |
CustomPlugin2 | Score 、Filter |
這些外掛程式的有效範例配置如下
apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
multiPoint:
enabled:
- name: 'CustomQueueSort'
- name: 'CustomPlugin1'
weight: 3
- name: 'CustomPlugin2'
disabled:
- name: 'DefaultQueueSort'
filter:
disabled:
- name: 'DefaultPlugin1'
score:
enabled:
- name: 'DefaultPlugin2'
請注意,在特定擴充點中重新宣告 MultiPoint
外掛程式不會發生錯誤。重新宣告會被忽略(並記錄),因為特定擴充點具有優先權。
除了將大多數配置保留在一個位置之外,此範例還做了幾件事
- 啟用自訂
queueSort
外掛程式並停用預設外掛程式 - 啟用
CustomPlugin1
和CustomPlugin2
,它們將首先為其所有擴充點執行 - 停用
DefaultPlugin1
,但僅適用於filter
- 重新排序
DefaultPlugin2
以在score
中首先執行(甚至在自訂外掛程式之前)
在 v1beta3
之前的配置版本中,沒有 multiPoint
,上面的程式碼片段相當於這樣
apiVersion: kubescheduler.config.k8s.io/v1beta2
kind: KubeSchedulerConfiguration
profiles:
- schedulerName: multipoint-scheduler
plugins:
# Disable the default QueueSort plugin
queueSort:
enabled:
- name: 'CustomQueueSort'
disabled:
- name: 'DefaultQueueSort'
# Enable custom Filter plugins
filter:
enabled:
- name: 'CustomPlugin1'
- name: 'CustomPlugin2'
- name: 'DefaultPlugin2'
disabled:
- name: 'DefaultPlugin1'
# Enable and reorder custom score plugins
score:
enabled:
- name: 'DefaultPlugin2'
weight: 1
- name: 'DefaultPlugin1'
weight: 3
雖然這是一個複雜的範例,但它展示了 MultiPoint
配置的彈性以及其與現有配置擴充點方法的無縫整合。
排程器配置遷移
使用 v1beta2 配置版本,您可以為
NodeResourcesFit
外掛程式使用新的評分擴充。新的擴充結合了NodeResourcesLeastAllocated
、NodeResourcesMostAllocated
和RequestedToCapacityRatio
外掛程式的功能。例如,如果您先前使用NodeResourcesMostAllocated
外掛程式,則可以改用NodeResourcesFit
(預設啟用),並新增一個pluginConfig
,其scoreStrategy
與以下類似apiVersion: kubescheduler.config.k8s.io/v1beta2 kind: KubeSchedulerConfiguration profiles: - pluginConfig: - args: scoringStrategy: resources: - name: cpu weight: 1 type: MostAllocated name: NodeResourcesFit
排程器外掛程式
NodeLabel
已被棄用;請改用NodeAffinity
外掛程式(預設啟用)以實現類似的行為。排程器外掛程式
ServiceAffinity
已被棄用;請改用InterPodAffinity
外掛程式(預設啟用)以實現類似的行為。排程器外掛程式
NodePreferAvoidPods
已被棄用;請改用 節點污點 以實現類似的行為。在 v1beta2 配置檔案中啟用的外掛程式優先於該外掛程式的預設配置。
為排程器 healthz 和指標綁定位址配置的無效
host
或port
將導致驗證失敗。
- 三個外掛程式的權重預設會增加
InterPodAffinity
從 1 增加到 2NodeAffinity
從 1 增加到 2TaintToleration
從 1 增加到 3
- 排程器外掛程式
SelectorSpread
已移除,請改用PodTopologySpread
外掛程式(預設啟用)以實現類似的行為。
下一步
- 閱讀 kube-scheduler 參考
- 了解關於 排程 的資訊
- 閱讀 kube-scheduler 配置 (v1) 參考