Usare la collocazione delle risorse di Azure Kubernetes Fleet Manager per distribuire risorse con ambito cluster in più cluster

Si applica a: ✔️ Fleet Manager con cluster di hub

Il posizionamento delle risorse di Azure Kubernetes Fleet Manager consente di distribuire e sincronizzare le risorse con ambito di cluster, inclusi i namespace e le relative risorse figlie, in più cluster della flotta. Questa funzionalità semplifica le distribuzioni multicluster garantendo una configurazione coerente delle risorse nell'infrastruttura, riducendo il sovraccarico manuale e consentendo di gestire carichi di lavoro complessi su larga scala con una singola fonte di verità. Questo articolo illustra come usare ClusterResourcePlacement per distribuire uno spazio dei nomi e i relativi carichi di lavoro ai cluster membri.

Per distribuire singole risorse all'interno di un namespace, consulta la documentazione sul posizionamento delle risorse con ambito namespace.

È possibile completare i passaggi descritti in questo articolo usando il portale di Azure o il interfaccia della riga di comando di Azure.

Note

È possibile usare la funzionalità di posizionamento delle risorse di Fleet Manager con AKS e i cluster Kubernetes abilitati per Azure Arc.

Prima di iniziare

Distribuire uno spazio dei nomi e le relative risorse nei cluster membri

Utilizzare il semplice scenario di avere un Deployment e un Service da distribuire in tutti i cluster della flotta. Crea uno spazio dei nomi nel cluster hub di Fleet Manager, aggiungivi i carichi di lavoro e quindi usa un ClusterResourcePlacement per distribuire lo spazio dei nomi e tutto il suo contenuto su tutti i cluster membri utilizzando i criteri di posizionamento PickAll.

  1. Impostare le variabili di ambiente seguenti per l'ID sottoscrizione, il gruppo di risorse e la risorsa Flotta Kubernetes:

    export SUBSCRIPTION_ID=<subscription-id>
    export GROUP=<resource-group-name>
    export FLEET=<fleet-name>
    
  2. Impostare la sottoscrizione di Azure predefinita usando il comando [az account set][az-account-set]:

    az account set \
        --subscription ${SUBSCRIPTION_ID}
    
  3. Ottenere il file kubeconfig del cluster hub Kubernetes Fleet usando il comando [az fleet get-credentials][az-fleet-get-credentials]:

    az fleet get-credentials \
        --resource-group ${GROUP} \
        --name ${FLEET}
    

    Il risultato dovrebbe essere simile al seguente esempio.

    Merged "hub" as current context in /home/fleet/.kube/config
    

    Note

    Se si riceve un errore di tipo InvalidHubOperation con un messaggio che indica che la flotta è priva di hub, aggiungi un cluster di hub. Per altre informazioni, vedere Aggiornare il tipo di cluster hub.

  4. Creare uno spazio dei nomi nel cluster hub.

    kubectl create namespace test-app
    
  5. Salvare il codice YAML seguente come test-workload.yaml.

    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: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: test-app
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      type: LoadBalancer
    
  6. Distribuire il carico di lavoro di test sul cluster hub di Fleet Manager usando kubectl.

    kubectl apply -f test-workload.yaml
    
  7. Salvare il codice YAML seguente come crp-distribute-workload.yaml.

    apiVersion: placement.kubernetes-fleet.io/v1
    kind: ClusterResourcePlacement
    metadata:
      name: distribute-test-app
    spec:
      resourceSelectors:
        - group: ""
          kind: Namespace
          version: v1          
          name: test-app
      policy:
        placementType: PickAll
    
  8. Applica il manifest di posizionamento al cluster hub di Fleet Manager.

    kubectl apply -f crp-distribute-workload.yaml
    

    Note

    La distribuzione della risorsa inizia immediatamente dopo l'applicazione del manifest. Viene usata una strategia implicita RollingUpdate . Per informazioni su come avere un maggiore controllo sull'implementazione, vedere Definizione di una strategia di implementazione per il posizionamento delle risorse.

  9. Controllare lo stato di avanzamento del posizionamento delle risorse.

kubectl get clusterresourceplacement distribute-test-app

L'output dovrebbe essere simile all'esempio seguente:

NAME                   GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
distribute-test-app    2     True        2              True      2            10s
  1. Visualizzare i dettagli del posizionamento.
kubectl describe clusterresourceplacement distribute-test-app

L'output dovrebbe essere simile all'esempio seguente:

Name:         distribute-test-app
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  placement.kubernetes-fleet.io/v1
Kind:         ClusterResourcePlacement
Metadata:
  Creation Timestamp:  2024-04-01T18:55:31Z
  Finalizers:
    kubernetes-fleet.io/crp-cleanup
    kubernetes-fleet.io/scheduler-cleanup
  Generation:        2
  Resource Version:  6949
  UID:               815b1d81-61ae-4fb1-a2b1-06794be3f986
Spec:
  Policy:
    Placement Type:  PickAll
  Resource Selectors:
    Group:                 
    Kind:                  Namespace
    Name:                  test-app
    Version:               v1
  Revision History Limit:  10
  Strategy:
    Type:  RollingUpdate
Status:
  Conditions:
    Last Transition Time:   2024-04-01T18:55:31Z
    Message:                found all the clusters needed as specified by the scheduling policy
    Observed Generation:    2
    Reason:                 SchedulingPolicyFulfilled
    Status:                 True
    Type:                   ClusterResourcePlacementScheduled
    Last Transition Time:   2024-04-01T18:55:36Z
    Message:                All 3 cluster(s) are synchronized to the latest resources on the hub cluster
    Observed Generation:    2
    Reason:                 SynchronizeSucceeded
    Status:                 True
    Type:                   ClusterResourcePlacementSynchronized
    Last Transition Time:   2024-04-01T18:55:36Z
    Message:                Successfully applied resources to 3 member clusters
    Observed Generation:    2
    Reason:                 ApplySucceeded
    Status:                 True
    Type:                   ClusterResourcePlacementApplied
  Observed Resource Index:  0
  Placement Statuses:
    Cluster Name:  membercluster1
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster1 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            membercluster2
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster2 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
    Cluster Name:            membercluster3
    Conditions:
      Last Transition Time:  2024-04-01T18:55:31Z
      Message:               Successfully scheduled resources for placement in membercluster3 (affinity score: 0, topology spread score: 0): picked by scheduling policy
      Observed Generation:   2
      Reason:                ScheduleSucceeded
      Status:                True
      Type:                  ResourceScheduled
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully Synchronized work(s) for placement
      Observed Generation:   2
      Reason:                WorkSynchronizeSucceeded
      Status:                True
      Type:                  WorkSynchronized
      Last Transition Time:  2024-04-01T18:55:36Z
      Message:               Successfully applied resources
      Observed Generation:   2
      Reason:                ApplySucceeded
      Status:                True
      Type:                  ResourceApplied
  Selected Resources:
    Kind:     Namespace
    Name:     my-namespace
    Version:  v1
Events:
  Type    Reason                     Age   From                                   Message
  ----    ------                     ----  ----                                   -------
  Normal  PlacementScheduleSuccess   108s  cluster-resource-placement-controller  Successfully scheduled the placement
  Normal  PlacementSyncSuccess       103s  cluster-resource-placement-controller  Successfully synchronized the placement
  Normal  PlacementRolloutCompleted  103s  cluster-resource-placement-controller  Resources have been applied to the selected clusters
  1. Nel portale di Azure passare a Fleet Manager.

  2. Nel menu del servizio, in Risorse della flotta, selezionare Namespace>+ Crea.

    Note

    Se le risorse della flotta non sono visualizzate, Fleet Manager non ha un cluster hub. Per altre informazioni su come aggiungerne una, vedere Aggiornare il tipo di cluster hub.

  3. Nel menu selezionare Spazio dei nomi, immettere un nome e quindi selezionare Crea.

    Screenshot del portale di Azure che mostra uno spazio dei nomi denominato test-app creato nel cluster hub di Fleet Manager.

    Dopo alcuni istanti, la pagina viene aggiornata e lo spazio dei nomi viene visualizzato nell'elenco degli spazi dei nomi nel cluster hub di Fleet Manager. È ora pronto per ospitare tutte le risorse da distribuire tra cluster membri.

  4. Nella parte superiore dell'elenco degli spazi dei nomi selezionare + Crea>applica un YAML e usare gli esempi seguenti.

    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: mcr.microsoft.com/azurelinux/base/nginx:1.28@sha256:3352a36cbcab4708883a3e77b64f64159e11e1aab358c010e1c4e465dbfb4f57
            ports:
            - containerPort: 80
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-service
      namespace: test-app
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
      type: LoadBalancer
    

    Copiare e incollare gli esempi e applicarli uno alla volta, come illustrato nell'immagine seguente.

    Screenshot del portale di Azure che mostra la finestra di dialogo Applica con YAML popolata con una distribuzione pronta per essere applicata al cluster hub di Fleet Manager.

    Lo spazio dei nomi e i relativi carichi di lavoro sono ora pronti per essere distribuiti ai cluster membri. La distribuzione e il servizio non sono pianificati nel cluster hub di Fleet Manager.

  5. Nel menu Servizio, in Risorse flotta, selezionare Posizionamenti risorse>+ Crea.

  6. Nella scheda Informazioni di base configurare le opzioni seguenti:

    • In Dettagli del posizionamento, immettere un nome per il posizionamento.

    • In Dettagli risorsa, lascia Ambito come Con ambito cluster e immetti il Group Version Kind (GVK) e il nome della risorsa da distribuire. In questo esempio usare i valori seguenti.

      group: ""
      kind: Namespace
      version: v1          
      name: test-app
      
    • In Selezione del cluster membro, per Tipo di posizionamento scegliere Tutti i cluster.

    • Per Rollout, lascia selezionata la strategia Aggiornamento progressivo.

    Screenshot del portale di Azure che mostra la scheda Informazioni di base completa per il posizionamento delle risorse con ambito cluster per uno spazio dei nomi denominato test-app.

  7. Selezionare Avanti per esaminare il manifesto risultante ClusterResourcePlacement . È possibile modificare il manifesto, se necessario, convalidarlo usando l'opzione Convalida (esecuzione secca) oppure selezionare Rivedi e crea per procedere alla conferma finale.

    Screenshot del portale di Azure che mostra la scheda Rivedi YAML con una convalida di esecuzione asciutta superata per il posizionamento delle risorse con ambito cluster per uno spazio dei nomi denominato test-app.

  8. Selezionare Crea per avviare immediatamente la distribuzione dello spazio dei nomi.

    Schermata del portale di Azure che mostra la scheda

    Note

    La distribuzione della risorsa inizia immediatamente non appena si applica il posizionamento della risorsa tramite la strategia selezionata RollingUpdate. Per informazioni su come avere controlli aggiuntivi sull'implementazione, vedere Definizione di una strategia di implementazione per il posizionamento delle risorse.

  9. La pagina viene aggiornata e l'elenco Posizionamento risorse visualizza il posizionamento appena creato. Mostra il numero di cluster selezionati e se lo scheduler della flotta può soddisfare i criteri di posizionamento.

    Screenshot del portale di Azure che mostra l'elenco di posizionamento delle risorse con una singola posizione delle risorse denominata distribute-test-app.

  10. Visualizzare lo stato di implementazione del posizionamento selezionando il nome del posizionamento nell'elenco. Selezionare singoli cluster per visualizzare l'implementazione della risorsa in tale cluster.

    Screenshot del portale di Azure che mostra le informazioni dettagliate sull'implementazione di un posizionamento delle risorse denominato distribute-test-app.

Nei cluster Kubernetes selezionati sono presenti il namespace, il Deployment e il Service, distribuiti e operativi.

Eliminare il posizionamento per rimuovere le risorse

Quando si elimina il posizionamento delle risorse sul cluster hub di Fleet Manager, si rimuovono le risorse distribuite dai cluster membri selezionati.

kubectl delete clusterresourceplacement distribute-test-app
  1. Nel menu del servizio, in Risorse flotta, selezionare Posizionamento risorse.

  2. Nell'elenco di posizionamento delle risorse selezionare il posizionamento e selezionare Elimina.

  3. In Elimina verificare di aver scelto il posizionamento corretto. Quando si è pronti, selezionare Conferma eliminazione>Elimina.

    Schermata del portale di Azure che mostra un posizionamento di risorse denominato distribute-test-app in fase di eliminazione.

  4. La pagina viene aggiornata e il posizionamento non viene più visualizzato nell'elenco. Le risorse vengono rimosse dai cluster membri.

Per altre informazioni sul posizionamento delle risorse, vedere le risorse seguenti: