Dela via


Intelligent kubernetes-resursplacering mellan kluster med Azure Kubernetes Fleet Manager

Programutvecklare behöver ofta distribuera Kubernetes-resurser till flera kluster i molnmiljöer och lokala miljöer. Vagnparksoperatörer behöver ofta välja de bästa klustren för arbetsbelastningar baserat på heuristik (till exempel beräkningskostnader) eller tillgängliga resurser (till exempel minne och CPU). Det är tråkigt att skapa, uppdatera och spåra dessa Kubernetes-resurser i flera kluster manuellt. Den här artikeln beskriver hur du kan hantera dessa scenarier med hjälp av den intelligenta kubernetes-resursplaceringsfunktionen i Azure Kubernetes Fleet Manager.

Funktionen för resursplacering i Fleet Manager kan fatta schemaläggningsbeslut baserat på följande klusteregenskaper:

  • Antal noder
  • Kostnad för beräkning/minne i målmedlemskluster
  • Resurstillgänglighet (CPU/minne) i målmedlemskluster

Mer information om begreppen i den här artikeln finns i Kubernetes-resursplacering från hubbkluster till medlemskluster.

Förutsättningar

  • Du behöver ett Azure-konto med en aktiv prenumeration. Skapa ett konto utan kostnad.

  • Du måste ha en Fleet Manager med ett hubbkluster och ett eller flera medlemskluster. Om du inte har någon följer du snabbstarten för att skapa en Fleet Manager med ett hubbkluster. Anslut sedan dina Kubernetes-kluster som stöds som medlemmar.

    Tips

    Se till att dina Kubernetes-kluster är konfigurerade så att du kan testa placeringen med hjälp av de klusteregenskaper som intresserar dig (plats, antal noder, resurser eller kostnad).

  • Ange följande miljövariabler:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • Du behöver Azure CLI version 2.58.0 eller senare installerat för att slutföra den här artikeln. Information om hur du installerar eller uppgraderar finns i Installera Azure CLI.

  • Om du inte redan har Kubernetes CLI (kubectl) kan du installera det med hjälp av det här kommandot:

    az aks install-cli
    
  • Du behöver Azure CLI-tillägget fleet . Du kan installera det genom att köra följande kommando:

    az extension add --name fleet
    

    az extension update Kör kommandot för att uppdatera till den senaste versionen av tillägget:

    az extension update --name fleet
    
  • Auktorisera kubectl för att ansluta till Fleet Manager-hubbklustret:

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

Granska egenskaper för medlemskluster

Hämta etiketter, egenskaper och resurser för ditt medlemskluster genom att fråga hubbklustret. Utdata som YAML så att du kan läsa resultatet.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

Den resulterande YAML-filen innehåller information (etiketter och egenskaper) som du kan använda för att skapa placeringsprinciper. Här är ett exempel:

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

Upprepa det här steget för varje medlemskluster som du lägger till för att identifiera de etiketter och egenskaper som du kan använda i principen.

Förbered en arbetsbelastning för placering

Publicera sedan en arbetsbelastning till hubbklustret så att den kan placeras på medlemskluster:

  1. Skapa ett namnområde för arbetsbelastningen i hubbklustret:

    kubectl create namespace test-app 
    
  2. Exempelarbetsbelastningen kan distribueras till det nya namnområdet i hubbklustret. Eftersom dessa Kubernetes-resurstyper inte kräver kapsling kan du distribuera dem utan ändringar.

    1. Spara följande YAML i en fil med namnet 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. Distribuera arbetsbelastningsdefinitionen till ditt hubbkluster:

      kubectl apply -f sample-workload.yaml
      

När arbetsbelastningsdefinitionen har distribuerats är det nu möjligt att testa fleet manager:s intelligenta placeringskapacitet.

Testa arbetsbelastningsplaceringsprinciper

Du kan använda följande exempel, tillsammans med den konceptuella dokumentationen, som guider för att skriva ditt eget ClusterResourcePlacement objekt.

Kommentar

Om du vill prova varje exempelprincip måste du ta bort föregående ClusterResourcePlacement objekt.

Placering baserat på antalet klusternoder

Det här exemplet visar en egenskapssorterare som använder Descending ordern. Den här ordningen innebär att Fleet Manager föredrar kluster med högre antal noder.

Klustret med det högsta antalet noder får en vikt på 20 och klustret med lägst får en vikt på 0. Andra kluster får proportionella vikter som beräknas via formeln för viktberäkning.

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

Placering med etikettväljare och egenskapssorterare

I det här exemplet får ett kluster endast en vikt om det har etiketten env=prod. Om klustret uppfyller den etikettbegränsningen får det proportionell vikt baserat på mängden total CPU i det medlemsklustret.

Det här exemplet visar hur du kan använda både etikettväljaren och egenskapssorteraren för preferredDuringSchedulingIgnoredDuringExecution tillhörighet. Ett medlemskluster som misslyckas med etikettväljaren får ingen vikt. Medlemskluster som uppfyller etikettväljaren får proportionella vikter enligt vad som anges under egenskapssorteraren.

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

Placering baserat på kostnaden för minne och CPU-kärnor

Eftersom sorteraren i det här exemplet har en Ascending ordning föredrar Fleet Manager kluster med lägre kostnader för minne och CPU-kärnor. Klustret med den lägsta kostnaden för minne och CPU-kärnor får en vikt på 20 och klustret med högst får en vikt på 0. Andra kluster får proportionella vikter som beräknas via formeln för viktberäkning.

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

Visa status för en placering

Om du vill visa status för en placering kan du använda antingen kommandot Azure Portal eller kubectl.

Du hittar information om hur du visar en placerings förlopp i Använd ClusterResourcePlacement-API:et för att sprida resurser till medlemskluster.

Rensa resurser

Mer information om hur du tar bort en klusterresursplacering via kommandot Azure Portal eller kubectl finns i Rensa resurser i artikeln om att sprida resurser.