Usar rede de pilha dupla no Serviço de Kubernetes do Azure (AKS)

Você pode implantar seus clusters AKS no modo dual-stack ao usar uma rede virtual Azure dual-stack. Nessa configuração, os nós recebem um endereço IPv4 e IPv6 da sub-rede da rede virtual do Azure. Os pods recebem endereço IPv4 e IPv6 de um espaço de endereço logicamente diferente da sub-rede da rede virtual do Azure dos nós. A NAT (conversão de endereços de rede) é configurada para que os pods possam acessar recursos na rede virtual do Azure. O endereço IP de origem do tráfego é NAT para o endereço IP primário do nó da mesma família (IPv4 para IPv4 e IPv6 para IPv6).

Este artigo mostra como usar a rede de pilha dupla com um cluster AKS. Para obter mais informações sobre opções e considerações de rede, consulte Conceitos de rede para Kubernetes e AKS.

Importante

A partir de 30 de novembro de 2025, o AKS (Serviço de Kubernetes do Azure) não dá mais suporte ou fornece atualizações de segurança para o Azure Linux 2.0. A imagem do nó Azure Linux 2.0 está congelada na 202512.06.0 versão. A partir de 31 de outubro de 2026, as imagens do nó serão removidas e você não poderá dimensionar os pools de nós. Migre para uma versão do Azure Linux com suporte atualizando os pools de nós para uma versão do Kubernetes com suporte ou migrando para o osSku AzureLinux3. Para obter mais informações, consulte o problema de desativação do GitHub e o anúncio de desativação do Azure Updates. Para se manter informado sobre anúncios e atualizações, acompanhe as notas de lançamento do AKS.

Limitações

  • Nos pools de nós do Azure Linux, os serviços IPv6 exigem externalTrafficPolicy: Local.
  • A rede de pilha dupla é necessária para a rede virtual do Azure e o CIDR do pod.
    • A pilha única somente IPv6 não tem suporte para endereços IP de nó ou pod. Os serviços podem ser provisionados no IPv4 ou IPv6.
  • O Azure CNI Overlay não oferece suporte às políticas de rede do Azure nem do Calico com redes de pilha dupla. Para usar políticas de rede, use Azure CNI alimentado pelo Cilium.
  • O Gateway NAT Padrão dá suporte apenas ao IPv4. Para saída de pilha dupla, use o Gateway da NAT StandardV2. O tipo de saída gerenciado pelo AKS managedNATGatewayV2 está em versão prévia.
  • O complemento de nós virtuais não é compatível com a configuração de rede de pilha dupla.

Pré-requisitos

Este artigo usa o Azure CNI Overlay. Você também pode implantar um cluster de pilha dupla com Azure CNI alimentado pelo Cilium em clusters Linux executando o Kubernetes versão 1.29 ou posterior.

Visão geral da rede de pilha dupla no Kubernetes

O Kubernetes v 1,23 oferece suporte a upstream estável para clusters de pilha dupla IPv4/IPv6, incluindo a rede de serviços e Pod. Nós e pods sempre recebem um endereço IPv4 e IPv6, enquanto os serviços podem ser de pilha dupla ou pilha única em qualquer família de endereços.

AKS configura os serviços de suporte necessários para a rede de pilha dupla. Essa configuração inclui:

  • Se você usar uma rede virtual gerenciada, uma configuração de rede virtual de pilha dupla.
  • Endereços IPv4 e IPv6 de nós e pods.
  • Regras de saída para tráfego IPv4 e IPv6.
  • Configuração do balanceador de carga para serviços IPv4 e IPv6.

Observação

Ao usar rede dual-stack com um tipo de saída de roteamento definido pelo usuário, você pode optar por ter uma rota padrão para IPv6, dependendo de precisar que o tráfego IPv6 alcance a Internet. Se você não tiver uma rota padrão para IPv6, um aviso será exibido quando você criar um cluster, mas não impedir a criação do cluster.

Parâmetros de cluster de pilha dupla

Os seguintes parâmetros dão suporte a clusters de pilha dupla:

Parâmetro Valores aceitos Valor padrão Restrições
--ip-families ipv4 ou ipv4,ipv6 Não especificado Forneça uma lista separada por vírgulas de famílias de IP para habilitar no cluster.
--pod-cidrs Intervalos CIDR separados por vírgulas 10.244.0.0/16,fd12:3456:789a::/64 A contagem e a ordem dos intervalos devem corresponder a --ip-families.
--service-cidrs Intervalos CIDR separados por vírgulas 10.0.0.0/16,fd12:3456:789a:1::/108 A contagem e a ordem dos intervalos devem corresponder a --ip-families. A sub-rede IPv6 não pode ser maior que /108.

Implantar um cluster do AKS de pilha dupla

  1. Crie um grupo de recursos do Azure para o cluster utilizando o comando az group create.

    az group create --location <region> --name <resourceGroupName>
    
  2. Criar um cluster do AKS de pilha dupla utilizando o comando az aks create com o parâmetro --ip-families definido como ipv4,ipv6.

    az aks create \
        --location <region> \
        --resource-group <resourceGroupName> \
        --name <clusterName> \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Depois de criar o cluster, obtenha as credenciais do cluster usando o az aks get-credentials comando.

    az aks get-credentials --resource-group <resourceGroupName> --name <clusterName>
    

Inspecione os nós para ver ambas as famílias de IP

Depois de o cluster ser provisionado, confirme se os nós foram provisionados com rede dual-stack usando o comando kubectl get nodes.

kubectl get nodes -o=custom-columns="NAME:.metadata.name,ADDRESSES:.status.addresses[?(@.type=='InternalIP')].address,PODCIDRS:.spec.podCIDRs[*]"

A saída do comando kubectl get nodes mostra que os nós têm endereços e espaço de atribuição de pod IP tanto do IPv4 quanto do IPv6.

NAME                                ADDRESSES                           PODCIDRS
aks-nodepool1-14508455-vmss000000   10.240.0.4,2001:1234:5678:9abc::4   10.244.0.0/24,fd12:3456:789a::/80
aks-nodepool1-14508455-vmss000001   10.240.0.5,2001:1234:5678:9abc::5   10.244.1.0/24,fd12:3456:789a:0:1::/80
aks-nodepool1-14508455-vmss000002   10.240.0.6,2001:1234:5678:9abc::6   10.244.2.0/24,fd12:3456:789a:0:2::/80

Criar uma carga de trabalho de exemplo

Implante um servidor Web NGINX com três réplicas para verificar a atribuição de IP do pod de pilha dupla.

Implantar um servidor Web NGINX

  1. Crie um servidor Web NGINX executando o kubectl create deployment nginx comando.

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Exiba os recursos do pod executando o kubectl get pods comando.

    kubectl get pods -o custom-columns="NAME:.metadata.name,IPs:.status.podIPs[*].ip,NODE:.spec.nodeName,READY:.status.conditions[?(@.type=='Ready')].status"
    

    A saída mostra que os pods têm endereços IPv4 e IPv6. Os pods não mostram os endereços IP até estarem prontos.

    NAME                     IPs                                NODE                                READY
    nginx-55649fd747-9cr7h   10.244.2.2,fd12:3456:789a:0:2::2   aks-nodepool1-14508455-vmss000002   True
    nginx-55649fd747-p5lr9   10.244.0.7,fd12:3456:789a::7       aks-nodepool1-14508455-vmss000000   True
    nginx-55649fd747-r2rqh   10.244.1.2,fd12:3456:789a:0:1::2   aks-nodepool1-14508455-vmss000001   True
    

Exponha a carga de trabalho através de um serviço do tipo LoadBalancer

Importante

Azure Load Balancer envia investigações de integridade para destinos IPv6 de um endereço de link local. Em pools de nós do Azure Linux, o tráfego para serviços IPv6 que usam externalTrafficPolicy: Cluster falha. Os exemplos a seguir definem externalTrafficPolicy: Local no serviço IPv6 para que kube-proxy responda à sonda no nó.

  1. Exponha a implantação do NGINX com serviços IPv4 e IPv6 LoadBalancer separados usando o kubectl expose deployment nginx comando.

    kubectl expose deployment nginx --name=nginx-ipv4 --port=80 --type=LoadBalancer
    kubectl expose deployment nginx --name=nginx-ipv6 --port=80 --type=LoadBalancer --overrides='{"spec":{"externalTrafficPolicy":"Local","ipFamilies":["IPv6"]}}'
    

    Você recebe uma saída que mostra que os serviços estão expostos.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Depois de expor a implantação e provisionar totalmente os LoadBalancer serviços, obtenha os endereços IP dos serviços usando o kubectl get services comando.

    kubectl get services
    
    NAME         TYPE           CLUSTER-IP               EXTERNAL-IP         PORT(S)        AGE
    nginx-ipv4   LoadBalancer   10.0.88.78               20.46.24.24         80:30652/TCP   97s
    nginx-ipv6   LoadBalancer   fd12:3456:789a:1::981a   2603:1030:8:5::2d   80:32002/TCP   63s
    
  3. Verifique a funcionalidade de uma VM linux ou computador local com um endereço IPv6 atribuído e roteamento IPv6 configurado. Azure Cloud Shell não dá suporte ao IPv6.

    SERVICE_IP=$(kubectl get services nginx-ipv6 -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    curl -s "http://[${SERVICE_IP}]" | head -n5
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>