共用方式為


使用 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

針對您新增的每個成員叢集重複此步驟,以識別您可以在原則中使用的標籤和屬性。

準備工作負載以供放置

接下來,將工作負載發佈至中樞叢集,使其可以放在成員叢集上:

  1. 為中樞叢集上的工作負載建立命名空間:

    kubectl create namespace test-app 
    
  2. 範例工作負載可以部署到中樞叢集上的新命名空間。 由於這些 Kubernetes 資源類型不需要 封裝,因此您可以部署它們而不需變更。

    1. 將下列 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
      
    2. 將工作負載定義部署至中樞叢集:

      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 命令移除叢集資源放置的詳細資訊,請參閱有關傳播資源的文章中的清除資源