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 marzo 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

  • Nei pool di nodi Linux di Azure gli oggetti servizio sono supportati solo con 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.
  • È necessario Azure CNI Overlay

Prerequisiti

  • I cluster AKS a doppio stack richiedono la versione 1.21.2 o successiva di Kubernetes. È consigliabile usare v1.22.2 o versione successiva.
  • Se si usano i modelli di Azure Resource Manager, è necessaria la versione dello schema 2021-10-01.

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 Dualstack con un tipo in uscita di routing definito dall'utente, è possibile scegliere di avere una route predefinita per IPv6 a seconda che sia necessario il traffico IPv6 per raggiungere o meno 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.

Implementazione di un cluster a doppio stack

Per supportare cluster dual stack, vengono forniti gli attributi seguenti:

  • --ip-families: accetta un elenco delimitato da virgole di famiglie IP da abilitare nel cluster.
    • Sono supportati solo ipv4 o ipv4,ipv6.
  • --pod-cidrs: accetta un elenco delimitato da virgole di intervalli IP di notazione CIDR da cui assegnare indirizzi IP pod.
    • Il conteggio e l'ordine degli intervalli in questo elenco devono corrispondere al valore fornito a --ip-families.
    • Se non viene specificato alcun valore, viene utilizzato il valore predefinito 10.244.0.0/16,fd12:3456:789a::/64.
  • --service-cidrs: accetta un elenco delimitato da virgole di intervalli IP di notazione CIDR da cui assegnare gli INDIRIZZI IP del servizio.
    • Il conteggio e l'ordine degli intervalli in questo elenco devono corrispondere al valore fornito a --ip-families.
    • Se non viene specificato alcun valore, viene utilizzato il valore predefinito 10.0.0.0/16,fd12:3456:789a:1::/108.
    • La subnet IPv6 assegnata a --service-cidrs 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> \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Dopo aver creato il cluster, ottenere le credenziali di amministratore 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 aver eseguito il provisioning del cluster, verificare che i nodi siano provvisti di rete dual-stack usando 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

Dopo aver creato il cluster, è possibile distribuire i carichi di lavoro. Questo articolo illustra la distribuzione di un carico di lavoro di esempio di un server Web NGINX.

Distribuire un server Web NGINX

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

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

A partire dalla versione AKS v1.27, è possibile creare un servizio LoadBalancer dual-stack che verrà fornito con 1 indirizzo IP pubblico IPv4 e 1 indirizzo IP pubblico IPv6. Tuttavia, nelle versioni precedenti, al bilanciatore di carico viene assegnato solo il primo indirizzo IP per un servizio, quindi un servizio dual-stack riceve solo l'indirizzo IP pubblico relativo alla prima famiglia IP elencata. Per fornire un servizio dual stack per una singola distribuzione, creare due servizi destinati allo stesso selettore, uno per IPv4 e uno per IPv6.

AKS a partire dalla versione 1.27

  1. Esporre la distribuzione NGINX usando il comando kubectl expose deployment nginx.

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

    Si riceve un output che mostra che i servizi sono stati esposti.

    service/nginx exposed
    
  2. Una volta che la distribuzione è stata esposta e i LoadBalancerservizi sono stati completamente forniti, ottenere gli indirizzi IP dei servizi usando il 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. Verificare la funzionalità tramite una richiesta Web da riga di comando da un host che supporta IPv6. Azure Cloud Shell non è in grado di supportare 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>
    

Azure Kubernetes Service (AKS) precedente alla versione 1.27

  1. Esporre la distribuzione NGINX usando il 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"]}}'
    

    Si riceve un output che mostra che i servizi sono stati esposti.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Una volta che la distribuzione è stata esposta e i LoadBalancerservizi sono stati completamente forniti, ottenere gli indirizzi IP dei servizi usando 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à tramite una richiesta Web da riga di comando da un host che supporta IPv6. Azure Cloud Shell non è in grado di supportare 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>