Uso de redes de doble pila en Azure Kubernetes Service (AKS)

Puede implementar los clústeres de AKS en un modo de pila doble al usar una red virtual de Azure de doble pila. En esta configuración, los nodos reciben una dirección IPv4 y una IPv6 de la subred de la red virtual de Azure. Los pods reciben una dirección IPv4 y una IPv6 de un espacio de direcciones lógicamente distinto a la subred de red virtual de Azure de los nodos. A continuación, se configura la traducción de direcciones de red (NAT) para que los pods puedan acceder a los recursos en la red virtual de Azure. La dirección IP de origen del tráfico traduce las direcciones de red a la dirección IP principal del nodo de la misma familia (IPv4 a IPv4 e IPv6 a IPv6).

En este artículo se muestra cómo usar redes de doble pila con un clúster de AKS. Para más información sobre las opciones y consideraciones de red, consulte Conceptos de red para Kubernetes y AKS.

Importante

A partir del 30 de noviembre de 2025, Azure Kubernetes Service (AKS) ya no admite ni proporciona actualizaciones de seguridad para Azure Linux 2.0. La imagen de nodo de Azure Linux 2.0 queda congelada en la versión 202512.06.0. A partir del 31 de octubre de 2026, se quitarán las imágenes de nodo y no podrá escalar los grupos de nodos. Migre a una versión compatible de Azure Linux mediante la actualización de los grupos de nodos a una versión de Kubernetes compatible o la migración a osSku AzureLinux3. Para más información, consulte el asunto de retirada de GitHub y el anuncio sobre la retirada de actualizaciones de Azure. Para mantenerse informado sobre los anuncios y actualizaciones, siga las notas de lanzamiento de AKS.

Limitaciones

  • En los grupos de nodos de Azure Linux, los servicios IPv6 requieren externalTrafficPolicy: Local.
  • Las redes de doble pila son necesarias para la red virtual de Azure y el CIDR del pod.
    • No se admite una pila única de solo IPv6 para las direcciones IP de nodo o pod. Los servicios se pueden aprovisionar en IPv4 o IPv6.
  • La superposición de Azure CNI no admite políticas de red de Azure ni de Calico en redes de doble pila. Para usar directivas de red, use Azure CNI Powered by Cilium.
  • La puerta de enlace NAT estándar solo admite IPv4. Para el tráfico de salida de doble pila, utilice StandardV2 NAT Gateway. El tipo de salida administrado por AKS managedNATGatewayV2 se encuentra en versión preliminar.
  • El complemento de nodos virtuales no se admite con redes de doble pila.

Prerrequisitos

En este artículo se utiliza Azure CNI Overlay. También puede implementar un clúster de doble pila con Azure CNI Powered by Cilium en clústeres de Linux que ejecutan Kubernetes versión 1.29 o posterior.

Introducción a las redes de doble pila en Kubernetes

Kubernetes v1.23 ofrece compatibilidad ascendente estable con clústeres de pila doble de IPv4/IPv6, incluidas redes de pods y servicios. Los nodos y pods siempre se asignan tanto a una dirección IPv4 como a una dirección IPv6, mientras que los servicios pueden ser de pila doble o de una sola pila en cualquiera de las familias de direcciones.

AKS configura los servicios auxiliares necesarios para las redes de doble pila. Esta configuración incluye:

  • Si utilizas una red virtual administrada, una configuración de red virtual de doble pila.
  • Direcciones de nodo y pod IPv4 e IPv6.
  • Reglas de salida para el tráfico IPv4 e IPv6.
  • Configuración del equilibrador de carga para los servicios IPv4 e IPv6.

Nota:

Cuando se usan redes de doble pila con un tipo de salida de enrutamiento definido por el usuario, puede elegir tener una ruta predeterminada para IPv6 en función de si necesita el tráfico IPv6 para acceder a Internet. Si no tiene una ruta predeterminada para IPv6, aparece una advertencia al crear un clúster, pero no impide la creación del clúster.

Parámetros de clúster de pila doble

Los parámetros siguientes admiten clústeres de doble pila:

Parámetro Valores aceptados Valor predeterminado Restricciones
--ip-families ipv4 o ipv4,ipv6 No especificado Proporcione una lista separada por comas de familias ip para habilitar en el clúster.
--pod-cidrs Intervalos CIDR separados por comas 10.244.0.0/16,fd12:3456:789a::/64 El recuento y el orden de los intervalos deben coincidir con --ip-families.
--service-cidrs Intervalos CIDR separados por comas 10.0.0.0/16,fd12:3456:789a:1::/108 El recuento y el orden de los intervalos deben coincidir con --ip-families. La subred IPv6 no puede ser mayor que /108.

Implementar un clúster de AKS de pila doble

  1. Cree un grupo de recursos de Azure para el clúster mediante el az group create comando .

    az group create --location <region> --name <resourceGroupName>
    
  2. Cree un clúster de AKS de pila doble mediante el comando az aks create con el parámetro --ip-families establecido en 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. Después de crear el clúster, obtenga las credenciales del clúster mediante el az aks get-credentials comando .

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

Inspección de los nodos para ver ambas familias de direcciones IP

Una vez aprovisionado el clúster, confirme que los nodos se aprovisionan con redes de doble pila mediante el kubectl get nodes comando .

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

La salida del comando kubectl get nodes muestra que los nodos tienen direcciones y espacio de asignación de IP de pods tanto de IPv4 como de 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

Creación de una carga de trabajo de ejemplo

Despliegue un servidor web NGINX con tres réplicas para verificar la asignación de direcciones IP dual-stack a los pods.

Instalación de un servidor web NGINX

  1. Cree un servidor web NGINX ejecutando el kubectl create deployment nginx comando .

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Para ver los recursos del pod, ejecute el 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"
    

    La salida muestra que los pods tienen direcciones IPv4 e IPv6. Los pods no muestran direcciones IP hasta que estén listos.

    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
    

Exposición de la carga de trabajo a través de un servicio de tipo LoadBalancer

Importante

Azure Load Balancer envía sondeos de estado a los destinos IPv6 desde una dirección local de vínculo. En los grupos de nodos de Azure Linux, el tráfico hacia los servicios IPv6 que usan externalTrafficPolicy: Cluster falla. En los ejemplos siguientes se establece externalTrafficPolicy: Local en el servicio IPv6 para que kube-proxy responda al sondeo en el nodo.

  1. Exponga la implementación de NGINX con servicios IPv4 e IPv6 LoadBalancer independientes mediante el 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"]}}'
    

    Obtendrá una salida que indica que los servicios están expuestos.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Después de exponer la implementación y aprovisionar completamente los LoadBalancer servicios, obtenga las direcciones IP de los servicios mediante el 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. Compruebe la funcionalidad de una máquina virtual Linux o una máquina local con una dirección IPv6 asignada y un enrutamiento IPv6 configurado. Azure Cloud Shell no admite 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>