Delen via


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=prodbevat. 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: