Partilhar via


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

Você pode implantar seus clusters 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 de rede virtual do Azure. Os pods recebem um endereço IPv4 e IPv6 de um espaço de endereçamento logicamente diferente para a sub-rede de rede virtual do Azure dos nós. A tradução de endereços de rede (NAT) é configurada para que os pods possam chegar aos 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 de rede e considerações, consulte Conceitos de rede para Kubernetes e 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 requer duas rotas, uma para cada família de endereços IP, portanto , os clusters de pilha dupla são limitados a 200 nós.
  • Nos pools de nós do Azure Linux, os objetos de serviço são suportados apenas com externalTrafficPolicy: Localo .
  • A rede de pilha dupla é 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.
  • Os seguintes recursos não são suportados no kubenet de pilha dupla:

Pré-requisitos

  • Todos os pré-requisitos de configurar a rede kubenet se aplicam.
  • Os clusters de pilha dupla do AKS requerem 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ço. 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 usando uma rede virtual gerenciada, uma configuração de rede virtual de pilha dupla.
  • Endereços de nó e pod IPv4 e IPv6.
  • Regras de saída para tráfego IPv4 e IPv6.
  • Configuração do balanceador de carga para serviços IPv4 e IPv6.

Nota

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 de notação CIDR para atribuir IPs de pod.
    • 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 IPs 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 az aks create comando com o --ip-families parâmetro 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 que o cluster for provisionado, confirme se os nós estão provisionados com rede de pilha dupla usando o kubectl get nodes comando.

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

    A saída do comando mostra que kubectl get nodes os nós têm endereços e espaço de atribuição de IP pod de IPv4 e 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 do AKS v1.27, você pode criar um serviço LoadBalancer de pilha dupla que será provisionado 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á provisionado para o balanceador de carga, portanto, um serviço de pilha dupla só recebe um IP público para sua primeira família de IP 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 uma saída 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 uma saída 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>