Use o posicionamento de recursos do Azure Kubernetes Fleet Manager para implementar recursos com âmbito de cluster em múltiplos clusters

Aplica-se a: ✔️ Fleet Manager com cluster de hub

O posicionamento de recursos do Azure Kubernetes Fleet Manager permite-lhe distribuir e sincronizar recursos com escopo de cluster – incluindo namespaces e os seus recursos filhos – entre vários clusters da sua frota. Esta funcionalidade simplifica implementações multicluster ao garantir uma configuração consistente de recursos em toda a sua infraestrutura, reduzindo a sobrecarga manual e permitindo-lhe gerir cargas de trabalho complexas em escala com uma única fonte de verdade. Este artigo explica como utilizar o ClusterResourcePlacement para distribuir um namespace e as respetivas cargas de trabalho por clusters membro.

Para distribuir recursos individuais dentro de um namespace, consulte a documentação sobre a colocação de recursos com âmbito de namespace.

Pode completar os passos deste artigo usando o portal Azure ou a CLI do Azure.

Note

Pode usar o posicionamento de recursos do Fleet Manager com clusters Kubernetes habilitados para AKS e Azure Arc.

Antes de começares

Distribuir um namespace e os seus recursos para clusters membros

Utilize o cenário simples de ter um Deployment e Service para implementar em todos os clusters da frota. Crie um namespace no seu cluster hub do Fleet Manager, adicione-lhe as cargas de trabalho e, em seguida, utilize um ClusterResourcePlacement para distribuir o namespace e todo o respetivo conteúdo por todos os clusters membros, através da política de posicionamento PickAll.

  1. Defina as seguintes variáveis de ambiente para sua ID de assinatura, grupo de recursos e recurso de frota do Kubernetes:

    export SUBSCRIPTION_ID=<subscription-id>
    export GROUP=<resource-group-name>
    export FLEET=<fleet-name>
    
  2. Defina a subscrição padrão do Azure usando o comando [az account set][az-account-set]:

    az account set \
        --subscription ${SUBSCRIPTION_ID}
    
  3. Obtenha o ficheiro kubeconfig do cluster hub Kubernetes Fleet usando o comando [az fleet get-credentials][az-fleet-get-credentials]:

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

    O seu resultado deve parecer semelhante ao seguinte.

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

    Note

    Se receber um erro do tipo InvalidHubOperation com a mensagem a indicar que a frota está sem hub, adicione um cluster de hubs. Para mais informações, consulte tipo de cluster do hub de atualização.

  4. Cria um namespace no cluster do hub.

    kubectl create namespace test-app
    
  5. Guardar o YAML seguinte como 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. Espalhe a carga de trabalho de teste para o cluster hub do Gestor de Frotas usando kubectl.

    kubectl apply -f test-workload.yaml
    
  7. Guardar o YAML seguinte como 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. Aplique o manifesto de colocação ao cluster do hub do Gestor de Frotas.

    kubectl apply -f crp-distribute-workload.yaml
    

    Note

    A implementação de recursos começa imediatamente após a aplicação do manifesto. É utilizada uma estratégia implícita RollingUpdate . Para aprender a ter controlo adicional sobre o lançamento, veja definir uma estratégia de implementação para a colocação de recursos.

  9. Verifique o progresso da colocação de recursos.

kubectl get clusterresourceplacement distribute-test-app

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

NAME                   GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
distribute-test-app    2     True        2              True      2            10s
  1. Consulte os detalhes da colocação.
kubectl describe clusterresourceplacement distribute-test-app

O resultado deverá ter um aspeto semelhante ao seguinte exemplo:

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. No portal Azure, aceda ao seu Gestor de Frotas.

  2. No menu de serviço, em Recursos da Frota, selecione Namespaces>+ Criar.

    Note

    Se não vires Recursos de Frota, o teu Gestor de Frotas não tem um cluster de hubs. Para mais informações sobre como adicionar um, veja o tipo de cluster do hub de atualização.

  3. No menu, selecione Namespace, introduza um Nome e depois selecione Criar.

    Captura de ecrã do portal Azure mostrando um namespace chamado test-app a ser criado no cluster hub do Fleet Manager.

    Após alguns instantes, a página é atualizada e o namespace aparece na lista de namespaces no cluster hub do Fleet Manager. Agora está pronto para alojar quaisquer recursos que queira distribuir entre clusters de membros.

  4. No topo da lista de namespace, selecione + Criar>Aplicar um YAML e use os seguintes exemplos.

    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
    

    Copie e cole as amostras e aplique-as uma de cada vez, como mostrado na imagem seguinte.

    Captura de ecrã do portal Azure mostrando o diálogo Aplicar com YAML preenchido com uma Implementação pronta a ser aplicada ao cluster hub do Fleet Manager.

    O namespace e as suas cargas de trabalho estão agora prontos para serem distribuídos para clusters membros. O Deployment e o Service não estão programados no cluster hub do Fleet Manager.

  5. No menu de serviço, em Recursos da Frota, selecione Colocação>de Recursos + Criar.

  6. Na guia Noções básicas, configure as seguintes opções:

    • Nos detalhes da colocação, insira um nome para a colocação.

    • Em Detalhes do recurso, deixe Âmbito como Âmbito do cluster e introduza o Grupo, versão e tipo (GVK) e o nome do recurso a distribuir. Neste exemplo, use os seguintes valores.

      group: ""
      kind: Namespace
      version: v1          
      name: test-app
      
    • Na seleção de clusters de membros, para o tipo de colocaçãoescolhe Todos os clusters.

    • Para Rollout, mantenha selecionada a estratégia de atualização progressiva.

    Captura de ecrã do portal do Azure mostrando o separador Basics concluído para a colocação de recursos com escopo de cluster para um namespace chamado test-app.

  7. Selecione Seguinte para rever o manifesto resultante ClusterResourcePlacement . Pode modificar o manifesto se necessário, validar usando a opção Validar (ensaio geral), ou selecionar Rever + criar para avançar para a confirmação final.

    Captura de ecrã do portal do Azure mostrando o separador Review YAML com uma validação de execução passada para a colocação de recursos em âmbito de cluster para um namespace chamado test-app.

  8. Selecione Criar para iniciar imediatamente a distribuição do namespace.

    Captura de ecrã do portal Azure a mostrar a aba Revisão e criação para uma colocação de recursos com âmbito de cluster para um namespace chamado test-app.

    Note

    O lançamento de recursos começa imediatamente quando aplicas a colocação de recursos usando a estratégia selecionada RollingUpdate . Para aprender a ter controlos adicionais sobre o lançamento, veja definir uma estratégia de implementação para a colocação de recursos.

  9. A página atualiza-se e a lista de Posicionamentos de Recursos mostra a nova colocação criada. Mostra o número de clusters selecionados e se o programador da frota consegue cumprir a política de colocação.

    Captura de ecrã do portal do Azure mostrando a lista de colocação de recursos com uma única colocação de recurso chamada distribute-test-app.

  10. Consulte o estado de implementação da colocação selecionando o nome da colocação na lista. Selecione clusters individuais para ver a implementação de recursos nesse cluster.

    Captura de ecrã do portal do Azure que mostra as informações detalhadas da implementação de um posicionamento de recursos denominado distribute-test-app.

Nos clusters do Kubernetes selecionados, encontram-se o espaço de nomes, a Implementação e o Serviço, implementados e operacionais.

Eliminar a colocação para remover recursos

Quando elimina o posicionamento de recursos no cluster de hub do Fleet Manager, remove os recursos distribuídos dos clusters membros selecionados.

kubectl delete clusterresourceplacement distribute-test-app
  1. No menu de serviço, em Recursos da Frota, selecione Posicionamentos de recursos.

  2. Na lista de colocação de recursos, selecione a colocação e selecione Eliminar.

  3. Ao Apagar, verifica se escolheste a posição correta. Quando estiver pronto, selecione Confirmar exclusão>Excluir.

    Captura de ecrã do portal do Azure a mostrar um posicionamento de recursos chamado distribute-test-app a ser eliminado.

  4. A página atualiza-se e a posição deixa de aparecer na lista. Os recursos são removidos dos clusters membros.

Para saber mais sobre a colocação de recursos, consulte os seguintes recursos: