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 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 deze scenario's kunt aanpakken met behulp van de intelligente Plaatsingsmogelijkheid voor Kubernetes-resources in Azure Kubernetes Fleet Manager (Kubernetes Fleet).

De resourceplaatsingsmogelijkheid van Kubernetes Fleet kan planningsbeslissingen nemen op basis van de volgende clustereigenschappen:

  • Aantal knooppunten
  • Kosten van rekenkracht/geheugen in doellidclusters
  • Beschikbaarheid van resources (CPU/geheugen) in doellidclusters

Zie Kubernetes-resourceplaatsing van hubcluster naar lidclusters voor meer informatie over de concepten in dit artikel.

Vereisten

  • U hebt een Azure-account met een actief abonnement nodig. Gratis een account maken

  • U moet een Kubernetes Fleet-resource hebben met een of meer lidclusters. Als u nog geen resource hebt, volgt u de quickstart om een Kubernetes Fleet-resource te maken met een hubcluster. Voeg vervolgens AKS-clusters (Azure Kubernetes Service) toe als leden.

    Tip

    Zorg ervoor dat uw AKS-lidclusters zo zijn geconfigureerd dat u plaatsing kunt testen met behulp van de clustereigenschappen die u interesseren (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 dit artikel te voltooien. Zie Azure CLI installeren als u CLI wilt installeren of upgraden.

  • Als u de Kubernetes CLI (kubectl) nog niet hebt, kunt u deze installeren met behulp van deze opdracht:

    az aks install-cli
    
  • U hebt de fleet Azure CLI-extensie nodig. U kunt deze 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:

    az extension update --name fleet
    
  • Kubectl autoriseren om verbinding te maken met het Kubernetes Fleet-hubcluster:

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

Eigenschappen van lidcluster controleren

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. Hier volgt een voorbeeld:

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 dat u toevoegt om de labels en eigenschappen te identificeren die u in uw beleid kunt gebruiken.

Een workload voorbereiden voor plaatsing

Publiceer vervolgens een workload naar het hubcluster, zodat deze op lidclusters kan worden geplaatst:

  1. Maak een naamruimte voor de workload in het hubcluster:

    kubectl create namespace test-app 
    
  2. De voorbeeldworkload kan worden geïmplementeerd in de nieuwe naamruimte op het hubcluster. Omdat voor deze Kubernetes-resourcetypen geen inkapselen is vereist, kunt u ze zonder wijzigingen implementeren.

    1. 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
      
    2. Implementeer de workloaddefinitie in uw hubcluster:

      kubectl apply -f sample-workload.yaml
      

Nu de definitie van de workload is geïmplementeerd, is het nu mogelijk om de intelligente plaatsingsmogelijkheid van Kubernetes Fleet 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 object.

Notitie

Als u elk voorbeeldbeleid wilt uitproberen, moet u het vorige ClusterResourcePlacement object verwijderen.

Plaatsing op basis van aantal clusterknooppunten

In dit voorbeeld ziet u een eigenschapssorteerder die gebruikmaakt van de Descending volgorde. Deze volgorde betekent dat Kubernetes 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 ontvangt een gewicht van 0. Andere clusters ontvangen proportionele gewichten die worden berekend via de formule voor gewichtsberekening.

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 ontvangt een cluster alleen een gewicht als het label env=prodbevat. Als het cluster voldoet aan die labelbeperking, krijgt het proportionele gewicht op basis van de totale CPU in dat lidcluster.

In dit voorbeeld ziet u hoe u zowel de labelkiezer als de 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 eigenschapssorteerder.

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 Kubernetes Fleet de voorkeur aan clusters met lagere geheugen- en CPU-kernkosten. Het cluster met de laagste geheugen- en CPU-kernkosten ontvangt een gewicht van 20 en het cluster met het hoogste gewicht 0. Andere clusters ontvangen proportionele gewichten die worden berekend via de formule voor gewichtsberekening.

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

De status van een plaatsing weergeven

Als u de status van een plaatsing wilt bekijken, kunt u de Azure-portal of de kubectl-opdracht gebruiken.

U vindt meer informatie over het weergeven van de voortgang van een plaatsing in De ClusterResourcePlacement-API gebruiken om resources door te geven aan lidclusters.

Resources opschonen

Zie Resources opschonen in het artikel over het doorgeven van resources voor meer informatie over het verwijderen van plaatsing van een clusterresource via Azure Portal of de kubectl-opdracht.