排程器組態

功能狀態: 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

Profile

排程 Profile 允許您在 kube-scheduler 中組態排程的不同階段。每個階段都會在擴充點中公開。外掛程式藉由實作一或多個這些擴充點來提供排程行為。

您可以組態 kube-scheduler 的單一執行個體來執行多個 Profile

擴充點

排程發生在一系列階段中,這些階段透過下列擴充點公開

  1. queueSort:這些外掛程式提供排序功能,用於排序排程佇列中待處理的 Pod。一次只能啟用一個佇列排序外掛程式。
  2. preFilter:這些外掛程式用於在篩選之前預先處理或檢查關於 Pod 或叢集的資訊。它們可以將 Pod 標記為無法排程。
  3. filter:這些外掛程式相當於排程策略中的 Predicates,用於篩選掉無法執行 Pod 的節點。篩選器會按照組態順序呼叫。如果沒有節點通過所有篩選器,則 Pod 會標記為無法排程。
  4. postFilter:當找不到 Pod 的可行節點時,會按照組態順序呼叫這些外掛程式。如果任何 postFilter 外掛程式將 Pod 標記為可排程,則不會呼叫剩餘的外掛程式。
  5. preScore:這是一個資訊性擴充點,可用於執行預先評分工作。
  6. score:這些外掛程式為每個通過篩選階段的節點提供分數。然後,排程器將選取加權分數總和最高的節點。
  7. reserve:這是一個資訊性擴充點,用於在資源已為給定的 Pod 保留時通知外掛程式。外掛程式也實作 Unreserve 呼叫,該呼叫會在 Reserve 期間或之後發生失敗時呼叫。
  8. permit:這些外掛程式可以阻止或延遲 Pod 的繫結。
  9. preBind:這些外掛程式執行在繫結 Pod 之前所需的任何工作。
  10. bind:外掛程式將 Pod 繫結到節點。bind 外掛程式會依序呼叫,一旦其中一個完成繫結,就會跳過剩餘的外掛程式。至少需要一個繫結外掛程式。
  11. postBind:這是一個資訊性擴充點,在 Pod 繫結後呼叫。
  12. 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:實作污點和容忍度。實作擴充點:filterpreScorescore
  • NodeName:檢查 Pod 規格節點名稱是否與目前的節點相符。擴充點:filter
  • NodePorts:檢查節點是否有可用的連接埠供請求的 Pod 連接埠使用。擴充點:preFilterfilter
  • NodeAffinity:實作節點選擇器節點親和性。擴充點:filterscore
  • PodTopologySpread:實作 Pod 拓撲分散。擴充點:preFilterfilterpreScorescore
  • NodeUnschedulable:篩選掉 .spec.unschedulable 設定為 true 的節點。擴充點:filter
  • NodeResourcesFit:檢查節點是否具有 Pod 請求的所有資源。分數可以使用三種策略之一:LeastAllocated (預設)、MostAllocatedRequestedToCapacityRatio。擴充點:preFilterfilterscore
  • NodeResourcesBalancedAllocation:偏好如果 Pod 排程在那裡,資源使用率會更平衡的節點。擴充點:score
  • VolumeBinding:檢查節點是否具有或是否可以繫結請求的磁碟區。擴充點:preFilterfilterreservepreBindscore
  • VolumeRestrictions:檢查節點中掛載的磁碟區是否滿足磁碟區提供者特定的限制。擴充點:filter
  • VolumeZone:檢查請求的磁碟區是否滿足它們可能具有的任何區域需求。擴充點:filter
  • NodeVolumeLimits:檢查是否可以滿足節點的 CSI 磁碟區限制。擴充點:filter
  • EBSLimits:檢查是否可以滿足節點的 AWS EBS 磁碟區限制。擴充點:filter
  • GCEPDLimits:檢查是否可以滿足節點的 GCP-PD 磁碟區限制。擴充點:filter
  • AzureDiskLimits:檢查是否能滿足節點的 Azure 磁碟區限制。擴充點:filter
  • InterPodAffinity:實作 Pod 間親和性與反親和性。擴充點:preFilterfilterpreScorescore
  • 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。

適用於多個擴充點的外掛程式

kubescheduler.config.k8s.io/v1beta3 開始,設定檔配置中新增了一個欄位 multiPoint,可以輕鬆地跨多個擴充點啟用或停用外掛程式。multiPoint 配置的目的是簡化使用者和管理員在使用自訂設定檔時所需的配置。

考慮一個外掛程式 MyPlugin,它實作了 preScorescorepreFilterfilter 擴充點。若要為其所有可用的擴充點啟用 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 擴展中排除。這適用於停用預設外掛程式、非預設外掛程式或使用萬用字元 ('*') 停用所有外掛程式。以下是一個範例,停用 ScorePreScore,看起來會像這樣

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 在內部啟用。但是,個別的擴充點仍然可用,以允許彈性地重新配置預設值(例如排序和評分權重)。例如,考慮兩個評分外掛程式 DefaultScore1DefaultScore2,每個權重為 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 外掛程式時,一般優先順序階層如下

  1. 特定擴充點首先執行,並且它們的設定會覆寫在其他地方設定的任何內容
  2. 透過 MultiPoint 手動配置的外掛程式及其設定
  3. 預設外掛程式及其預設設定

為了示範上述階層,以下範例基於這些外掛程式

外掛程式擴充點
DefaultQueueSortQueueSort
CustomQueueSortQueueSort
DefaultPlugin1ScoreFilter
DefaultPlugin2Score
CustomPlugin1ScoreFilter
CustomPlugin2ScoreFilter

這些外掛程式的有效範例配置如下

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 外掛程式並停用預設外掛程式
  • 啟用 CustomPlugin1CustomPlugin2,它們將首先為其所有擴充點執行
  • 停用 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 外掛程式使用新的評分擴充。新的擴充結合了 NodeResourcesLeastAllocatedNodeResourcesMostAllocatedRequestedToCapacityRatio 外掛程式的功能。例如,如果您先前使用 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 和指標綁定位址配置的無效 hostport 將導致驗證失敗。

  • 三個外掛程式的權重預設會增加
    • InterPodAffinity 從 1 增加到 2
    • NodeAffinity 從 1 增加到 2
    • TaintToleration 從 1 增加到 3

  • 排程器外掛程式 SelectorSpread 已移除,請改用 PodTopologySpread 外掛程式(預設啟用)以實現類似的行為。

下一步

上次修改時間為 2024 年 5 月 17 日 6:04 AM PST:Update content/en/docs/reference/scheduling/config.md (ebe94e4df4)