Partilhar via


Posicionamento inteligente de recursos do Kubernetes entre clusters usando o Azure Kubernetes Fleet Manager

Os desenvolvedores de aplicativos geralmente precisam implantar recursos do Kubernetes em vários clusters. Os operadores de frotas geralmente precisam escolher os melhores clusters para cargas de trabalho com base em heurísticas, como custo de computação, ou recursos disponíveis, como memória e CPU. É tedioso criar, atualizar e rastrear esses recursos do Kubernetes em vários clusters manualmente. Este artigo aborda como o Azure Kubernetes Fleet Manager (Fleet) permite que você resolva esses cenários usando o recurso inteligente de posicionamento de recursos do Kubernetes.

Descrição geral

O Fleet fornece recursos de posicionamento que podem tomar decisões de agendamento com base nas seguintes propriedades de cluster:

  • Contagens de nós
  • Custo de computação/memória em clusters de membros de destino
  • Disponibilidade de recursos (CPU/memória) em clusters de membros de destino

Leia a visão geral conceitual de propagação de recursos para entender os conceitos usados neste tutorial.

Pré-requisitos

  • Uma conta do Azure com uma subscrição ativa. Crie uma conta gratuitamente.

  • Você deve ter um recurso de frota com um ou mais clusters de membros. Caso contrário, siga o início rápido para criar um recurso do Fleet com um cluster de hub e, em seguida, junte-se aos clusters do Serviço Kubernetes do Azure (AKS) como membros.

    Recomendação: Certifique-se de que seus clusters de membros do AKS estejam configurados para que você possa testar o posicionamento usando as propriedades do cluster em que está interessado (local, contagem de nós, recursos ou custo).

  • Defina as seguintes variáveis de ambiente:

    export GROUP=<resource-group>
    export FLEET=<fleet-name>
    export MEMBERCLUSTER01=<cluster01>
    export MEMBERCLUSTER02=<cluster02>
    
  • Você precisa da CLI do Azure versão 2.58.0 ou posterior instalada para concluir este tutorial. Para instalar ou atualizar, consulte Instalar a CLI do Azure.

  • Se você ainda não a tem, você pode instalar a CLI do Kubernetes (kubectl) usando este comando:

    az aks install-cli
    
  • Você também precisa da extensão CLI do fleet Azure, que pode ser instalada executando o seguinte comando:

    az extension add --name fleet
    

    Execute o az extension update comando para atualizar para a versão mais recente da extensão lançada:

    az extension update --name fleet
    
  • Autorize o kubectl a se conectar ao cluster do hub da frota:

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

Inspecionar propriedades do cluster de membros

Repita estas etapas para cada cluster de membros adicionado.

  • Recupere os rótulos, as propriedades e os recursos do cluster membro consultando o cluster de hub. Saída como YAML para que você possa ler os resultados.

    kubectl get membercluster $MEMBERCLUSTER01 –o yaml
    

    O arquivo YAML resultante contém detalhes (rótulos e propriedades) que você pode usar para criar políticas de posicionamento.

    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
    

    Repita esta etapa para cada cluster de membros para identificar os rótulos e as propriedades que podem ser usados em sua política.

Preparar uma carga de trabalho para colocação

Em seguida, publique uma carga de trabalho em nosso cluster de hub para que ela possa ser colocada em clusters membros.

  • Crie um namespace para nossa carga de trabalho no cluster de hub.

    kubectl create namespace test-app 
    
  • A carga de trabalho de exemplo pode ser implantada no novo namespace no cluster de hub. Como esses tipos de recursos do Kubernetes não exigem encapsulamento , eles podem ser implantados sem alterações.

    Salve o seguinte YAML em um arquivo chamado 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
    

    Implante a definição de carga de trabalho no cluster de hub usando o comando.

    kubectl apply -f sample-workload.yaml 
    

    Com a definição de carga de trabalho implantada, agora é possível testar os recursos de posicionamento inteligente da frota.

Políticas de posicionamento da carga de trabalho de teste

Você pode usar os exemplos a seguir, juntamente com a documentação conceitual, como guias para escrever seu próprio ClusterResourcePlacement.

Nota

Se desejar experimentar cada política de exemplo, certifique-se de excluir o ClusterResourcePlacement anterior.

Posicionamento com base na contagem de nós do cluster

Este exemplo mostra um classificador de propriedades usando a ordem, o Descending que significa que a frota prefere clusters com contagens de nós mais altas.

O cluster com a maior contagem de nós receberia um peso de 20, e o cluster com a menor contagem receberia 0. Outros agrupamentos recebem pesos proporcionais calculados usando a fórmula de cálculo de 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

Posicionamento com seletor de etiquetas e classificador de propriedades

Neste exemplo, um cluster só receberia um peso se tivesse o rótulo env=prod. Se ele satisfizer essa restrição de rótulo, o cluster receberá peso proporcional com base na quantidade de CPU total nesse cluster membro.

Este exemplo demonstra como você pode usar o seletor de rótulos e o classificador de propriedades para preferredDuringSchedulingIgnoredDuringExecution afinidade. Um cluster de membros que falhar no seletor de rótulo não receberá nenhum peso. Os clusters de membros que satisfazem o seletor de rótulo recebem pesos proporcionais conforme especificado em classificador de propriedades.

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

Posicionamento com base na memória e no custo do núcleo da CPU

Como o classificador neste exemplo tem uma Ascending ordem, a frota prefere clusters com custos de núcleo de CPU e memória mais baixos. O cluster com o menor custo de memória e núcleo da CPU receberia um peso de 20 e o cluster com o maior custo receberia 0. Outros agrupamentos recebem pesos proporcionais calculados usando a fórmula de cálculo de 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

Ver estado da colocação

Se desejar exibir o status de um posicionamento, você pode usar o portal do Azure ou o comando kubectl.

Detalhes sobre como visualizar o progresso de um posicionamento podem ser encontrados no início rápido de recursos de propagação.

Clean up resources (Limpar recursos)

Detalhes sobre como remover um posicionamento de recurso de cluster por meio do portal do Azure ou do comando kubectl podem ser encontrados na seção de recursos de limpeza do início rápido de recursos de propagação.

Próximos passos

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