Freigeben über


Intelligente clusterübergreifende Kubernetes-Ressourcenplatzierung mit Azure Kubernetes Fleet Manager

Anwendungsentwickler müssen Kubernetes-Ressourcen häufig in mehreren Clustern bereitstellen. Flottenoperatoren müssen die besten Cluster für Workloads häufig basierend auf Heuristiken (wie Computekosten) oder verfügbaren Ressourcen (wie Arbeitsspeicher und CPU) auswählen. Es ist mühsam, diese Kubernetes-Ressourcen manuell in mehreren Clustern zu erstellen, zu aktualisieren und nachzuverfolgen. In diesem Artikel wird erläutert, wie Sie mithilfe dieser intelligenten Kubernetes-Ressourcenplatzierungsfunktion von Azure Kubernetes Fleet Manager (Kubernetes Fleet) in diesen Szenarios vorgehen können.

Die Ressourcenplatzierungsfunktion von Kubernetes Fleet kann Planungsentscheidungen basierend auf den folgenden Clustereigenschaften treffen:

  • Anzahl der Knoten
  • Computekosten/Speicher in Zielmitgliedsclustern
  • Ressourcenverfügbarkeit (CPU/Arbeitsspeicher) in Zielmitgliedsclustern

Weitere Informationen zu den Konzepten in diesem Artikel finden Sie unter Kubernetes-Ressourcenplatzierung vom Hubclustern zu Mitgliedsclustern.

Voraussetzungen

  • Sie benötigen ein Azure-Konto mit einem aktiven Abonnement. Sie können kostenlos ein Konto erstellen.

  • Sie müssen eine Kubernetes Fleet-Ressource mit einem oder mehreren Mitgliedsclustern haben. Wenn Sie keine haben, folgen Sie der Schnellstartanleitung, um eine Kubernetes Fleet-Ressource mit einem Hubcluster zu erstellen. Treten Sie dann Azure Kubernetes Service-Clustern (AKS) als Mitglied bei.

    Tipp

    Stellen Sie sicher, dass Ihre AKS-Mitgliedscluster so konfiguriert sind, dass Sie die Platzierung mithilfe der Clustereigenschaften testen können, an denen Sie interessiert sind (Standort, Knotenanzahl, Ressourcen oder Kosten).

  • Legen Sie die folgenden Umgebungsvariablen fest:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • Sie benötigen Azure CLI, Version 2.58.0 oder höher, um diesen Artikel abzuschließen. Informationen zum Ausführen einer Installation oder eines Upgrades finden Sie unter Installieren der Azure-Befehlszeilenschnittstelle.

  • Wenn Sie noch keine Kubernetes-CLI (kubectl) besitzen, können Sie sie mithilfe dieses Befehls installieren:

    az aks install-cli
    
  • Sie benötigen die fleet Azure CLI-Erweiterung. Sie können das SDK mithilfe des folgenden Befehls installieren:

    az extension add --name fleet
    

    Führen Sie den Befehl az extension update aus, um ein Update auf die neueste Version der Erweiterung durchzuführen:

    az extension update --name fleet
    
  • Autorisieren Sie kubectl für die Verbindung mit dem Kubernetes Fleet-Hubcluster:

    az fleet get-credentials --resource-group $GROUP --name $FLEET
    

Überprüfen von Memberclustereigenschaften

Rufen Sie die Bezeichnungen, Eigenschaften und Ressourcen für Ihr Membercluster ab, indem Sie das Hubcluster abfragen. Ausgabe als YAML, damit Sie die Ergebnisse lesen können.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

Die resultierende YAML-Datei enthält Details (Bezeichnungen und Eigenschaften), die Sie zum Erstellen von Platzierungsrichtlinien verwenden können. Ein Beispiel:

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

Wiederholen Sie diesen Schritt für jedes Mitgliedscluster, das Sie hinzufügen, um die Bezeichnungen und Eigenschaften zu identifizieren, die Sie in Ihrer Richtlinie verwenden können.

Vorbereiten einer Workload für die Platzierung

Veröffentlichen Sie als Nächstes eine Workload im Hubcluster, damit sie im Mitgliedscluster platziert werden kann.

  1. Erstellen Sie einen Namespace für die Workload im Hubcluster.

    kubectl create namespace test-app 
    
  2. Die Beispiel-Workload kann im neuen Namespace im Hubcluster bereitgestellt werden. Da diese Kubernetes-Ressourcentypen keine Kapselung erfordern, können Sie sie ohne Änderung bereitstellen.

    1. Speichern Sie den folgenden YAML-Code in einer Datei namens 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. Stellen Sie die Workloaddefinition auf Ihrem Hubcluster bereit:

      kubectl apply -f sample-workload.yaml
      

Mit der bereitgestellten Workloaddefinition ist es jetzt möglich, die intelligente Platzierungsfunktion von Kubernetes Fleet zu testen.

Testen von Workloadplatzierungsrichtlinien

Sie können die folgenden Beispiele zusammen mit der konzeptionellen Dokumentation als Anleitungen zum Schreiben Ihres eigenen ClusterResourcePlacement-Objekts verwenden.

Hinweis

Wenn Sie jede Beispielrichtlinie ausprobieren möchten, müssen Sie das vorherige ClusterResourcePlacement-Objekt löschen.

Platzierung basierend auf der Anzahl der Clusterknoten

Dieses Beispiel zeigt einen Eigenschaftensortierer, der die Descending-Reihenfolge verwendet. Diese Reihenfolge bedeutet, dass Kubernetes Fleet Cluster mit höheren Knotenanzahl bevorzugt.

Der Cluster mit der höchsten Knotenanzahl erhält eine Gewichtung von 20, der Cluster mit der niedrigsten Anzahl eine Gewichtung von 0. Andere Cluster erhalten proportionale Gewichtungen, die mithilfe der Berechnungsformel für Gewichtungen berechnet werden.

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

Platzierung mit Bezeichnungsauswahl und Eigenschaftensortierer

In diesem Beispiel erhält ein Cluster nur eine Gewichtung, wenn er über die Bezeichnung env=prod verfügt. Wenn der Cluster diese Bezeichnungseinschränkung erfüllt, erhält er eine proportionale Gewichtung basierend auf der Gesamtmenge der CPU in diesem Mitgliedscluster.

In diesem Beispiel wird veranschaulicht, wie Sie sowohl die Bezeichnungsauswahl als auch den Eigenschaftensortierer als preferredDuringSchedulingIgnoredDuringExecution-Affinität verwenden können. Ein Mitgliedscluster, der die Bezeichnungsauswahl nicht erfüllt, erhält keine Gewichtung. Mitgliedscluster, die die Bezeichnungsauswahl erfüllen, erhalten proportionale Gewichtungen, wie unter dem Eigenschaftensortierer angegeben.

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

Platzierung basierend auf Speicher- und CPU-Kernkosten

Da der Sortierer in diesem Beispiel eine Ascending-Reihenfolge aufweist, bevorzugt Kubernetes Fleet Cluster mit geringerem Arbeitsspeicher und CPU-Kernkosten. Der Cluster mit den niedrigsten Arbeitsspeicher- und CPU-Kernkosten erhält eine Gewichtung von 20, und der Cluster mit dem höchsten erhält eine Gewichtung von 0. Andere Cluster erhalten proportionale Gewichtungen, die mithilfe der Berechnungsformel für Gewichtungen berechnet werden.

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

Anzeigen des Status einer Platzierung

Wenn Sie den Status einer Platzierung anzeigen möchten, verwenden Sie entweder das Azure-Portal oder den kubectl-Befehl.

Details zum Anzeigen des Fortschritts einer Platzierung finden Sie unter Verwenden der ClusterResourcePlacement-API zum Verteilen von Ressourcen an Mitgliedercluster.

Bereinigen von Ressourcen

Ausführliche Informationen zum Entfernen einer Clusterressourcenplatzierung über das Azure-Portal oder den kubectl-Befehl finden Sie unter Bereinigen von Ressourcen im Artikel zum Verteilen von Ressourcen.