Resolvendo Falhas de Comunicação entre Pods em Clusters K8s sobre Instâncias ARM64 Clonadas

Em ambientes de infraestrutura baseados em arquitetura ARM64, é comum a utilização de clonagem de máquinas virtuais para agilizar o provisionamento de nós em um cluster Kubernetes. No entanto, essa prática pode introduzir problemas críticos na camada de rede (Overlay), especificamente quando o Flannel é utilizado como CNI (Container Network Enterface). O sintoma mais comum é a impossibilidade de comunicação entre Pods localizados em nós distintos do cluster.

Identificação do Problema

Ao implementar um cluster em instâncias clonadas, a interface virtual flannel.1 (utilizada para o encapsulamento VXLAN) pode acabar retendo o mesmo endereço MAC em todos os nós. Isso ocorre devido a políticas de persistência de identificadores de rede no sistema operacional de origem que são replicadas durante o processo de clonagem.

Para diagnosticar, pode-se utilizar um DaemonSet de teste para validar a conectividade entre os nós:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: debug-network-checker
  labels:
    app: net-check
spec:
  selector:
    matchLabels:
      app: net-check
  template:
    metadata:
      labels:
        app: net-check
    spec:
      containers:
      - name: nginx-node
        image: nginx:alpine
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc-net-check
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: net-check

Se ao tentar realizar um curl do endereço IP de um Pod residente no Nó A a partir do Nó B a requisição falhar (timeout), o próximo passo é verificar os endereços MAC das interfaces de rede:

# Executar em todos os nós
ip link show flannel.1

Se o campo link/ether exibir o mesmo endereço hexadecimal em múltiplos servidores, o tráfego VXLAN não será roteado corretamente pelo switch virtual, causando a perda de pacotes entre os nós.

Procedimento de Correção

A solução consiste em forçar o sistema operacional a não herdar ou gerar endereços MAC estáticos para a interface do Flannel, permiitndo que o Kubernetes gerencie essa atribuição de forma única por nó. Deve-se aplicar os seguintes passos em todos os nós do cluster:

1. Configurar a Política de Link do Systemd

Crie um arquivo de configuração para o systemd-networkd que defina a política de endereço MAC como nula para a interface específica do Flannel:

printf "[Match]\nOriginalName=flannel.1\n\n[Link]\nMACAddressPolicy=none\n" > /etc/systemd/network/10-flannel.1.link

2. Remover a Interface Conflituosa

Para que a nova política entre em vigor, a interface virtual atual deve ser removida manualmente:

ip link delete flannel.1

3. Reiniciar o Agente de Rede

Após a remoção da interface, é necessário reiniciar o Pod do Flannel para que ele recrie o dispositivo de rede com os parâmetros corretos. Identifique e delete o Pod correspondente ao nó:

# Localize o nome do pod no namespace kube-system
kubectl get pods -n kube-system -l app=flannel -o wide

# Delete o pod para forçar o reinício
kubectl delete pod <nome-do-pod-flannel> -n kube-system

Validação Final

Após o reinício do CNI, verifique se o novo endereço MAC da interface flannel.1 coincide com o que o Kubernetes registrou no objeto node:

kubectl get node <nome-do-no> -o yaml | grep flannel.alpha.coreos.com/backend-data

Compare o valor da chave VtepMAC no output acima com o resultado de ip link show flannel.1 no host físico. Com os endereços MAC normalizados e únicos por host, a comunicação entre Pods em diferentes nós deverá ser restabelecida imediataemnte.

Tags: kubernetes Flannel ARM64 VXLAN Networking

Publicado em 6-28 06:57