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.
Erstellen Sie einen Namespace für die Workload im Hubcluster.
kubectl create namespace test-app
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.
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
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.
Zugehöriger Inhalt
- Weitere Informationen zur Ressourcenverteilung finden Sie in der Open-Source-Dokumentation für Kubernetes Fleet.
Azure Kubernetes Service