Utilizzare il networking dual-stack in Servizio Azure Kubernetes (AKS)

È possibile distribuire i cluster AKS in modalità dual-stack quando si utilizza una rete virtuale di Azure dual-stack. In questa configurazione, i nodi ricevono sia un indirizzo IPv4 che IPv6 dalla subnet della rete virtuale di Azure. I pod ricevono un indirizzo IPv4 e IPv6 da uno spazio di indirizzi logicamente diverso dalla subnet della rete virtuale Azure dei nodi. Nat (Network Address Translation) viene quindi configurato in modo che i pod possano raggiungere le risorse nella rete virtuale di Azure. L'indirizzo IP di origine del traffico è NAT verso l'indirizzo IP primario del nodo della stessa famiglia (da IPv4 a IPv4 e IPv6 a IPv6).

Questo articolo illustra come usare la rete dual-stack con un cluster AKS. Per altre informazioni sulle opzioni di rete e le relative considerazioni, vedere Concetti relativi alla rete per le applicazioni nel servizio Azure Kubernetes.

Importante

A partire dal 30 novembre 2025, il servizio Azure Kubernetes non supporta più o fornisce aggiornamenti della sicurezza per Azure Linux 2.0. L'immagine del nodo Linux 2.0 di Azure è bloccata alla versione 202512.06.0. A partire dal 31 ottobre 2026, le immagini dei nodi verranno rimosse e non sarà possibile ridimensionare i pool di nodi. Eseguire la migrazione a una versione di Linux di Azure supportata aggiornando i pool di nodi a una versione di Kubernetes supportata o eseguendo la migrazione ad osSku AzureLinux3. Per altre informazioni, vedere il problema di ritiro di GitHub e l'annuncio di ritiro degli aggiornamenti di Azure. Per rimanere informati sugli annunci e sugli aggiornamenti, seguire le note di rilascio di AKS.

Limitazioni

  • In Azure pool di nodi Linux i servizi IPv6 richiedono externalTrafficPolicy: Local.
  • La rete dual-stack è necessaria per la rete virtuale di Azure e il CIDR del pod.
    • Solo IPv6 a stack singolo non è supportato per gli indirizzi IP del nodo o del pod. È possibile effettuare il provisioning dei servizi in IPv4 o IPv6.
  • Azure CNI Overlay non supporta le policy di rete di Azure o Calico con il networking dual-stack. Per usare i criteri di rete, usare Azure CNI basato su Cilium.
  • Il gateway NAT standard supporta solo IPv4. Per il traffico in uscita dual-stack, usare gateway NAT StandardV2. Il tipo in uscita managedNATGatewayV2 gestito da AKS è in modalità anteprima.
  • Il componente aggiuntivo dei nodi virtuali non è supportato con la rete dual-stack.

Prerequisiti

Questo articolo usa Azure overlay CNI. È anche possibile distribuire un cluster dual stack con Azure CNI basato su Cilium in cluster Linux che eseguono Kubernetes versione 1.29 o successiva.

Panoramica della rete dual stack in Kubernetes

Kubernetes v1.23 offre un supporto stabile a monte per i cluster dual stack IPv4/IPv6, inclusa la rete di pod e servizi. I nodi e i pod vengono sempre assegnati sia un indirizzo IPv4 che un indirizzo IPv6, mentre i servizi possono essere a doppio stack o a uno stack singolo in una delle due famiglie di indirizzi.

AKS configura i servizi di supporto necessari per il networking dual-stack. Questa configurazione include:

  • Se si usa una rete virtuale gestita, una configurazione di rete virtuale dual stack.
  • Indirizzi di nodi e pod IPv4 e IPv6.
  • Regole in uscita per il traffico IPv4 e IPv6.
  • Configurazione del servizio di bilanciamento del carico per i servizi IPv4 e IPv6.

Annotazioni

Quando si usa la rete dual stack con un tipo di routing definito dall'utente in uscita , è possibile scegliere di avere una route predefinita per IPv6 a seconda che sia necessario il traffico IPv6 per raggiungere Internet. Se non si ha una route predefinita per IPv6, viene visualizzato un avviso quando si crea un cluster ma non si impedisce la creazione del cluster.

Parametri del cluster a doppio stack

I parametri seguenti supportano cluster dual-stack:

Parametro Valori accettati Valore predefinito Vincoli
--ip-families ipv4 oppure ipv4,ipv6 Non specificato Specificare un elenco delimitato da virgole di famiglie IP da abilitare nel cluster.
--pod-cidrs Intervalli CIDR delimitati da virgole 10.244.0.0/16,fd12:3456:789a::/64 Il conteggio e l'ordine degli intervalli devono corrispondere a --ip-families.
--service-cidrs Intervalli CIDR delimitati da virgole 10.0.0.0/16,fd12:3456:789a:1::/108 Il conteggio e l'ordine degli intervalli devono corrispondere a --ip-families. La subnet IPv6 non può essere maggiore di /108.

Distribuire un cluster servizio Azure Kubernetes dual-stack

  1. Creare un gruppo di risorse di Azure per il cluster usando il az group create comando .

    az group create --location <region> --name <resourceGroupName>
    
  2. Creare un cluster servizio Azure Kubernetes dual-stack usando il comando az aks create con il parametro --ip-families impostato su ipv4,ipv6.

    az aks create \
        --location <region> \
        --resource-group <resourceGroupName> \
        --name <clusterName> \
        --network-plugin azure \
        --network-plugin-mode overlay \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Dopo aver creato il cluster, ottenere le credenziali del cluster usando il az aks get-credentials comando .

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

Esaminare i nodi per visualizzare entrambe le famiglie IP

Dopo il provisioning del cluster, verificare che i nodi siano stati sottoposti a provisioning con rete dual-stack utilizzando il comando kubectl get nodes.

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

L'output del comando kubectl get nodes mostra che i nodi hanno indirizzi e spazio di assegnazione IP per i pod sia per IPv4 che per 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

Creare un carico di lavoro di esempio

Distribuisci un server web NGINX con tre repliche per verificare l'assegnazione dual-stack degli indirizzi IP dei pod.

Distribuire un server Web NGINX

  1. Creare un server Web NGINX eseguendo il kubectl create deployment nginx comando .

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Visualizzare le risorse del pod eseguendo il 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"
    

    L'output mostra che i pod hanno indirizzi IPv4 e IPv6. I pod non mostrano gli indirizzi IP finché non sono pronti.

    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
    

Esporre il carico di lavoro tramite un servizio di tipo LoadBalancer

Importante

Azure Load Balancer invia probe di integrità alle destinazioni IPv6 da un indirizzo locale di collegamento. Nei pool di nodi Linux di Azure, il traffico verso i servizi IPv6 che usano externalTrafficPolicy: Cluster non funziona. Gli esempi seguenti impostano externalTrafficPolicy: Local sul servizio IPv6 in modo che kube-proxy risponda al probe sul nodo.

  1. Esporre la distribuzione NGINX con servizi IPv4 e IPv6 LoadBalancer separati usando il 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":{"externalTrafficPolicy":"Local","ipFamilies":["IPv6"]}}'
    

    Si ottiene un output che indica che i servizi sono esposti.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Dopo aver esposto la distribuzione e aver completato il provisioning dei servizi LoadBalancer, recupera gli indirizzi IP dei servizi utilizzando il 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. Verificare la funzionalità da una macchina virtuale Linux o da un computer locale con un indirizzo IPv6 assegnato e il routing IPv6 configurato. Azure Cloud Shell non supporta 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>