Intelligente plaatsing van Kubernetes-resources tussen clusters met behulp van Azure Kubernetes Fleet Manager
Toepassingsontwikkelaars moeten Kubernetes-resources vaak implementeren in meerdere clusters. Vlootoperators moeten vaak de beste clusters kiezen voor workloads op basis van heuristiek, zoals de kosten van rekenkracht of beschikbare resources, zoals geheugen en CPU. Het is vervelend om deze Kubernetes-resources handmatig te maken, bij te werken en bij te houden in meerdere clusters. In dit artikel wordt beschreven hoe u met Azure Kubernetes Fleet Manager (Fleet) deze scenario's kunt aanpakken met behulp van de intelligente functie voor plaatsing van Kubernetes-resources.
Overzicht
Fleet biedt resourceplaatsingsmogelijkheden die planningsbeslissingen kunnen nemen op basis van de volgende clustereigenschappen:
- Aantal knooppunten
- Kosten van rekenkracht/geheugen in doellidclusters
- Beschikbaarheid van resources (CPU/geheugen) in doellidclusters
Lees het conceptuele overzicht van resourcedoorgifte om inzicht te hebben in de concepten die in deze procedure worden gebruikt.
Vereisten
Een Azure-account met een actief abonnement. Gratis een account maken
U moet een Fleet-resource met een of meer lidclusters hebben. Zo niet, volg de quickstart om een Fleet-resource te maken met een hubcluster en voeg vervolgens Azure Kubernetes Service-clusters (AKS) toe als leden.
Aanbeveling: Zorg ervoor dat uw AKS-lidclusters zijn geconfigureerd, zodat u plaatsing kunt testen met behulp van de clustereigenschappen waarin u geïnteresseerd bent (locatie, aantal knooppunten, resources of kosten).
Stel de volgende omgevingsvariabelen in:
export GROUP=<resource-group> export FLEET=<fleet-name> export MEMBERCLUSTER01=<cluster01> export MEMBERCLUSTER02=<cluster02>
U moet Azure CLI versie 2.58.0 of hoger hebben geïnstalleerd om deze procedure te voltooien. Zie Azure CLI installeren als u CLI wilt installeren of upgraden.
Als u deze nog niet hebt, kunt u de Kubernetes CLI (kubectl) installeren met behulp van deze opdracht:
az aks install-cli
U hebt ook de
fleet
Azure CLI-extensie nodig, die u kunt installeren door de volgende opdracht uit te voeren:az extension add --name fleet
Voer de
az extension update
opdracht uit om bij te werken naar de nieuwste versie van de extensie die is uitgebracht:az extension update --name fleet
Autoriseren kubectl om verbinding te maken met het fleet hub-cluster:
az fleet get-credentials --resource-group $GROUP --name $FLEET
Eigenschappen van lidcluster controleren
Herhaal deze stappen voor elk lidcluster dat u toevoegt.
Haal de labels, eigenschappen en resources voor uw lidcluster op door een query uit te voeren op het hubcluster. Uitvoer als YAML, zodat u de resultaten kunt lezen.
kubectl get membercluster $MEMBERCLUSTER01 –o yaml
Het resulterende YAML-bestand bevat details (labels en eigenschappen) die u kunt gebruiken om plaatsingsbeleid te bouwen.
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
Herhaal deze stap voor elk lidcluster, zodat u de labels en eigenschappen identificeert die u in uw beleid kunt gebruiken.
Een workload voorbereiden voor plaatsing
Publiceer vervolgens een workload naar ons hubcluster, zodat deze op lidclusters kan worden geplaatst.
Maak een naamruimte voor onze workload in het hubcluster.
kubectl create namespace test-app
De voorbeeldworkload kan worden geïmplementeerd in de nieuwe naamruimte op het hubcluster. Omdat voor deze Kubernetes-resourcetypen geen inkapselen is vereist, kunnen ze zonder wijzigingen worden geïmplementeerd.
Sla de volgende YAML op in een bestand met de naam
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
Implementeer de workloaddefinitie naar uw hubcluster met behulp van de opdracht.
kubectl apply -f sample-workload.yaml
Nu de definitie van de workload is geïmplementeerd, is het nu mogelijk om de intelligente plaatsingsmogelijkheden van de vloot te testen.
Beleid voor plaatsing van workloads testen
U kunt de volgende voorbeelden gebruiken, samen met de conceptuele documentatie, als handleidingen voor het schrijven van uw eigen ClusterResourcePlacement.
Notitie
Als u elk voorbeeldbeleid wilt uitproberen, moet u het vorige ClusterResourcePlacement verwijderen.
Plaatsing op basis van aantal clusterknooppunten
In dit voorbeeld ziet u een eigenschapssorteerder met behulp van de Descending
volgorde, wat betekent dat fleet de voorkeur geeft aan clusters met een hoger aantal knooppunten.
Het cluster met het hoogste aantal knooppunten ontvangt een gewicht van 20 en het cluster met het laagste aantal knooppunten 0. Andere clusters ontvangen proportionele gewichten die worden berekend met behulp van de formule voor gewichtberekening.
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
Plaatsing met labelkiezer en eigenschapssorteerder
In dit voorbeeld krijgt een cluster alleen een gewicht als het label env=prod
bevat. Als het voldoet aan die labelbeperking, krijgt het cluster proportioneel gewicht op basis van de totale CPU in dat lidcluster.
In dit voorbeeld ziet u hoe u zowel labelkiezer als eigenschapssor voor preferredDuringSchedulingIgnoredDuringExecution
affiniteit kunt gebruiken. Een lidcluster dat de labelkiezer mislukt, ontvangt geen gewicht. Lidclusters die voldoen aan de labelkiezer ontvangen proportionele gewichten zoals opgegeven onder de eigenschapssororteerder.
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
Plaatsing op basis van geheugen- en CPU-kernkosten
Omdat de sorteerfunctie in dit voorbeeld een Ascending
volgorde heeft, geeft fleet de voorkeur aan clusters met lagere geheugen- en CPU-kernkosten. Het cluster met de laagste geheugen- en CPU-kernkosten zou een gewicht van 20 krijgen en het cluster met het hoogste zou 0 ontvangen. Andere clusters ontvangen proportionele gewichten die worden berekend met behulp van de formule voor gewichtberekening.
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
Status van plaatsing weergeven
Als u de status van een plaatsing wilt bekijken, kunt u de Azure-portal of kubectl-opdracht gebruiken.
Meer informatie over het weergeven van de voortgang van een plaatsing vindt u in de quickstart voor het doorgeven van resources.
Resources opschonen
Meer informatie over het verwijderen van een plaatsing van een clusterresource via de Azure-portal of kubectl-opdracht vindt u in de sectie Resources opschonen van de quickstart voor het doorgeven van resources.
Volgende stappen
Zie de volgende resources voor meer informatie over het doorgeven van resources:
Azure Kubernetes Service