使用 Azure Kubernetes Fleet Manager 的智慧型手機跨叢集 Kubernetes 資源放置
應用程式開發人員通常需要將 Kubernetes 資源部署至多個叢集中。 車隊操作員通常需要根據啟發學習法(例如計算成本)或可用的資源(例如記憶體和 CPU)來挑選工作負載的最佳叢集。 以手動方式跨多個叢集建立、更新和追蹤這些 Kubernetes 資源是一項繁瑣的工作。 本文涵蓋如何使用 Azure Kubernetes Fleet Manager (Kubernetes Fleet) 中的智慧型手機 Kubernetes 資源放置功能來解決這些案例。
Kubernetes Fleet 的資源放置功能可以根據下列叢集屬性做出排程決策:
- 節點計數
- 目標成員叢集中的計算/記憶體成本
- 目標成員叢集中的資源 (CPU/記憶體) 可用性
如需本文中概念的詳細資訊,請參閱 從中樞叢集到成員叢集的 Kubernetes 資源放置。
必要條件
您需要具有有效訂用帳戶的 Azure 帳戶。 免費建立帳戶。
您必須具有具有一或多個成員叢集的 Kubernetes Fleet 資源。 如果您沒有,請遵循 快速入門 來建立具有中樞叢集的 Kubernetes Fleet 資源。 然後,將 Azure Kubernetes Service (AKS) 叢集加入為成員。
提示
請確定您已設定 AKS 成員叢集,讓您可以使用感興趣的叢集屬性來測試放置位置(位置、節點計數、資源或成本)。
設定下列環境變數:
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>
您需要安裝 Azure CLI 2.58.0 版或更新版本,才能完成本文。 若要安裝或升級,請參閱安裝 Azure CLI。
如果您還沒有 Kubernetes CLI (kubectl),您可以使用此命令加以安裝:
az aks install-cli
您需要
fleet
Azure CLI 擴充功能。 您可以執行下列命令來安裝它:az extension add --name fleet
az extension update
執行 命令以更新至最新版本的擴充功能:az extension update --name fleet
授權 kubectl 連線到 Kubernetes Fleet 中樞叢集:
az fleet get-credentials --resource-group $GROUP --name $FLEET
檢查成員叢集屬性
藉由查詢中樞叢集,擷取成員叢集的標籤、屬性和資源。 輸出為 YAML,讓您可以讀取結果。
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
產生的 YAML 檔案包含可用來建置放置原則的詳細數據(標籤和屬性)。 以下是範例:
apiVersion: cluster.kubernetes-fleet.io/v1
kind: MemberCluster
metadata:
annotations:
...
labels:
fleet.azure.com/location: eastus2
fleet.azure.com/resource-group: resource-group
fleet.azure.com/subscription-id: 8xxxxxxx-dxxx-4xxx-bxxx-xxxxxxxxxxx8
name: cluster01
resourceVersion: "123456"
uid: 7xxxxxxx-5xxx-4xxx-bxxx-xxxxxxxxxxx4
spec:
...
status:
...
properties:
kubernetes-fleet.io/node-count:
observationTime: "2024-09-19T01:33:54Z"
value: "2"
kubernetes.azure.com/per-cpu-core-cost:
observationTime: "2024-09-19T01:33:54Z"
value: "0.073"
kubernetes.azure.com/per-gb-memory-cost:
observationTime: "2024-09-19T01:33:54Z"
value: "0.022"
resourceUsage:
allocatable:
cpu: 3800m
memory: 10320392Ki
available:
cpu: 2740m
memory: 8821256Ki
capacity:
cpu: "4"
memory: 14195208Ki
針對您新增的每個成員叢集重複此步驟,以識別您可以在原則中使用的標籤和屬性。
準備工作負載以供放置
接下來,將工作負載發佈至中樞叢集,使其可以放在成員叢集上:
為中樞叢集上的工作負載建立命名空間:
kubectl create namespace test-app
範例工作負載可以部署到中樞叢集上的新命名空間。 由於這些 Kubernetes 資源類型不需要 封裝,因此您可以部署它們而不需變更。
將下列 YAML 儲存到名為 的
sample-workload.yaml
檔案中:apiVersion: v1 kind: Service metadata: name: nginx-service namespace: test-app spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80 type: LoadBalancer --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment namespace: test-app spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.16.1 ports: - containerPort: 80
將工作負載定義部署至中樞叢集:
kubectl apply -f sample-workload.yaml
部署工作負載定義之後,現在可以測試 Kubernetes Fleet 的智慧型手機放置功能。
測試工作負載放置原則
您可以使用下列範例以及 概念文件,作為撰寫您自己的 ClusterResourcePlacement
物件的指南。
注意
如果您想要試用每個範例原則,請務必刪除先前 ClusterResourcePlacement
的物件。
根據叢集節點計數放置
此範例顯示使用 Descending
順序的屬性排序器。 此順序表示 Kubernetes Fleet 偏好具有較高節點計數的叢集。
節點計數最高的叢集會得到 20 的權數,而最低叢集則會收到 0 的權數。 其他叢集會透過 權數計算公式接收計算的比例權數。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
metricSorter:
name: kubernetes-fleet.io/node-count
sortOrder: Descending
使用標籤選取器和屬性排序器放置
在此範例中,只有當叢集有卷標 env=prod
時,叢集才會收到權數。 如果叢集符合該標籤條件約束,則會根據該成員叢集中的總 CPU 數量來指定比例加權。
此範例示範如何使用標籤選取器和屬性排序器來取得 preferredDuringSchedulingIgnoredDuringExecution
親和性。 標籤選取器失敗的成員叢集不會收到任何權數。 滿足標籤選取器的成員叢集會收到按比例加權,如屬性排序器所指定。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 10
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
labelSelector:
matchLabels:
env: prod
metricSorter:
name: resources.kubernetes-fleet.io/total-cpu
sortOrder: Descending
根據記憶體和 CPU 核心成本放置
由於此範例中的排序器有訂單 Ascending
,Kubernetes Fleet 偏好具有較低記憶體和 CPU 核心成本的叢集。 記憶體最低且 CPU 核心成本最低的叢集會獲得 20 的權數,且最高叢集的權數為 0。 其他叢集會透過權數計算公式接收計算的比例權數。
apiVersion: placement.kubernetes-fleet.io/v1
kind: ClusterResourcePlacement
metadata:
name: crp-demo
spec:
resourceSelectors:
- group: ""
kind: Namespace
name: test-app
version: v1
policy:
placementType: PickN
numberOfClusters: 2
affinity:
clusterAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-gb-memory-core-cost
sortOrder: Ascending
- weight: 20
preference:
propertySorter:
name: kubernetes.azure.com/per-cpu-core-cost
sortOrder: Ascending
檢視位置的狀態
如果您想要檢視位置的狀態,可以使用 Azure 入口網站 或 kubectl 命令。
您可以在使用 ClusterResourcePlacement API 將資源傳播至成員叢集中,找到有關如何檢視放置進度的詳細數據。
清除資源
如需如何透過 Azure 入口網站 或 kubectl 命令移除叢集資源放置的詳細資訊,請參閱有關傳播資源的文章中的清除資源。
相關內容
- 若要深入瞭解資源傳播,請參閱 開放原始碼 Kubernetes Fleet 檔。