Compartir a través de


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

Puede implementar sus clústeres de AKS en modo pila doble cuando se usan redes kubenet y una red virtual de Azure de pila doble. 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 pila doble con un clúster de AKS. Para más información sobre las opciones y consideraciones de red, consulte el artículo sobre los conceptos de red para Kubernetes y AKS.

Limitaciones

  • Las tablas de rutas de Azure tienen un límite máximo de 400 rutas por tabla.
    • Como cada nodo de un clúster de pila doble requiere dos rutas, una para cada familia de direcciones IP, los clústeres de pila doble están limitados a 200 nodos.
  • En los grupos de nodos Azure Linux los objetos de servicio solo se admiten con externalTrafficPolicy: Local.
  • Las redes de doble pila son necesarias para la red virtual de Azure y el CIDR del pod.
    • No se admite solo una IPv6 de pila única para las direcciones IP de nodo o pod. Los servicios se pueden aprovisionar en IPv4 o IPv6.
  • Las siguientes características no se admiten en kubenet de pila doble:

Requisitos previos

  • Se aplican todos los requisitos previos de la configuración de redes kubenet.
  • Los clústeres de pila doble de AKS requieren la versión v1.21.2 o superior de Kubernetes. Se recomienda la versión 1.22.2 o posterior.
  • Si usa plantillas de Azure Resource Manager, se requiere la versión de esquema 2021-10-01.

Descripción general de las redes de pila doble en Kubernetes

Kubernetes v1.23 ofrece compatibilidad ascendente estable con clústeres de pila doble de IPv4/IPv6, incluidas redes de pods y servicios. A los nodos y pods siempre se les asigna una dirección IPv4 y una IPv6, mientras que los servicios pueden ser de pila doble o una sola pila en cualquier familia de direcciones.

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

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

Nota:

Al usar Dualstack 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 o no su tráfico IPv6 para acceder a Internet. Si no tiene una ruta predeterminada para IPv6, aparecerá una advertencia al crear un clúster, pero no impedirá su creación.

Implementación de un clúster de pila doble

Se proporcionan los siguientes atributos para admitir los clústeres de pila doble:

  • --ip-families: toma una lista de familias de direcciones IP separadas por comas para habilitarlas en el clúster.
    • Solo se admiten ipv4 o ipv4,ipv6.
  • --pod-cidrs: toma una lista de intervalos IP de notación CIDR separados por comas desde donde asignar direcciones IP de los pods.
    • La cantidad y el orden de los intervalos de esta lista debe coincidir con el valor que se proporciona a --ip-families.
    • Si no se proporciona ningún valor, se usará el valor predeterminado de 10.244.0.0/16,fd12:3456:789a::/64.
  • --service-cidrs: toma una lista de intervalos IP de notación CIDR separados por comas desde donde asignar direcciones IP de los servicios.
    • La cantidad y el orden de los intervalos de esta lista debe coincidir con el valor que se proporciona a --ip-families.
    • Si no se proporciona ningún valor, se usará el valor predeterminado de 10.0.0.0/16,fd12:3456:789a:1::/108.
    • La subred IPv6 asignada a --service-cidrs 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 comando az group create.

    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> \
        --ip-families ipv4,ipv6 \
        --generate-ssh-keys
    
  3. Una vez creado el clúster, obtenga las credenciales de administrador del clúster mediante el comando az aks get-credentials.

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

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

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

    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 direcciones IP de los pods desde 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
    

Creación de una carga de trabajo de ejemplo

Una vez creado el clúster, puede implementar las cargas de trabajo. Este artículo le guía a través de una implementación de carga de trabajo de ejemplo de un servidor web NGINX.

Instalación de un servidor web NGINX

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

    kubectl create deployment nginx --image=nginx:latest --replicas=3
    
  2. Vea los recursos de pod mediante el 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"
    

    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

A partir de AKS v1.27, puede crear un servicio LoadBalancer de doble pila que se aprovisionará con una IP pública IPv4 y una IP pública IPv6. Sin embargo, en versiones anteriores, solo se aprovisionará la primera dirección IP de un servicio en el equilibrador de carga, por lo que un servicio de pila doble solo recibe una dirección IP pública para su familia de direcciones IP enumeradas por primera vez. A fin de proporcionar un servicio de pila doble para una implementación única, cree dos servicios destinados al mismo selector: uno para IPv4 y el otro para IPv6.

AKS a partir de la versión 1.27

  1. Exponga la implementación de NGINX mediante el comando kubectl expose deployment nginx.

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

    Recibe una salida que muestra que los servicios se han expuesto.

    service/nginx exposed
    
  2. Una vez que la implementación se expone y los servicios LoadBalancer están completamente aprovisionados, obtenga las direcciones IP de los servicios mediante el 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. Compruebe la funcionalidad a través de una solicitud web de línea de comandos desde un host compatible con IPv6. Azure Cloud Shell no es compatible con 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 anterior a v1.27

  1. Exponga la implementación de NGINX mediante el 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"]}}'
    

    Recibe una salida que muestra que los servicios se han expuesto.

    service/nginx-ipv4 exposed
    service/nginx-ipv6 exposed
    
  2. Una vez que la implementación se expone y los servicios LoadBalancer están completamente aprovisionados, obtenga las direcciones IP de los servicios mediante el 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. Compruebe la funcionalidad a través de una solicitud web de línea de comandos desde un host compatible con IPv6. Azure Cloud Shell no es compatible con 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>