Usar o posicionamento de recursos do Azure Kubernetes Fleet Manager para implantar recursos com escopo de cluster em vários clusters

Aplica-se a: ✔️ Gerenciador de Frota com cluster do hub

O posicionamento de recursos do Azure Kubernetes Fleet Manager permite distribuir e sincronizar recursos com escopo no cluster — incluindo namespaces e seus recursos subordinados — em vários clusters na sua frota. Esse recurso simplifica as implantações multicluster, garantindo uma configuração de recursos consistente em sua infraestrutura, reduzindo a sobrecarga manual e permitindo que você gerencie cargas de trabalho complexas em escala com uma única fonte de verdade. Este artigo explica como usar ClusterResourcePlacement para distribuir um namespace e suas cargas de trabalho para clusters membros.

Para distribuir recursos individuais dentro de um namespace, consulte a documentação sobre o posicionamento de recursos no escopo do namespace.

Você pode concluir as etapas neste artigo usando o portal do Azure ou o CLI do Azure.

Note

Você pode usar o posicionamento de recursos do Gerenciador de Frota com o AKS e clusters do Kubernetes habilitados para o Azure Arc.

Antes de começar

Distribuir um namespace e seus recursos em clusters de membros

Use o cenário simples de ter um Deployment e um Service para implantar em todos os clusters da frota. Crie um namespace no cluster do hub do Fleet Manager, adicione as cargas de trabalho a ele e, em seguida, use um ClusterResourcePlacement para distribuir o namespace e todo o seu conteúdo para todos os clusters de membros usando a PickAll política de posicionamento.

  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 assinatura de Azure padrão usando o comando [az account set][az-account-set]:

    az account set \
        --subscription ${SUBSCRIPTION_ID}
    
  3. Obtenha o arquivo kubeconfig do cluster do Hub da Frota do Kubernetes usando o comando [az fleet get-credentials][az-fleet-get-credentials]:

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

    Sua saída deve ser semelhante à seguinte.

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

    Note

    Se você receber um erro do tipo InvalidHubOperation com a mensagem informando que a frota não tem hub, adicione um cluster de hubs. Para obter mais informações, consulte o tipo de cluster do hub de atualização.

  4. Crie um namespace no cluster do hub.

    kubectl create namespace test-app
    
  5. Salve o YAML a seguir 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. Implante a carga de trabalho de teste no cluster de hub do Fleet Manager usando kubectl.

    kubectl apply -f test-workload.yaml
    
  7. Salve o YAML a seguir 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 alocação ao cluster hub do Fleet Manager.

    kubectl apply -f crp-distribute-workload.yaml
    

    Note

    A implantação dos recursos começa assim que o manifesto é aplicado. Uma estratégia implícita RollingUpdate é usada. Para saber como ter controle adicional sobre a distribuição, confira a definição de uma estratégia de distribuição para posicionamento de recursos.

  9. Verifique o progresso da alocação do recurso.

kubectl get clusterresourceplacement distribute-test-app

Seu resultado deve ser semelhante ao seguinte exemplo:

NAME                   GEN   SCHEDULED   SCHEDULEDGEN   APPLIED   APPLIEDGEN   AGE
distribute-test-app    2     True        2              True      2            10s
  1. Veja os detalhes do posicionamento.
kubectl describe clusterresourceplacement distribute-test-app

Seu resultado deve ser 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 do Azure, acesse o Fleet Manager.

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

    Note

    Se você não encontrar Fleet Resources, seu Fleet Manager não tem um cluster de hub. Para obter mais informações sobre como adicionar um, consulte o tipo de cluster do hub de atualização.

  3. No menu, selecione Namespace, insira um Nome e selecione Criar.

    Captura de tela do portal Azure mostrando um namespace chamado test-app sendo criado no cluster do Hub do Fleet Manager.

    Após alguns instantes, a página é atualizada e o namespace aparece na lista de namespaces no cluster do Hub do Fleet Manager. Agora ele está pronto para hospedar todos os recursos que você deseja distribuir entre clusters membros.

  4. Na parte superior da lista de namespaces, selecione + Criar>Aplicar um YAML e use os exemplos a seguir.

    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 os exemplos e aplique-os um de cada vez, conforme mostrado na imagem a seguir.

    Captura de tela do portal do Azure que mostra a caixa de diálogo Aplicar com YAML preenchida com uma Implantação pronta para ser aplicada ao cluster de hub do Gerenciador de Frota.

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

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

  6. Na guia Básico, configure os seguintes valores:

    • Em Detalhes do posicionamento, insira um nome para o posicionamento.

    • Em Detalhes do recurso, deixe Escopo como Escopo do cluster e insira o Tipo de Versão de Grupo (GVK) e o nome do recurso a ser distribuído. Neste exemplo, use os valores a seguir.

      group: ""
      kind: Namespace
      version: v1          
      name: test-app
      
    • Em Seleção de clusters membros, em Tipo de posicionamento, escolha Todos os clusters.

    • Para Rollout, deixe a estratégia Rolling update selecionada.

    Captura de tela do portal do Azure mostrando a guia Noções básicas preenchida para o posicionamento de recursos com escopo de cluster para um namespace chamado test-app.

  7. Selecione Avançar para examinar o manifesto resultante ClusterResourcePlacement . Você pode modificar o manifesto se necessário, validar usando a opção Validar (execução seca) ou selecionar Examinar + criar para prosseguir para a confirmação final.

    Captura de tela do portal do Azure que mostra a guia Examinar YAML com uma validação de simulação aprovada para o posicionamento de recursos com escopo do cluster para um namespace chamado aplicativo de teste.

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

    Captura de tela do portal do Azure que mostra a guia Examinar e criar preenchida para um posicionamento de recursos com escopo do cluster para um namespace chamado aplicativo de teste.

    Note

    A implantação do recurso começa imediatamente quando você aplica a alocação do recurso usando a estratégia RollingUpdate selecionada. Para saber como ter controles adicionais sobre a distribuição, confira a definição de uma estratégia de distribuição para posicionamento de recursos.

  9. A página é atualizada e a lista Alocações de recursos exibe a alocação recém-criada. Ela mostra o número de clusters selecionados e se o agendador de frota pode cumprir a política de posicionamento.

    Captura de tela do portal Azure mostrando a lista de posicionamentos de recursos com um único posicionamento de recurso chamado distribute-test-app.

  10. Exiba o status de distribuição do posicionamento selecionando o nome do posicionamento na lista. Selecione clusters individuais para exibir a distribuição de recursos nesse cluster.

    Captura de tela do portal do Azure mostrando as informações detalhadas da implantação de um posicionamento de recurso chamado distribute-test-app.

Nos clusters Kubernetes selecionados, você encontrará o namespace, o Deployment e o Service implantados e operacionais.

Excluir o posicionamento para remover recursos

Ao excluir o posicionamento do recurso no cluster do hub do Fleet Manager, você 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 Colocações de recursos.

  2. Na lista de posicionamentos de recursos, selecione o posicionamento e selecione Excluir.

  3. Ao Excluir, verifique se você escolheu o posicionamento correto. Quando tudo estiver pronto, selecione Confirmar exclusão>Excluir.

    Captura de tela do portal Azure mostrando um posicionamento de recursos chamado distribute-test-app sendo excluído.

  4. A página é atualizada e o posicionamento não aparece mais na lista. Os recursos são removidos dos clusters de membros.

Para saber mais sobre o posicionamento de recursos, consulte os seguintes recursos: