從中樞叢集到成員叢集的 Kubernetes 資源放置
本文說明使用 Azure Kubernetes Fleet Manager 從中樞叢集到成員叢集的 Kubernetes 資源放置概念。
平臺管理員通常需要基於各種原因將 Kubernetes 資源部署到多個叢集,例如:
- 使用角色和角色繫結跨多個叢集管理存取控制。
- 執行必須位於所有叢集的基礎結構應用程式,例如 Prometheus 或 Flux。
應用程式開發人員通常需要基於各種原因將 Kubernetes 資源部署到多個叢集,例如:
- 將影片服務應用程式部署到不同區域中的多個叢集,以取得低延遲觀看體驗。
- 將購物車應用程式部署到兩個配對區域,以便客戶能夠在任一區域中斷時繼續購物。
- 使用成本較低的可用現成節點集區,將批次計算應用程式部署到叢集。
以手動方式跨多個叢集建立、更新和追蹤這些 Kubernetes 資源是一項繁瑣的工作。 機群提供 Kubernetes 資源傳播功能,以便大規模管理 Kubernetes 資源。 使用 Kubernetes Fleet,您可以在中樞叢集中建立 Kubernetes 資源,並透過 Kubernetes 自定義資源將其傳播至選取的成員叢集: MemberCluster
和 ClusterResourcePlacement
。
Kubernetes Fleet 根據開放原始碼雲端原生解決方案支援這些自定義資源,您可以在 開放原始碼 Fleet 檔中深入瞭解。
ClusterResourcePlacement 簡介
ClusterResourcePlacement
對象可用來告訴車隊排程器如何將一組指定的叢集範圍對象從車隊中樞叢集放置到成員叢集。 Deployments、StatefulSets、DaemonSets、ConfigMaps、Secrets 和 PersistentVolumeClaims 等命名空間範圍物件會在選取其包含命名空間時加入。
使用 ClusterResourcePlacement
,您可以:
- 選取要傳播到成員叢集的叢集範圍 Kubernetes 資源。
- 指定放置原則以手動或自動選取成員叢集作為目標叢集。
- 指定推出策略,安全地將所選 Kubernetes 資源的任何更新推出到多個目標叢集。
- 檢視每個目標叢集的傳播進度。
下圖顯示範例。
封裝資源
ClusterResourcePlacement
支援使用 ConfigMap 來封套特定 Kubernetes 資源類型,使其可以在中樞叢集上暫存,而不會對中樞叢集產生任何非預期的副作用。 如需資源類型清單,並瞭解此功能的運作方式,請參閱我們的 信封物件檔
放置類型
下列放置類型可用來控制必須傳播指定 Kubernetes 資源的叢集數目:
- PickFixed 會依名稱將資源放在特定成員叢集清單上。
- PickAll 會將資源放在所有成員叢集,或符合準則的所有成員叢集上。 此原則可用於放置基礎結構工作負載,例如叢集監視或報告應用程式。
- PickN 是最具彈性的放置選項,可根據親和性或拓撲散布條件約束來選取叢集,而且在將工作負載分散到多個適當叢集以確保需要可用性時很有用。
PickFixed 放置類型
如果您想要將工作負載部署到一組已知的成員叢集,您可以使用 PickFixed
放置原則依名稱選取叢集。
clusterNames
是這個放置類型的唯一有效原則選項。
下列範例示範如何將命名空間部署到 test-deployment
成員叢集 cluster1
和 cluster2
。
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 |
❌ | ❌ | ✅ |
根據標籤和屬性選取叢集
要選取叢集的可用標籤和屬性
使用 PickN
和 PickAll
放置類型時,您可以使用下列卷標和屬性作為原則的一部分。
標籤
下列標籤會自動新增至所有成員叢集,並可用於資源放置原則中的目標叢集選取。
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
(不等於):叢集對指定屬性的觀察值必須不等於條件中的值,然後才能選擇它進行資源放置。
如果使用運算子
Gt
、Ge
、Lt
、Le
、Eq
或Ne
,則條件中的值清單應該只有一個值。值: 值清單,這些值是 屬性的可能值。
機群根據條件中指定的屬性評估每個叢集。 如果不滿足 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
,屬性排序器會根據其值以遞增或遞減順序來排名車隊中的所有叢集。 用於排序的權數會根據指定的值來計算。
屬性排序器包括:
- 名稱:叢集屬性的名稱。
- 排序順序:排序順序可以是
Ascending
或Descending
。 使用順序時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
: 容忍度的運算子,例如Exists
或Equal
。
每個容忍是用來容許在上 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
物件。 輸出包含下列資訊:
- 目前套用至放置的條件,包括放置是否已順利完成。
- 每個成員叢集的放置狀態區段,其中顯示該叢集的部署狀態。
下列範例示範使用 PickN
將 test
命名空間和 test-1
ConfigMap 部署到兩個成員叢集的 ClusterResourcePlacement
。 放置已順利完成,而且資源已放入 aks-member-1
和 aks-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
) 會在現有放置逐步推出,但不會觸發工作負載的重新排程。