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

Você pode implantar seus clusters AKS em um modo de pilha dupla ao usar uma rede virtual do Azure de pilha dupla. Nessa configuração, os nós recebem um endereço IPv4 e IPv6 da sub-rede de rede virtual do Azure. Os pods recebem um endereço IPv4 e IPv6 de um espaço de endereços logicamente diferente do da sub-rede de rede virtual do Azure dos nós. A conversão de endereços de rede (NAT) é então configurada para que os pods possam alcançar recursos na rede virtual do Azure. O endereço IP de origem do tráfego é traduzido através de NAT para o endereço IP primário do nó da respetiva 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 de rede e considerações, consulte Conceitos de rede para Kubernetes e AKS.

Importante

A partir de 30 de novembro de 2025, o Azure Kubernetes Service (AKS) deixou de suportar nem fornecer atualizações de segurança para o Azure Linux 2.0. A imagem da máquina virtual do Azure Linux 2.0 está congelada na versão 202512.06.0. A partir de 31 de março de 2026, as imagens dos nós serão removidas e não poderá ajustar o tamanho dos seus pools de nós. Migre para uma versão Azure Linux suportada atualizando os seus pools de nós para uma versão Kubernetes suportada ou migrando para o osSku AzureLinux3. Para mais informações, consulte a edição do Retirement GitHub e o anúncio de reforma do Azure Updates. Para se manter informado sobre anúncios e atualizações, siga as notas de lançamento do AKS.

Limitações

  • Nos conjuntos de nós do Azure Linux, os objetos de serviço são suportados apenas com externalTrafficPolicy: Local.
  • A rede de dual-stack é necessária para a rede virtual do Azure e o pod CIDR.
    • Somente IPv6 de pilha única não é suportado para endereços IP de nó ou pod. Os serviços podem ser provisionados em IPv4 ou IPv6.
  • Azure CNI Overlay é necessário

Pré-requisitos

  • Os clusters de AKS em pilha dupla exigem a versão v1.21.2 ou superior do Kubernetes. v1.22.2 ou superior.
  • Se estiver usando modelos do Azure Resource Manager, a versão do esquema 2021-10-01 será necessária.

Visão geral da rede de pilha dupla no Kubernetes

O Kubernetes v1.23 traz suporte upstream estável para clusters de pilha dupla IPv4/IPv6, incluindo pod e rede de serviços. Os nós e pods recebem sempre um endereço IPv4 e um endereço IPv6, enquanto os serviços podem ser de pilha dupla ou de pilha única em qualquer família de endereços.

O AKS configura os serviços de suporte necessários para redes de pilha dupla. Esta configuração inclui:

  • Se estiver a usar uma rede virtual gerida, deve considerar uma configuração de rede virtual de pilha dupla.
  • Endereços de 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 o Dualstack com um tipo de roteamento definido pelo usuário de saída , você pode optar por ter uma rota padrão para IPv6, dependendo se você precisa do seu tráfego IPv6 para chegar à Internet ou não. Se você não tiver uma rota padrão para IPv6, um aviso será exibido ao criar um cluster, mas não impedirá a criação do cluster.

Implantando um cluster de pilha dupla

Os seguintes atributos são fornecidos para suportar clusters de pilha dupla:

  • --ip-families: Usa uma lista separada por vírgulas de famílias IP para habilitar no cluster.
    • Apenas ipv4 ou ipv4,ipv6 são suportados.
  • --pod-cidrs: Usa uma lista separada por vírgulas de intervalos de IP na notação CIDR para atribuir os IPs dos pods.
    • A contagem e a ordem dos intervalos nesta lista devem corresponder ao valor fornecido a --ip-families.
    • Se nenhum valor for fornecido, o valor 10.244.0.0/16,fd12:3456:789a::/64 padrão será usado.
  • --service-cidrs: Usa uma lista separada por vírgulas de intervalos de IP de notação CIDR para atribuir endereços IP de serviço.
    • A contagem e a ordem dos intervalos nesta lista devem corresponder ao valor fornecido a --ip-families.
    • Se nenhum valor for fornecido, o valor 10.0.0.0/16,fd12:3456:789a:1::/108 padrão será usado.
    • A sub-rede IPv6 atribuída a --service-cidrs não pode ser maior que um /108.

Implantar um cluster AKS de pilha dupla

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

    az group create --location <region> --name <resourceGroupName>
    
  2. Crie um cluster AKS de pilha dupla, usando 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> \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Depois que o cluster for criado, obtenha as credenciais de administrador 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 estão provisionados com rede de pilha dupla 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 IP para pods, tanto para IPv4 quanto para 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 um exemplo de carga de trabalho

Depois que o cluster tiver sido criado, você poderá implantar suas cargas de trabalho. Este artigo orienta você por um exemplo de implantação de carga de trabalho de um servidor Web NGINX.

Implantar um servidor Web NGINX

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

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Visualize os recursos do pod usando 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 endereços IP até que estejam 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
    

Expor a carga de trabalho por meio de um LoadBalancer tipo de serviço

Importante

A partir da versão v1.27 do AKS, pode criar um serviço de pilha dupla Load-Balancer que será configurado com 1 IP público IPv4 e 1 IP público IPv6. No entanto, em versões mais antigas, apenas o primeiro endereço IP de um serviço será atribuído ao balanceador de carga, então um serviço dual-stack obtém um endereço IP público apenas para a primeira família de IP que está listada. Para fornecer um serviço de pilha dupla para uma única implantação, crie dois serviços direcionados ao mesmo seletor, um para IPv4 e outro para IPv6.

AKS a partir da v1.27

  1. Exponha a implantação do NGINX usando o kubectl expose deployment nginx comando.

    kubectl expose deployment nginx --name=nginx --port=80 --type=LoadBalancer --overrides='{"spec":{"ipFamilyPolicy": "PreferDualStack", "ipFamilies": ["IPv4", "IPv6"]}}'
    

    Você recebe um resultado que mostra que os serviços foram expostos.

    service/nginx exposed
    
  2. Depois que a implantação for exposta e os LoadBalancer serviços estiverem totalmente provisionados, 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        LoadBalancer   10.0.223.73   2603:1030:20c:9::22d,4.156.88.133   80:30664/TCP   2m11s
    
    kubectl get services nginx -ojsonpath='{.spec.clusterIPs}'
    
    ["10.0.223.73","fd17:d93e:db1f:f771::54e"]
    
  3. Verifique a funcionalidade por meio de uma solicitação da Web de linha de comando de um host compatível com IPv6. O Azure Cloud Shell não é compatível com IPv6.

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

AKS mais antigo que v1.27

  1. Exponha a implantação do NGINX 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":{"ipFamilies": ["IPv6"]}}'
    

    Você recebe um resultado que mostra que os serviços foram expostos.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Depois que a implantação for exposta e os LoadBalancer serviços estiverem totalmente provisionados, 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 por meio de uma solicitação da Web de linha de comando de um host compatível com IPv6. O Azure Cloud Shell não é compatível com 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>