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 IPVS
importante
La versión 1.35 de Kubernetes dejó de usar el modo IPVS de kube-proxy. En su lugar, usa el modo nftables en el sitio web de Kubernetes. https://kubernetes.io/docs/reference/networking/virtual-ips/#proxy-mode-nftables
EKS en modo de servidor virtual IP (IPVS) resuelve el problema de latencia de red que se presenta con frecuencia cuando se ejecutan grandes clústeres con más de 1000 servicios con kube-proxy que se ejecuta en el modo iptables heredado. Este problema de rendimiento es el resultado del procesamiento secuencial de las reglas de filtrado de paquetes de iptables para cada paquete. Este problema de latencia se solucionó en nftables, la empresa sucesora de iptables. Como alternativa, puede configurar el clúster para que se ejecute kube-proxy en modo IPVS.
Descripción general de
IPVS, que se utiliza en GA desde la versión 1.11 de Kubernetes
IPVS ofrece varias opciones para distribuir el tráfico a los módulos de backend. Puede encontrar información detallada sobre cada opción en la documentación oficial de Kubernetes
- rr (Round Robin) - wrr (Weighted Round Robin) - lc (Least Connections) - wlc (Weighted Least Connections) - lblc (Locality Based Least Connections) - lblcr (Locality Based Least Connections with Replication) - sh (Source Hashing) - dh (Destination Hashing) - sed (Shortest Expected Delay) - nq (Never Queue)
Implementación
Solo se requieren unos pocos pasos para habilitar IPVS en su clúster de EKS. Lo primero que debe hacer es asegurarse de que las imágenes de sus nodos de trabajo de EKS tengan instalado el ipvsadm paquete de administración del servidor virtual Linux. Para instalar este paquete en una imagen basada en Fedora, como Amazon Linux 2023, puede ejecutar el siguiente comando en la instancia del nodo de trabajo.
sudo dnf install -y ipvsadm
En una imagen basada en Debian, como Ubuntu, el comando de instalación tendría este aspecto.
sudo apt-get install ipvsadm
A continuación, debe cargar los módulos del núcleo para las opciones de configuración de IPVS enumeradas anteriormente. Se recomienda escribir estos módulos en un archivo dentro del /etc/modules-load.d/ directorio para que sobrevivan al reinicio.
sudo sh -c 'cat << EOF > /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_lc ip_vs_wlc ip_vs_lblc ip_vs_lblcr ip_vs_sh ip_vs_dh ip_vs_sed ip_vs_nq nf_conntrack EOF'
Puede ejecutar el siguiente comando para cargar estos módulos en una máquina que ya esté en ejecución.
sudo modprobe ip_vs sudo modprobe ip_vs_rr sudo modprobe ip_vs_wrr sudo modprobe ip_vs_lc sudo modprobe ip_vs_wlc sudo modprobe ip_vs_lblc sudo modprobe ip_vs_lblcr sudo modprobe ip_vs_sh sudo modprobe ip_vs_dh sudo modprobe ip_vs_sed sudo modprobe ip_vs_nq sudo modprobe nf_conntrack
nota
Se recomienda encarecidamente ejecutar estos pasos para el nodo de trabajo como parte del proceso de arranque del nodo de trabajo mediante un script de datos de usuario o en cualquier script de compilación que se ejecute para crear una AMI de nodo de trabajo personalizada.
A continuación, configurará los clústeres para que se kube-proxy DaemonSet ejecuten en modo IPVS. Esto se hace configurando en ipvs y en una de ipvs scheduler las opciones de equilibrio de carga enumeradas anteriormente, por ejemplo: rr para Round Robin. kube-proxy mode
aviso
Se trata de un cambio disruptivo y debe realizarse fuera del horario laboral. Recomendamos realizar estos cambios durante la creación inicial del clúster de EKS para minimizar los impactos.
Puede ejecutar un comando de la CLI de AWS para habilitar IPVS actualizando el kube-proxy EKS Add-on.
aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \ --configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \ --resolve-conflicts OVERWRITE
O puede hacerlo modificando el kube-proxy-config ConfigMap en su clúster.
kubectl -n kube-system edit cm kube-proxy-config
Busca la scheduler configuración en ipvs y establece el valor en una de las opciones de equilibrio de carga de ipvs enumeradas anteriormente, por ejemplo: rr para Round Robin. Busca la mode configuración, que es la predeterminadaiptables, y cambia el valor a. ipvs El resultado de cualquiera de las opciones debería ser similar al de la siguiente configuración.
iptables: masqueradeAll: false masqueradeBit: 14 minSyncPeriod: 0s syncPeriod: 30s ipvs: excludeCIDRs: null minSyncPeriod: 0s scheduler: "rr" syncPeriod: 30s kind: KubeProxyConfiguration metricsBindAddress: 0.0.0.0:10249 mode: "ipvs" nodePortAddresses: null oomScoreAdj: -998 portRange: "" udpIdleTimeout: 250ms
Si tus nodos de trabajo estaban unidos a tu clúster antes de realizar estos cambios, tendrás que reiniciar el DaemonSet kube-proxy.
kubectl -n kube-system rollout restart ds kube-proxy
Validación
Puedes validar que tu clúster y tus nodos de trabajo se ejecuten en modo IPVS emitiendo el siguiente comando en uno de tus nodos de trabajo.
sudo ipvsadm -L
Como mínimo, deberías ver un resultado similar al que se muestra a continuación, que muestre las entradas para el servicio del servidor de API de Kubernetes en 10.100.0.1 y el servicio CoreDNS en. 10.100.0.10
IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP ip-10-100-0-1.us-east-1. rr -> ip-192-168-113-81.us-eas Masq 1 0 0 -> ip-192-168-162-166.us-ea Masq 1 1 0 TCP ip-10-100-0-10.us-east-1 rr -> ip-192-168-104-215.us-ea Masq 1 0 0 -> ip-192-168-123-227.us-ea Masq 1 0 0 UDP ip-10-100-0-10.us-east-1 rr -> ip-192-168-104-215.us-ea Masq 1 0 0 -> ip-192-168-123-227.us-ea Masq 1 0 0
nota
El resultado de este ejemplo proviene de un clúster de EKS con un intervalo de direcciones IP de servicio de. 10.100.0.0/16