共用方式為


從中樞叢集到成員叢集的 Kubernetes 資源放置

本文說明使用 Azure Kubernetes Fleet Manager 從中樞叢集到成員叢集的 Kubernetes 資源放置概念。

平臺管理員通常需要基於各種原因將 Kubernetes 資源部署到多個叢集,例如:

  • 使用角色和角色繫結跨多個叢集管理存取控制。
  • 執行必須位於所有叢集的基礎結構應用程式,例如 Prometheus 或 Flux。

應用程式開發人員通常需要基於各種原因將 Kubernetes 資源部署到多個叢集,例如:

  • 將影片服務應用程式部署到不同區域中的多個叢集,以取得低延遲觀看體驗。
  • 將購物車應用程式部署到兩個配對區域,以便客戶能夠在任一區域中斷時繼續購物。
  • 使用成本較低的可用現成節點集區,將批次計算應用程式部署到叢集。

以手動方式跨多個叢集建立、更新和追蹤這些 Kubernetes 資源是一項繁瑣的工作。 機群提供 Kubernetes 資源傳播功能,以便大規模管理 Kubernetes 資源。 使用 Kubernetes Fleet,您可以在中樞叢集中建立 Kubernetes 資源,並透過 Kubernetes 自定義資源將其傳播至選取的成員叢集: MemberClusterClusterResourcePlacement

Kubernetes Fleet 根據開放原始碼雲端原生解決方案支援這些自定義資源,您可以在 開放原始碼 Fleet 檔中深入瞭解

ClusterResourcePlacement 簡介

ClusterResourcePlacement對象可用來告訴車隊排程器如何將一組指定的叢集範圍對象從車隊中樞叢集放置到成員叢集。 Deployments、StatefulSets、DaemonSets、ConfigMaps、Secrets 和 PersistentVolumeClaims 等命名空間範圍物件會在選取其包含命名空間時加入。

使用 ClusterResourcePlacement,您可以:

  • 選取要傳播到成員叢集的叢集範圍 Kubernetes 資源。
  • 指定放置原則以手動或自動選取成員叢集作為目標叢集。
  • 指定推出策略,安全地將所選 Kubernetes 資源的任何更新推出到多個目標叢集。
  • 檢視每個目標叢集的傳播進度。

下圖顯示範例。

此圖顯示 Kubernetes 資源如何傳播到成員叢集。

封裝資源

ClusterResourcePlacement 支援使用 ConfigMap 來封套特定 Kubernetes 資源類型,使其可以在中樞叢集上暫存,而不會對中樞叢集產生任何非預期的副作用。 如需資源類型清單,並瞭解此功能的運作方式,請參閱我們的 信封物件檔

放置類型

下列放置類型可用來控制必須傳播指定 Kubernetes 資源的叢集數目:

  • PickFixed 會依名稱將資源放在特定成員叢集清單上。
  • PickAll 會將資源放在所有成員叢集,或符合準則的所有成員叢集上。 此原則可用於放置基礎結構工作負載,例如叢集監視或報告應用程式。
  • PickN 是最具彈性的放置選項,可根據親和性或拓撲散布條件約束來選取叢集,而且在將工作負載分散到多個適當叢集以確保需要可用性時很有用。

PickFixed 放置類型

如果您想要將工作負載部署到一組已知的成員叢集,您可以使用 PickFixed 放置原則依名稱選取叢集。

clusterNames 是這個放置類型的唯一有效原則選項。

下列範例示範如何將命名空間部署到 test-deployment 成員叢集 cluster1cluster2

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-fixed
spec:
  policy:
    placementType: PickFixed
    clusterNames:
    - cluster1
    - cluster2
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: test-deployment
      version: v1

PickAll 放置類型

您可以使用 PickAll 放置類型,將工作負載部署到車隊中所有成員叢集,或部署到符合您設定之準則的叢集。

建立此類型的放置時,可以指定下列叢集親和性類型:

  • requiredDuringSchedulingIgnoredDuringExecution:由於此原則在排程期間是必要的,因此會 根據指定的準則篩選 叢集。

下列範例示範如何將 prod-deployment 命名空間及其所有物件部署到標示為 environment: production 的所有叢集:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickall
spec:
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                        environment: production
  resourceSelectors:
    - group: ""
      kind: Namespace
      name: prod-deployment
      version: v1

PickN 放置類型

PickN放置類型是最具彈性的選項,可讓您根據親和性與拓撲散布條件約束,將資源放置到可設定數目的叢集。

建立此類型的放置時,可以指定下列叢集親和性類型:

  • requiredDuringSchedulingIgnoredDuringExecution:由於此原則在排程期間是必要的,因此會 根據指定的準則篩選 叢集。
  • preferredDuringSchedulingIgnoredDuringExecution:因為此原則是慣用的,但在排程期間不需要,它會 根據指定的準則來排名 叢集。

您可以同時設定必要和偏好的親和性。 必要的親和性可防止放置不符合的叢集,而慣用同構型提供有效叢集的順序。

具有親和性的 PickN

搭配 PickN 放置原則函式使用親和性,類似於搭配 Pod 排程使用親和性。

下列範例示範如何將工作負載部署到三個叢集。 只有具有 critical-allowed: "true" 標籤的叢集是有效的放置目標,並會優先使用具有標籤 critical-level: 1 的叢集:

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-01
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    numberOfClusters: 3
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
              weight: 20
              preference:
              - labelSelector:
                  matchLabels:
                    critical-level: 1
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - labelSelector:
                    matchLabels:
                      critical-allowed: "true"

具有拓撲散佈條件約束的 PickN

您可以使用拓撲分散條件約束,強制將叢集位置劃分到拓撲界限,以滿足可用性需求。 例如,使用這些條件約束來分割跨區域或更新通道的位置。 您也可以設定拓撲散佈條件約束,在無法滿足條件約束時防止排程 (whenUnsatisfiable: DoNotSchedule) 或盡可能排程 (whenUnsatisfiable: ScheduleAnyway)。

下列範例示範如何將一組指定的資源分散到多個區域,並嘗試使用不同的更新日跨成員叢集進行排程。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp-pickn-02
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickN
    topologySpreadConstraints:
    - maxSkew: 2
      topologyKey: region
      whenUnsatisfiable: DoNotSchedule
    - maxSkew: 2
      topologyKey: updateDay
      whenUnsatisfiable: ScheduleAnyway

如需詳細資訊,請參閱 開放原始碼 Fleet 檔拓撲散布條件約束

放置原則選項

下表摘要說明每個放置類型的可用排程原則欄位。

原則欄位 PickFixed PickAll PickN
placementType
affinity
clusterNames
numberOfClusters
topologySpreadConstraints

根據標籤和屬性選取叢集

要選取叢集的可用標籤和屬性

使用 PickNPickAll 放置類型時,您可以使用下列卷標和屬性作為原則的一部分。

標籤

下列標籤會自動新增至所有成員叢集,並可用於資源放置原則中的目標叢集選取。

Label 描述
fleet.azure.com/location 叢集的 Azure 區域 (westus)
fleet.azure.com/resource-group 叢集的 Azure 資源群組 (rg_prodapps_01)
fleet.azure.com/subscription-id 叢集所在的 Azure 訂用帳戶標識碼。 格式化為 UUID/GUID。

您也可以使用任何套用至叢集的自訂標籤。

屬性

下列屬性可用於作為放置原則的一部分。

CPU 和記憶體屬性會 以 Kubernetes 資源單位表示。

成本屬性是十進位數,代表針對叢集內節點所使用之 Azure 計算的每小時成本,以美元為單位。 成本是以 Azure 公用定價為基礎。

屬性名稱 描述
kubernetes-fleet.io/node-count 成員叢集上的可用節點。
resources.kubernetes-fleet.io/total-cpu 叢集的CPU資源單位總計。
resources.kubernetes-fleet.io/allocatable-cpu 叢集的可設定 CPU 資源單位。
resources.kubernetes-fleet.io/available-cpu 叢集的可用CPU資源單位。
resources.kubernetes-fleet.io/total-memory 叢集的記憶體資源單位總計。
resources.kubernetes-fleet.io/allocatable-memory 叢集的可配置記憶體資源單位。
resources.kubernetes-fleet.io/available-memory 叢集的可用記憶體資源單位。
kubernetes.azure.com/per-cpu-core-cost 叢集的每個 CPU 核心成本。
kubernetes.azure.com/per-gb-memory-cost 叢集的每個 GiB 記憶體成本。

指定選取專案比對準則

在原則準則中使用叢集屬性時,您可以指定:

  • 名稱:屬性的名稱,這是本文中屬性中列出的屬性之一。

  • 運算子:運算符,用來表示條件約束/所需值與叢集上觀察到的值之間的條件。 目前支援以下運算子:

    • Gt (大於):叢集對指定屬性的觀察值必須大於條件中的值,然後才能選擇它進行資源放置。
    • Ge (大於或等於):叢集對指定屬性的觀察值必須大於或等於條件中的值,然後才能選擇它進行資源放置。
    • Lt (小於):指定屬性的叢集之觀察值必須小於條件中的值,然後才能選擇它進行資源放置。
    • Le (小於或等於):指定屬性的叢集之觀察值必須小於或等於條件中的值,然後才能選擇它進行資源放置。
    • Eq (等於):指定屬性之叢集的觀察值必須等於條件中的值,然後才能選擇它進行資源放置。
    • Ne (不等於):叢集對指定屬性的觀察值必須不等於條件中的值,然後才能選擇它進行資源放置。

    如果使用運算子 GtGeLtLeEqNe,則條件中的值清單應該只有一個值。

  • 值: 值清單,這些值是 屬性的可能值。

機群根據條件中指定的屬性評估每個叢集。 如果不滿足 requiredDuringSchedulingIgnoredDuringExecution 下列出的條件,則將此成員叢集從資源中排除。

注意

如果成員叢集不具有條件中表示的屬性,它將自動使條件失敗。

以下是只選取具有五個或多個節點的叢集的範例放置原則。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    placementType: PickAll
    affinity:
        clusterAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
                clusterSelectorTerms:
                - propertySelector:
                    matchExpressions:
                    - name: "kubernetes-fleet.io/node-count"
                      operator: Ge
                      values:
                      - "5"

屬性排名的運作方式

使用 時 preferredDuringSchedulingIgnoredDuringExecution ,屬性排序器會根據其值以遞增或遞減順序來排名車隊中的所有叢集。 用於排序的權數會根據指定的值來計算。

屬性排序器包括:

  • 名稱:叢集屬性的名稱。
  • 排序順序:排序順序可以是 AscendingDescending。 使用順序時 Ascending ,慣用具有較低觀察值的成員叢集。 使用 Descending 順序時,偏好具有較高觀察值的成員叢集。
降序

針對排序順序遞減,會使用公式來計算比例加權:

((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value)) * Weight

例如,假設您希望根據可用 CPU 容量的屬性按遞減對叢集進行排序,並且您有由三個叢集組成的機群,其中包含以下可用 CPU:

Cluster 可用 CPU 容量
cluster-a 100
cluster-b 20
cluster-c 10

在這種情況下,排序器計算以下權數:

Cluster 可用 CPU 容量 運算 Weight
cluster-a 100 (100 - 10) / (100 - 10) 100%
cluster-b 20 (20 - 10) / (100 - 10) 11.11%
cluster-c 10 (10 - 10) / (100 - 10) 0%
升序

針對排序順序遞增,會使用公式來計算比例加權:

(1 - ((Observed Value - Minimum observed value) / (Maximum observed value - Minimum observed value))) * Weight

例如,假設您希望根據每個 CPU 核心成本按遞增對叢集進行排名,並且您有由三個叢集組成的機群,其 CPU 核心成本如下:

Cluster 每個 CPU 核心成本
cluster-a 1
cluster-b 0.2
cluster-c 0.1

在這種情況下,排序器計算以下權數:

Cluster 每個 CPU 核心成本 運算 Weight
cluster-a 1 1 - ((1 - 0.1) / (1 - 0.1)) 0%
cluster-b 0.2 1 - ((0.2 - 0.1) / (1 - 0.1)) 88.89%
cluster-c 0.1 1 - (0.1 - 0.1) / (1 - 0.1) 100%

使用 Tolerations

ClusterResourcePlacement 物件支援容忍度規格,這會套用至 ClusterResourcePlacement 物件。 每個容忍度包含下列欄位:

  • key: 容忍度的索引鍵。
  • value: 容忍度的值。
  • effect: 容忍度的效果,例如 NoSchedule
  • operator: 容忍度的運算子,例如 ExistsEqual

每個容忍是用來容許在上 ClusterResourcePlacement套用的一或多個特定污點。 一旦容忍 MemberCluster 上的所有污點,排程器就可以接著將資源傳播到叢集。 一旦建立之後,您無法從 ClusterResourcePlacement 物件更新或移除容忍。

如需詳細資訊,請參閱 關於容忍的開放原始碼 Fleet 檔。

設定推出策略

車隊會使用滾動更新策略來控制如何跨叢集推出更新。

在下列範例中,車隊排程器會循序推出每個叢集的更新,至少 unavailablePeriodSeconds 在叢集之間等候。 如果所有資源都已正確套用至叢集,則推出狀態會視為成功。 推出狀態檢查不會串連至子資源,例如,它不會確認部署所建立的 Pod 已就緒。

apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
  name: crp
spec:
  resourceSelectors:
    - ...
  policy:
    ...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
      unavailablePeriodSeconds: 60

如需詳細資訊,請參閱推出策略開放原始碼 Fleet 檔。

判斷放置狀態

機群排程器會將放置決策的詳細資訊和狀態更新至 ClusterResourcePlacement 物件。 輸出包含下列資訊:

  • 目前套用至放置的條件,包括放置是否已順利完成。
  • 每個成員叢集的放置狀態區段,其中顯示該叢集的部署狀態。

下列範例示範使用 PickNtest 命名空間和 test-1 ConfigMap 部署到兩個成員叢集的 ClusterResourcePlacement。 放置已順利完成,而且資源已放入 aks-member-1aks-member-2 叢集。

您可以使用 kubectl describe crp <name> 命令來檢視這項資訊。

kubectl describe crp crp-1
Name:         crp-1
Namespace:
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  ...
Spec:
  Policy:
    Number Of Clusters:  2
    Placement Type:      PickN
  Resource Selectors:
    Group:
    Kind:                  Namespace
    Name:                  test
    Version:               v1
  Revision History Limit:  10
Status:
  Conditions:
    Last Transition Time:  2023-11-10T08:14:52Z
    Message:               found all the clusters needed as specified by the scheduling policy
    Observed Generation:   5
    Reason:                SchedulingPolicyFulfilled
    Status:                True
    Type:                  ClusterResourcePlacementScheduled
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               All 2 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:   5
    Reason:                SynchronizeSucceeded
    Status:                True
    Type:                  ClusterResourcePlacementSynchronized
    Last Transition Time:  2023-11-10T08:23:43Z
    Message:               Successfully applied resources to 2 member clusters
    Observed Generation:   5
    Reason:                ApplySucceeded
    Status:                True
    Type:                  ClusterResourcePlacementApplied
  Placement Statuses:
    Cluster Name:  aks-member-1
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            aks-member-2
    Conditions:
      Last Transition Time:  2023-11-10T08:14:52Z
      Message:               Successfully scheduled resources for placement in aks-member-2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   5
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   5
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2023-11-10T08:23:43Z
      Message:               Successfully applied resources
      Observed Generation:   5
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:       Namespace
    Name:       test
    Version:    v1
    Kind:       ConfigMap
    Name:       test-1
    Namespace:  test
    Version:    v1
Events:
  Type    Reason                     Age                    From                                   Message
  ----    ------                     ----                   ----                                   -------
  Normal  PlacementScheduleSuccess   12m (x5 over 3d22h)    cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  3m28s (x7 over 3d22h)  cluster-resource-placement-controller  Resources have been applied to the selected clusters

放置變更觸發程式

機群排程器會以現有工作負載放置的穩定性為優先。 此優先順序可能會限制變更數目,而導致移除和重新排程工作負載。 下列案例可能會觸發放置變更:

  • ClusterResourcePlacement 物件中的放置原則變更可能會觸發工作負載的移除和重新排程。
    • 向外延展作業(在沒有其他變更的情況下增加 numberOfClusters )只會將工作負載放在新的叢集上,而且不會影響現有的位置。
  • 叢集變更,包括:
    • 如果新叢集符合放置原則,則新叢集變成合格的叢集可能會觸發放置,例如原則 PickAll
    • 放置位置的叢集會從車隊中移除。 根據原則,排程器會嘗試將所有受影響的工作負載放在剩餘的叢集上,而不會影響現有的放置。

僅限資源變更 (更新資源或更新 ClusterResourcePlacement 物件中的 ResourceSelector) 會在現有放置逐步推出,但不會觸發工作負載的重新排程。

下一步