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
ouipv4,ipv6
são suportados.
- Somente
--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.
- A contagem e a ordem dos intervalos nesta lista devem corresponder ao valor fornecido para
--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.
- A contagem e a ordem dos intervalos nesta lista devem corresponder ao valor fornecido para
Implantar um cluster do AKS de pilha dupla
Crie um grupo de recursos do Azure para o cluster utilizando o comando
az group create
.az group create --location <region> --name <resourceGroupName>
Criar um cluster do AKS de pilha dupla utilizando o comando
az aks create
com o parâmetro--ip-families
definido comoipv4,ipv6
.az aks create \ --location <region> \ --resource-group <resourceGroupName> \ --name <clusterName> \ --ip-families ipv4,ipv6 \ --generate-ssh-keys
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
Crie um servidor da Web NGINX usando o comando
kubectl create deployment nginx
.kubectl create deployment nginx --image=nginx:latest --replicas=3
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
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
Quando a implantação estiver exposta e os serviços
LoadBalancer
estiverem totalmente provisionados, obtenha os endereços IP dos serviços usando o comandokubectl 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"]
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
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
Quando a implantação estiver exposta e os serviços
LoadBalancer
estiverem totalmente provisionados, obtenha os endereços IP dos serviços usando o comandokubectl 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
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>