Compartilhar via


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

Você pode implantar seus clusters do AKS em um modo de pilha dupla ao usar a rede kubenet e uma rede virtual do Azure de pilha dupla. 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 alcançar 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 saber mais sobre opções de rede e considerações, confira Conceitos de rede para o Kubernetes e o AKS.

Limitações

  • As tabelas de rotas do Azure têm um limite rígido de 400 rotas por tabela.
    • Cada nó em um cluster de pilha dupla exige duas rotas, uma para cada família de endereços IP, portanto os clusters de pilha dupla são limitados a 200 nós.
  • Em pools de nós do Azure Linux, só há suporte para objetos de serviço com 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.
  • Os seguintes recursos não têm suporte no kubenet de pilha dupla:

Pré-requisitos

  • Todos os pré-requisitos de Configurar a rede kubenet se aplicam.
  • Os clusters de pilha dupla AKS exigem Kubernetes versão v 1.21.2 ou posterior. V1.22.2 ou superior é recomendado.
  • Se estiver usando modelos do Azure Resource Manager, a versão de esquema 2021-10-01 será necessária.

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 estiver utilizando 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 o Dualstack com um tipo de saída de roteamento definido pelo usuário, você pode optar por ter uma rota padrão para IPv6, dependendo se precisar do tráfego IPv6 para acessar ou não a Internet. 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 atributos a seguir são fornecidos para dar suporte a clusters de pilha dupla:

  • --ip-families: recebe uma lista separada por vírgulas de famílias de IPs a serem habilitadas no cluster.
    • Somente ipv4 ou ipv4,ipv6 são suportados.
  • --pod-cidrs: recebe uma lista separada por vírgulas de intervalos de IPs de notação CIDR para atribuir IPs de pods.
    • A contagem e a ordem dos intervalos nesta lista devem corresponder ao valor fornecido para --ip-families.
    • Se nenhum valor for fornecido, o valor padrão 10.244.0.0/16,fd12:3456:789a::/64 será usado.
  • --service-cidrs: recebe uma lista separada por vírgulas de intervalos de IPs de notação CIDR para atribuir os IPs de serviço.
    • A contagem e a ordem dos intervalos nesta lista devem corresponder ao valor fornecido para --ip-families.
    • Se nenhum valor for fornecido, o valor padrão 10.0.0.0/16,fd12:3456:789a:1::/108 será usado.
    • A sub-rede IPv6 atribuída a --service-cidrs não pode ser maior do que a/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> \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Após a criação do cluster, obtenha as credenciais de administrador do cluster usando o comando az aks get-credentials.

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

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

  • Após o provisionamento do cluster, confirme se os nós estão provisionados com a 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 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

Após a criação do cluster, você poderá implementar suas cargas de trabalho. Este artigo o orienta em um exemplo de implantação de carga de trabalho de um servidor da Web NGINX.

Implantar um servidor Web NGINX

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

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

    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

A partir do AKS v1.27, você pode criar um serviço LoadBalancer de pilha dupla que será provisionado com um IP público IPv4 e um IP público IPv6. No entanto, nas versões mais antigas, somente o primeiro endereço IP de um serviço será provisionado para o balanceador de carga, de modo que um serviço de pilha dupla só receba um IP público para a primeira família de IPs 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 comando kubectl expose deployment nginx.

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

    Você recebe uma saída mostrando que os serviços foram expostos.

    service/nginx exposed
    
  2. Quando a implantação estiver exposta e os serviços LoadBalancer estiverem totalmente provisionados, obtenha os endereços IP dos serviços usando o comando kubectl get services.

    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 através de uma solicitação da Web de linha de comando a partir 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 a v1.27

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

    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 uma saída mostrando que os serviços foram expostos.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Quando a implantação estiver exposta e os serviços LoadBalancer estiverem totalmente provisionados, obtenha os endereços IP dos serviços usando o comando kubectl get services.

    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 através de uma solicitação da Web de linha de comando a partir 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>