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 i costi di calcolo o le risorse disponibili, ad esempio memoria e CPU. È noioso creare, aggiornare e tenere traccia manualmente di queste risorse Kubernetes in più cluster. Questo articolo illustra il modo in cui Azure Kubernetes Fleet Manager (Fleet) consente di gestire questi scenari usando la funzionalità di posizionamento intelligente delle risorse Kubernetes.

Panoramica

Fleet offre funzionalità di posizionamento delle risorse che possono 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

Leggere la panoramica concettuale della propagazione delle risorse per comprendere i concetti usati in questa procedura.

Prerequisiti

  • Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.

  • È necessario disporre di una risorsa Fleet con uno o più cluster membri. In caso contrario, seguire la guida introduttiva per creare una risorsa Fleet con un cluster hub e quindi aggiungere cluster servizio Azure Kubernetes (servizio Azure Kubernetes) come membri.

    Raccomandazione: assicurarsi che i cluster membri del servizio Azure Kubernetes siano configurati in modo da poter testare il posizionamento usando le proprietà del cluster a cui si è interessati (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 questa procedura, è 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 non è già disponibile, è possibile installare l'interfaccia della riga di comando di Kubernetes (kubectl) usando questo comando:

    az aks install-cli
    
  • È anche necessaria l'estensione fleet dell'interfaccia della riga di comando di Azure, che è possibile installare 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 rilasciata:

    az extension update --name fleet
    
  • Autorizzare kubectl a connettersi al cluster dell'hub della flotta:

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

Esaminare le proprietà del cluster membro

Ripetere questi passaggi per ogni cluster membro aggiunto.

  • 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.

    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 in modo da 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.

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

    kubectl create namespace test-app 
    
  • 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 , possono essere distribuiti senza modifiche.

    Salvare il codice 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
    

    Distribuire la definizione del carico di lavoro nel cluster hub usando il comando .

    kubectl apply -f sample-workload.yaml 
    

    Con la definizione del carico di lavoro distribuita è ora possibile testare le funzionalità di posizionamento intelligente della flotta.

Testare i criteri di posizionamento del carico di lavoro

È possibile usare gli esempi seguenti, insieme alla documentazione concettuale, come guide alla scrittura di clusterResourcePlacement.

Nota

Per provare ogni criterio di esempio, assicurarsi di eliminare il clusterResourcePlacement precedente.

Posizionamento basato sul numero di nodi del cluster

Questo esempio mostra un ordinamento di proprietà usando l'ordine che indica che la Descending flotta 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 riceverà 0. Altri cluster ricevono pesi proporzionali calcolati usando 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 riceverà un peso solo se ha l'etichetta env=prod. Se soddisfa tale vincolo di etichetta, al cluster 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 supera il selettore di etichette non riceverà 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, la flotta 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 massimo riceverà 0. Altri cluster ricevono pesi proporzionali calcolati usando 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 del posizionamento

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

Per informazioni dettagliate su come visualizzare lo stato di avanzamento di un posizionamento, vedere la guida introduttiva alla propagazione delle risorse.

Pulire le risorse

Per informazioni dettagliate su come rimuovere un posizionamento delle risorse cluster tramite il comando portale di Azure o kubectl, vedere la sezione relativa alle risorse di pulizia della guida introduttiva alla propagazione delle risorse.

Passaggi successivi

Per altre informazioni sulla propagazione delle risorse, vedere le risorse seguenti: