Freigeben über


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

Anwendungsentwickler müssen Häufig Kubernetes-Ressourcen in mehreren Clustern in Cloud- und lokalen Umgebungen 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 diese Szenarien mithilfe der intelligenten Kubernetes-Ressourcenplatzierungsfunktion in Azure Kubernetes Fleet Manager behandeln können.

Fleet Manager unterstützt intelligente Ressourcenplatzierung sowohl für clusterweite (ClusterResourcePlacement) als auch für namespaceweite (ResourcePlacement) Ressourcen. Die Ressourcenplatzierungsfunktion kann Planungsentscheidungen basierend auf den folgenden Clustereigenschaften treffen:

  • Anzahl der Knoten
  • Kosten für Rechenleistung/Speicher in Zielmitglieds-Cluster
  • Ressourcenverfügbarkeit (CPU/Arbeitsspeicher) in Zielmitgliedsclustern

Weitere Informationen zu den Konzepten in diesem Artikel finden Sie unter Cluster-bezogene Ressourcenplatzierung und namespacebezogene Ressourcenplatzierung.

Voraussetzungen

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

  • Sie müssen über einen Flottenmanager mit einem Hubcluster und einem oder mehreren Mitgliedsclustern verfügen. Wenn Sie keinen haben, folgen Sie der Schnellstartanleitung , um einen Flottenmanager mit einem Hubcluster zu erstellen. Nehmen Sie dann Ihre unterstützten Kubernetes-Cluster als Mitglieder auf.

    Tipp

    Stellen Sie sicher, dass Ihre Kubernetes-Cluster so konfiguriert sind, dass Sie die Platzierung mithilfe der Clustereigenschaften testen können, die Sie interessieren (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 Fleet Manager Hub Cluster:

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

Eigenschaften von Mitgliederclustern überprüfen

Rufen Sie die Bezeichnungen, Eigenschaften und Ressourcen für Ihr Member-Cluster ab, indem Sie das Hub-Cluster 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 Arbeitslast im Hubcluster, damit sie in den Mitgliedsclustern 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 Platzierungsfähigkeit von Fleet Manager zu testen.

Workload-Platzierungsrichtlinien testen

Sie können die folgenden Beispiele als Leitfäden zum Schreiben eigener Ressourcenplatzierungsobjekte verwenden. Weitere Informationen finden Sie in der Dokumentation zur Ressourcenplatzierung im Clusterbereich und in der Dokumentation zur Ressourcenplatzierung im Namespacebereich.

Jedes Beispiel zeigt sowohl ClusterResourcePlacement (für Cluster-bezogene Ressourcen als auch ganze Namespaces) und ResourcePlacement (für bestimmte Namespace-bezogene Ressourcen) Varianten.

Hinweis

Um jede Beispielrichtlinie auszuprobieren, löschen Sie die vorherige ClusterResourcePlacement oder ResourcePlacement bevor Sie die nächste Richtlinie anwenden.

Platzierung basierend auf der Anzahl der Clusterknoten

Dieses Beispiel zeigt einen Eigenschaftensortierer, der die Descending-Reihenfolge verwendet. Diese Reihenfolge bedeutet, dass Fleet Manager 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.

ClusterResourcePlacement-Beispiel

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:
                propertySorter:
                  name: kubernetes-fleet.io/node-count
                  sortOrder: Descending

ResourcePlacement-Beispiel

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                propertySorter:
                  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, weist der Fleet Manager dem Cluster ein proportionales Gewicht basierend auf der Gesamt-CPU-Leistung des entsprechenden Mitgliedsclusters zu.

In diesem Beispiel wird veranschaulicht, wie Sie sowohl den Label-Selector als auch den Property-Sorter für 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.

ClusterResourcePlacement-Beispiel

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
                propertySorter:
                  name: resources.kubernetes-fleet.io/total-cpu
                  sortOrder: Descending

ResourcePlacement-Beispiel

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      version: v1
  policy:
    placementType: PickN
    numberOfClusters: 10
    affinity:
        clusterAffinity:
            preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 20
              preference:
                labelSelector:
                  matchLabels:
                    env: prod
                propertySorter:
                  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 Fleet Manager 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.

ClusterResourcePlacement-Beispiel

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

ResourcePlacement-Beispiel

apiVersion: placement.kubernetes-fleet.io/v1beta1
kind: ResourcePlacement
metadata:
  name: rp-demo
  namespace: test-app
spec:
  resourceSelectors:
    - group: "apps"
      kind: Deployment
      name: nginx-deployment
      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

Status der Platzierung ansehen

Sie können den Status einer Platzierung entweder über das Azure-Portal oder den Kubectl-Befehl anzeigen.

Details zur Anzeige des Platzierungsfortschritts:

Bereinigen von Ressourcen

So entfernen Sie eine Ressourcenplatzierung:

Nächste Schritte