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
oipv4,ipv6
.
- Solo se admiten
--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
.
- La cantidad y el orden de los intervalos de esta lista debe coincidir con el valor que se proporciona a
--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.
- La cantidad y el orden de los intervalos de esta lista debe coincidir con el valor que se proporciona a
Implementar un clúster de AKS de pila doble
Cree un grupo de recursos de Azure para el clúster mediante el comando
az group create
.az group create --location <region> --name <resourceGroupName>
Cree un clúster de AKS de pila doble mediante el comando
az aks create
con el parámetro--ip-families
establecido enipv4,ipv6
.az aks create \ --location <region> \ --resource-group <resourceGroupName> \ --name <clusterName> \ --ip-families ipv4,ipv6 \ --generate-ssh-keys
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
Cree un servidor web NGINX mediante el comando
kubectl create deployment nginx
.kubectl create deployment nginx --image=nginx:latest --replicas=3
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
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
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 comandokubectl 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"]
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
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
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 comandokubectl 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
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>
Azure Kubernetes Service