Condividi tramite


Posizionamento intelligente delle risorse Kubernetes tra cluster con Azure Kubernetes Fleet Manager

Spesso gli sviluppatori di applicazioni devono distribuire le risorse Kubernetes in più cluster. Gli operatori fleet spesso devono scegliere i cluster migliori per i carichi di lavoro in base all'euristica (ad esempio il costo del calcolo) o alle risorse disponibili (ad esempio memoria e CPU). È noioso creare, aggiornare e tenere traccia manualmente di queste risorse Kubernetes in più cluster. Questo articolo illustra come gestire questi scenari usando la funzionalità di posizionamento intelligente delle risorse Kubernetes in Azure Kubernetes Fleet Manager (Kubernetes Fleet).

La funzionalità di posizionamento delle risorse di Kubernetes Fleet può prendere decisioni di pianificazione in base alle proprietà del cluster seguenti:

  • Numero di nodi
  • Costo di calcolo/memoria nei cluster membri di destinazione
  • Disponibilità delle risorse (CPU/memoria) nei cluster membri di destinazione

Per altre informazioni sui concetti di questo articolo, vedere Posizionamento delle risorse Kubernetes dal cluster hub ai cluster membri.

Prerequisiti

  • È necessario un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.

  • È necessario avere una risorsa Kubernetes Fleet con uno o più cluster membri. Se non è disponibile, seguire la guida introduttiva per creare una risorsa Kubernetes Fleet con un cluster hub. Aggiungere quindi i cluster servizio Azure Kubernetes (servizio Azure Kubernetes) come membri.

    Suggerimento

    Assicurarsi che i cluster membri del servizio Azure Kubernetes siano configurati in modo da poter testare il posizionamento usando le proprietà del cluster che interessano (posizione, numero di nodi, risorse o costi).

  • Impostare le seguenti variabili di ambiente:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • Per completare questo articolo, è necessaria l'interfaccia della riga di comando di Azure versione 2.58.0 o successiva. Per eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

  • Se l'interfaccia della riga di comando di Kubernetes (kubectl) non è già disponibile, è possibile installarla usando questo comando:

    az aks install-cli
    
  • È necessaria l'estensione dell'interfaccia della fleet riga di comando di Azure. È possibile installarlo eseguendo il comando seguente:

    az extension add --name fleet
    

    Eseguire il comando per eseguire l'aggiornamento az extension update alla versione più recente dell'estensione:

    az extension update --name fleet
    
  • Autorizzare kubectl a connettersi al cluster hub kubernetes Fleet:

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

Esaminare le proprietà del cluster membro

Recuperare le etichette, le proprietà e le risorse per il cluster membro eseguendo una query sul cluster hub. Output come YAML per poter leggere i risultati.

kubectl get membercluster $MEMBERCLUSTER01 –o yaml

Il file YAML risultante contiene dettagli (etichette e proprietà) che è possibile usare per creare criteri di posizionamento. Ecco un esempio:

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

Ripetere questo passaggio per ogni cluster membro aggiunto per identificare le etichette e le proprietà che è possibile usare nei criteri.

Preparare un carico di lavoro per il posizionamento

Pubblicare quindi un carico di lavoro nel cluster hub in modo che possa essere inserito nei cluster membri:

  1. Creare uno spazio dei nomi per il carico di lavoro nel cluster hub:

    kubectl create namespace test-app 
    
  2. Il carico di lavoro di esempio può essere distribuito nel nuovo spazio dei nomi nel cluster hub. Poiché questi tipi di risorse Kubernetes non richiedono l'incapsulamento, è possibile distribuirli senza modifiche.

    1. Salvare il file YAML seguente in un file denominato 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. Distribuire la definizione del carico di lavoro nel cluster hub:

      kubectl apply -f sample-workload.yaml
      

Con la definizione del carico di lavoro distribuita, è ora possibile testare la funzionalità di posizionamento intelligente di Kubernetes Fleet.

Testare i criteri di posizionamento del carico di lavoro

È possibile usare gli esempi seguenti, insieme alla documentazione concettuale, come guide alla scrittura di un oggetto personalizzato ClusterResourcePlacement .

Nota

Per provare ogni criterio di esempio, assicurarsi di eliminare l'oggetto precedente ClusterResourcePlacement .

Posizionamento basato sul numero di nodi del cluster

In questo esempio viene illustrato un ordinamento delle proprietà che usa l'ordine Descending . Questo ordine indica che Kubernetes Fleet preferisce i cluster con conteggi dei nodi più elevati.

Il cluster con il numero di nodi più alto riceve un peso pari a 20 e il cluster con il valore più basso riceve un peso pari a 0. Altri cluster ricevono pesi proporzionali calcolati tramite la formula di calcolo del peso.

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

Posizionamento con selettore di etichette e ordinamento delle proprietà

In questo esempio, un cluster riceve un peso solo se ha l'etichetta env=prod. Se il cluster soddisfa tale vincolo di etichetta, viene assegnato un peso proporzionale in base alla quantità di CPU totale in tale cluster membro.

In questo esempio viene illustrato come usare sia il selettore di etichette che l'ordinamento delle proprietà per preferredDuringSchedulingIgnoredDuringExecution l'affinità. Un cluster membro che non riesce il selettore di etichette non riceve alcun peso. I cluster membro che soddisfano il selettore di etichette ricevono pesi proporzionali, come specificato nell'ordinamento delle proprietà.

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

Posizionamento in base al costo core della memoria e della CPU

Poiché l'ordinamento in questo esempio ha un Ascending ordine, Kubernetes Fleet preferisce i cluster con costi di memoria e core CPU inferiori. Il cluster con il costo minimo di memoria e core CPU riceve un peso pari a 20 e il cluster con il valore più alto riceve un peso pari a 0. Altri cluster ricevono pesi proporzionali calcolati tramite la formula di calcolo del peso.

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

Visualizzare lo stato di un posizionamento

Se si vuole visualizzare lo stato di un posizionamento, è possibile usare il portale di Azure o il comando kubectl.

Per informazioni dettagliate su come visualizzare lo stato di avanzamento di un posizionamento, vedere Usare l'API ClusterResourcePlacement per propagare le risorse ai cluster membri.

Pulire le risorse

Per informazioni dettagliate su come rimuovere un posizionamento delle risorse cluster tramite il portale di Azure o il comando kubectl, vedere Pulire le risorse nell'articolo sulla propagazione delle risorse.

  • Per altre informazioni sulla propagazione delle risorse, vedere la documentazione di Kubernetes Fleet open source.