View a markdown version of this page

Ejecutando kube-proxy en modo nftables - Amazon EKS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejecutando kube-proxy en modo nftables

Con kube-proxy el modo nftables, Amazon EKS puede resolver el problema de latencia de red que es habitual en clústeres grandes con más de 1000 servicios que ejecutan kube-proxy en modo iptables. El modo iptables procesa las reglas de filtrado de paquetes de forma secuencial para el primer paquete de cada conexión, lo que provoca este problema de rendimiento. nftables es el sucesor de iptables, y el kube-proxy backend de nftables soluciona este problema de latencia procesando los paquetes en un tiempo casi constante, independientemente del tamaño del clúster. Para evitar este problema, configura tu clúster para que se ejecute en modo nftables. kube-proxy

Descripción general de

El kube-proxy backend de nftables está disponible de forma general (GA) desde la versión 1.33 de Kubernetes. Estaba disponible como versión alfa en la versión 1.29 y como versión beta en la 1.31. El backend de iptables instala una regla para cada servicio y evalúa las reglas de forma secuencial. Esto da como resultado un tiempo de procesamiento de paquetes O (n) que aumenta con la cantidad de servicios. Por el contrario, nftables usa mapas de veredictos para enviar paquetes en aproximadamente O (1) tiempo. Esto mantiene la latencia por paquete casi constante incluso en clústeres con decenas de miles de servicios, lo que proporciona eficiencia a los clústeres con miles de nodos y servicios.

nota

Aunque el backend de nftables es GA, iptables sigue siendo el kube-proxy modo predeterminado por motivos de compatibilidad. Debes optar explícitamente por el modo nftables.

A diferencia del backend de IPVS, que se diseñó como un balanceador de cargas y expone algoritmos de programación como el sistema de turnos por turnos y el mínimo de conexiones, el backend de nftables no ofrece algoritmos de programación configurables. Cuando un servicio tiene varios pods de respaldo, el modo nftables selecciona un pod de backend de forma aleatoria.

Requisitos

El kube-proxy backend de nftables requiere el kernel de Linux 5.13 o una versión posterior en los nodos de trabajo. Amazon Linux 2023 y las versiones actuales de Ubuntu cumplen este requisito mínimo. Como kube-proxy los programas nftables gobiernan directamente a través del subsistema netfilter del kernel, no es necesario cargar ningún paquete de espacio de usuario adicional (por ejemploipvsadm) ni ningún módulo del kernel más allá de un kernel compatible.

nota

El kernel 5.13 es el mínimo necesario para ejecutar el modo nftables. Para mejorar el rendimiento de la sincronización de reglas en clústeres grandes, recomendamos un kernel y una versión más recientes. kube-proxy Para obtener más información, consulte Consideraciones sobre el rendimiento.

importante

Es posible que el backend de nftables no sea compatible con todos los complementos de red. Consulta la documentación de tu proveedor de CNI antes de habilitar el modo nftables. El CNI de Amazon VPC es compatible con el modo nftables a partir de la versión. v1.23.0

Implementación

Configure los clústeres para que se kube-proxy DaemonSet ejecuten en modo nftables configurando el valor en. kube-proxy mode nftables

aviso

Se trata de un cambio disruptivo. Recomendamos realizarlo fuera del horario laboral o durante la creación inicial del clúster de EKS para minimizar los impactos.

Puede ejecutar un comando de la interfaz de línea de comandos de AWS (CLI de AWS) para habilitar nftables actualizando el EKS. kube-proxy Add-on Esto requiere un clúster de EKS que ejecute Kubernetes 1.33 o una versión posterior.

aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \ --configuration-values '{"mode": "nftables"}' \ --resolve-conflicts OVERWRITE

O puede hacerlo modificando el en su clúster. kube-proxy-config ConfigMap

kubectl -n kube-system edit cm kube-proxy-config

Busque la mode configuración, que es la predeterminadaiptables, y cambie el valor anftables. El resultado de cualquiera de las opciones debería ser similar al de la siguiente configuración.

mode: "nftables" nftables: masqueradeAll: false masqueradeBit: 14 minSyncPeriod: 1s syncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 0.0.0.0:10249 nodePortAddresses: null oomScoreAdj: -998 portRange: ""

Si tus nodos de trabajo estaban unidos a tu clúster antes de realizar estos cambios, reinicia el DaemonSet kube-proxy.

kubectl -n kube-system rollout restart ds kube-proxy

Consideraciones sobre el rendimiento

Aunque el modo nftables generalmente está disponible a partir de la versión de Kubernetesv1.33, recomendamos usar este modo solo a partir de la versión inicial. v1.36 En la kube-proxy versión 1.36.0, el proyecto Kubernetes introdujo muchas mejoras de rendimiento en la forma en que se construyen los mapas y las reglas de nftables. Estos cambios reducen significativamente la cantidad de cadenas y goto reglasjump/, lo que mejora considerablemente el rendimiento de la sincronización a gran escala.

Estas mejoras benefician principalmente a los clústeres con un gran número de puntos finales (los pods que respaldan tus servicios). Antes de la kube-proxy versión 1.36.0, los clústeres con cientos de miles de puntos finales podían experimentar tiempos de sincronización de reglas de nftables muy lentos y bloqueos parciales de la CPU. Esto ocurre porque el núcleo de Linux comprueba que las cadenas y saltos que se generan no contienen bucles. kube-proxy

Este comportamiento también se ve afectado por la versión del kernel de Linux. Las mejoras subyacentes del núcleo se incluyen en el núcleo de Linux 6.18 (y se están adaptando a algunos núcleos estables anteriores). El uso del modo nftables con versiones anteriores del kernel de Linux puede provocar tiempos de sincronización de reglas más lentos y posibles bloqueos parciales de la CPU. Para obtener el mejor rendimiento en clústeres grandes, recomendamos ejecutar un kernel de Linux reciente junto con kube-proxy la versión 1.36.0 o posterior. Para obtener más información, consulte el problema de rendimiento de kube-proxy nftables (#135639) en el sitio web. kubernetes/kubernetes GitHub