設定 Kubernetes 資源從中樞叢集傳播到成員叢集
本文描述使用 Azure Kubernetes 機群管理員 (以下簡稱「機群」) 將 Kubernetes 資源從中樞叢集傳播到成員叢集的概念。
平台管理員通常會基於各種原因而必須將 Kubernetes 資源部署到多個叢集,例如:
- 使用角色和角色繫結跨多個叢集管理存取控制。
- 執行必須位於所有叢集的基礎結構應用程式,例如 Prometheus 或 Flux。
應用程式開發人員通常會基於各種原因而必須將 Kubernetes 資源部署到多個叢集,例如:
- 將影片服務應用程式部署到不同區域中的多個叢集,以取得低延遲觀看體驗。
- 將購物車應用程式部署到兩個配對區域,以便客戶能夠在任一區域中斷時繼續購物。
- 使用成本較低的可用現成節點集區,將批次計算應用程式部署到叢集。
以手動方式跨多個叢集建立、更新和追蹤這些 Kubernetes 資源是一項繁瑣的工作。 機群提供 Kubernetes 資源傳播功能,以便大規模管理 Kubernetes 資源。 使用機群,您可以在中樞叢集內建立 Kubernetes 資源,然後透過 Kubernetes 自訂資源 MemberCluster
和 ClusterResourcePlacement
將其傳播到選取的成員叢集。 機群會根據開放原始碼雲端原生多叢集解決方案支援這些自訂資源。 如需詳細資訊,請參閱上游機群文件 (英文)。
重要
Azure Kubernetes 機群管理員預覽功能由客戶自行決定取用。 預覽會以「現狀」和「可供使用時」提供,其其不受服務等級協定和有限瑕疵擔保所保護。 客戶支援部門會竭盡全力支援一部分的 Azure Kubernetes 機群管理員預覽功能。 因此,這些功能不適合實際執行用途。
資源傳播工作流程
什麼是 MemberCluster
?
叢集加入機群之後,就會在中樞叢集上建立對應的 MemberCluster
自訂資源。 您可以使用此自訂資源來選取資源傳播的目標叢集。
下列標籤可用來選取資源傳播的目標叢集,並會自動新增至所有成員叢集:
fleet.azure.com/location
fleet.azure.com/resource-group
fleet.azure.com/subscription-id
如需詳細資訊,請參閱 MemberCluster API 參考 (英文)。
什麼是 ClusterResourcePlacement
?
ClusterResourcePlacement
物件可用來指示機群排程器如何將一組指定的叢集範圍物件從中樞叢集放入成員叢集。 Deployments、StatefulSets、DaemonSets、ConfigMaps、Secrets 和 PersistentVolumeClaims 等命名空間範圍物件會在選取其包含命名空間時加入。
使用 ClusterResourcePlacement
,您可以:
- 選取要傳播到成員叢集的叢集範圍 Kubernetes 資源。
- 指定放置原則,以手動或自動方式選取一部分或所有成員叢集作為目標叢集。
- 指定推出策略,安全地將所選 Kubernetes 資源的任何更新推出到多個目標叢集。
- 檢視每個目標叢集的傳播進度。
ClusterResourcePlacement
物件支援使用 ConfigMap 封裝物件,以協助傳播到成員叢集,而不會有任何非預期的副作用。 選取方法包括:
- 群組、版本和種類: 選取並放置指定類型的所有資源。
- 群組、版本、種類和名稱: 選取並放置指定類型的一個特定資源。
- 群組、版本、種類和標籤: 選取並放置符合所提供標籤之指定類型的所有資源。
如需詳細資訊,請參閱 ClusterResourcePlacement
API 參考 (英文)。
建立 ClusterResourcePlacement
時,可指定下列親和性類型:
- requiredDuringSchedulingIgnoredDuringExecution: 由於此親和性是排程期間的必要類型,因此會根據其屬性篩選叢集。
- preferredDuringSchedulingIgnoredDuringExecution: 由於此親和性只是偏好的類型,但在排程期間並非必要,因此會根據成本或資源可用性等指定的屬性,提供叢集的優先排名。
有多個放置類型可用來控制 Kubernetes 資源需要傳播到的叢集數目:
PickAll
會將資源放入所有可用的成員叢集。 此原則可用於放置基礎結構工作負載,例如叢集監視或報告應用程式。PickFixed
會依名稱將資源放入特定成員叢集清單。PickN
是最具彈性的放置選項,可讓您根據親和性或拓撲散佈條件約束來選取叢集,這在將工作負載散佈到多個適當叢集以確保可用性時會很有用。
PickAll
放置原則
您可以使用 PickAll
放置原則,將工作負載部署到機群中的所有成員叢集 (選擇性地符合一組準則)。
下列範例示範如何將 prod-deployment
命名空間及其所有物件部署到標示為 environment: production
的所有叢集:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp-1
spec:
policy:
placementType: PickAll
affinity:
clusterAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
clusterSelectorTerms:
- labelSelector:
matchLabels:
environment: production
resourceSelectors:
- group: ""
kind: Namespace
name: prod-deployment
version: v1
這個簡單的原則會擷取 prod-deployment
命名空間及其內含的所有資源,並將其部署到機群中具有指定 environment
標籤的所有成員叢集。 如果需要所有叢集,您可以將 affinity
字詞整個移除。
PickFixed
放置原則
如果您想要將工作負載部署到一組已知的成員叢集,您可以使用 PickFixed
放置原則,依名稱選取叢集。
下列範例示範如何將 test-deployment
命名空間部署到成員叢集 cluster1
和 cluster2
:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp-2
spec:
policy:
placementType: PickFixed
clusterNames:
- cluster1
- cluster2
resourceSelectors:
- group: ""
kind: Namespace
name: test-deployment
version: v1
PickN
放置原則
PickN
放置原則是最具彈性的選項,可讓您根據親和性和拓撲散佈條件約束,將資源放入可設定數目的叢集。
具有親和性的 PickN
搭配 PickN
放置原則函式使用親和性,類似於搭配 Pod 排程使用親和性。 您可以同時設定必要和偏好的親和性。 必要的親和性可防止放置到不符合這些指定親和性的叢集,而偏好的親和性可在制定放置決策時排序一組有效的叢集。
下列範例示範如何將工作負載部署到三個叢集。 只有具有 critical-allowed: "true"
標籤的叢集是有效的放置目標,並會優先使用具有標籤 critical-level: 1
的叢集:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp
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/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp
spec:
resourceSelectors:
- ...
policy:
placementType: PickN
topologySpreadConstraints:
- maxSkew: 2
topologyKey: region
whenUnsatisfiable: DoNotSchedule
- maxSkew: 2
topologyKey: updateDay
whenUnsatisfiable: ScheduleAnyway
如需詳細資訊,請參閱上游拓撲散佈條件約束機群文件 (英文)。
更新策略
機群使用輪流更新策略來控制如何將更新推出到多個叢集放置。
下列範例示範如何使用預設設定來設定輪流更新策略:
apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ClusterResourcePlacement
metadata:
name: crp
spec:
resourceSelectors:
- ...
policy:
...
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
unavailablePeriodSeconds: 60
排程器會循序將更新推出到每個叢集,並至少在叢集之間等候 unavailablePeriodSeconds
。 如果所有資源都已正確套用至叢集,則推出狀態會視為成功。 推出狀態檢查不會串聯到子資源。例如,該檢查不會確認部署所建立的 Pod 是否已就緒。
如需詳細資訊,請參閱上游推出策略機群文件 (英文)。
放置狀態
機群排程器會將放置決策的詳細資訊和狀態更新至 ClusterResourcePlacement
物件。 您可以使用 kubectl describe crp <name>
命令來檢視這項資訊。 輸出包含下列資訊:
- 目前套用至放置的條件,包括放置是否已順利完成。
- 每個成員叢集的放置狀態區段,其中顯示該叢集的部署狀態。
下列範例示範使用 PickN
將 test
命名空間和 test-1
ConfigMap 部署到兩個成員叢集的 ClusterResourcePlacement
。 放置已順利完成,而且資源已放入 aks-member-1
和 aks-member-2
叢集。
Name: crp-1
Namespace:
Labels: <none>
Annotations: <none>
API Version: placement.kubernetes-fleet.io/v1beta1
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
) 會在現有放置逐步推出,但不會觸發工作負載的重新排程。
容忍度
ClusterResourcePlacement
物件支援容忍度規格,這會套用至 ClusterResourcePlacement
物件。 每個容忍度包含下列欄位:
key
: 容忍度的索引鍵。value
: 容忍度的值。effect
: 容忍度的效果,例如NoSchedule
。operator
: 容忍度的運算子,例如Exists
或Equal
。
您可以使用每個容忍度來容忍在 ClusterResourcePlacement
上套用的一或多個特定污點。 一旦容忍 MemberCluster
上的所有污點,排程器就可以接著將資源傳播到叢集。 建立 ClusterResourcePlacement
物件之後,您將無法從該物件更新或移除容忍度。
如需詳細資訊,請參閱上游機群文件 (英文)。
存取機群資源叢集的 Kubernetes API
如果您已建立 Azure Kubernetes 機群管理員資源並啟用中樞叢集,您可以使用它來集中控制 Kubernetes 物件傳播等案例。 若要存取機群資源叢集的 Kubernetes API,請按照使用 Azure Kubernetes 機群管理員存取機群資源叢集的 Kubernetes API 中的步驟進行。