Sobes.tech
Middle+

Como distribuir corretamente os pods por diferentes nós em diferentes centros de dados?

sobes.tech IA

Resposta da IA

Para distribuir os pods por diferentes nós em vários centros de dados no Kubernetes, utilizam-se os seguintes mecanismos e abordagens:

  1. Restrições de Distribuição de Topologia: Permitem controlar como os pods são distribuídos por domínios topológicos (por exemplo, regiões, zonas, nós). Este é o mecanismo principal para garantir tolerância a falhas e uma distribuição uniforme de carga.

    # Exemplo de Restrições de Distribuição de Topologia
    topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname # Distribuição por nós
        whenUnsatisfiable: DoNotSchedule # Se a condição não for satisfeita, o pod não é agendado
        labelSelector:
          matchLabels:
            app: my-app # Define o conjunto de pods ao qual a regra se aplica
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone # Distribuição por zonas
        whenUnsatisfiable: ScheduleAnyway # Mesmo que a condição seja violada, o pod é agendado
        labelSelector:
          matchLabels:
            app: my-app
    
  2. Afinidade / Anti-Afinidade de Nós: Permitem especificar em quais nós os pods devem ser agendados (ou não). Os nós em diferentes centros de dados têm etiquetas (labels) diferentes, que podem ser usados para gerir o colocamento.

    # Exemplo de Afinidade de Nós
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: topology.kubernetes.io/zone
                  operator: In
                  values:
                    - us-east-1a
                    - us-east-1b # Agendamento de pods apenas nas zonas us-east-1a e us-east-1b
    
  3. Afinidade / Anti-Afinidade de Pods: Permitem indicar onde os pods devem ser agendados relativamente a outros pods. Isto é útil para colocação conjunta (ou separada) de pods de uma mesma aplicação ou serviços relacionados.

    # Exemplo de Afinidade de Pods
    affinity:
      podAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchLabels:
                app: database # Agendamento dos pods atuais nas mesmas nós que os pods com a etiqueta app: database
            topologyKey: kubernetes.io/hostname
    
  4. Restrições de Distribuição de Topologia em combinação com Afinidade / Anti-Afinidade: Para um controlo mais granular, combinam frequentemente restrições de distribuição de topologia com Afinidade ou Anti-Afinidade de Nós ou Pods.

  5. Distribuir Balanceadores de Carga através de Centros de Dados: Utilize balanceadores de carga globais (Global Load Balancers - GLB) ao nível de DNS ou soluções de rede específicas que direcionam o tráfego para diferentes clusters (ou grupos de nós) em diferentes centros de dados. Isto garante a acessibilidade mesmo na totalidade de um centro de dados estar inacessível.

  6. Federação de Clusters (obsoleta, mas conceptualmente relevante) / Configurações Multi-Cluster: Em cenários mais complexos, pode-se usar abordagens para gerir múltiplos clusters. Embora a federação nativa do Kubernetes esteja obsoleta, existem projetos e ferramentas (por exemplo, Kubefed, Karmada) para gerir clusters dispersos por centros de dados. Isto permite usar políticas e recursos comuns.

  7. Particionamento de StatefulSet: Para StatefulSets, pode-se usar partition em RollingUpdateStrategy para atualizar sequencialmente apenas uma parte dos pods, o que pode ser útil ao trabalhar com bases de dados distribuídas ou outras aplicações com estado.

A abordagem correta depende dos requisitos específicos de tolerância a falhas, latência e complexidade da infraestrutura. Geralmente, usa-se uma combinação de Restrições de Distribuição de Topologia e Afinidade / Anti-Afinidade.

Tabela com as principais ferramentas:

Ferramenta Propósito Nível de gestão
Restrições de Distribuição de Topologia Distribuição de pods por domínios topológicos para balanceamento. Planeador Kubernetes
Afinidade / Anti-Afinidade de Nós Ligação de pods a nós ou grupos de nós por etiquetas. Planeador Kubernetes
Afinidade / Anti-Afinidade de Pods Ligação de pods a outros pods por etiquetas para colocação conjunta ou separada. Planeador Kubernetes
Balanceadores de carga globais (GLB) Distribuição do tráfego externo entre centros de dados. Infraestrutura externa / DNS
Gestão Multi-Cluster (ex., Karmada) Gestão e sincronização de recursos e políticas entre múltiplos clusters. Nível de gestão de clusters