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