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.
EKS en el modo de servidor virtual IP (IPVS) resuelve el problema de latencia de la redkube-proxy
Descripción general
IPVS, que ha estado en formato GA desde la versión 1.11 de Kubernetes
IPVS ofrece varias opciones para distribuir el tráfico a los pods de back-end. 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 del nodo de trabajo de EKS tengan instalado el ipvsadm
paquete de administración del servidor virtual de 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 trabajador.
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. Recomendamos escribir estos módulos en un archivo dentro del /etc/modules-load.d/
directorio para que sobrevivan a un 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é funcionando.
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 del 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 una de kube-proxy
mode
ipvs
las ipvs scheduler
opciones de equilibrio de carga enumeradas anteriormente, por ejemplo: rr
para Round Robin.
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 emitir un comando de la AWS CLI para habilitar IPVS actualizando el complemento kube-proxy
EKS.
aws eks update-addon --cluster-name $CLUSTER_NAME --addon-name kube-proxy \
--configuration-values '{"ipvs": {"scheduler": "rr"}, "mode": "ipvs"}' \
--resolve-conflicts OVERWRITE
O bien, puede hacerlo modificando el kube-proxy-config
ConfigMap de su clúster.
kubectl -n kube-system edit cm kube-proxy-config
Busque la scheduler
configuración en ipvs
y establezca 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, cuyo valor predeterminado esiptables
, 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 los nodos de trabajo se unieron al 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
Para validar que el clúster y los nodos de trabajo se estén ejecutando en modo IPVS, ejecute el siguiente comando en uno de sus nodos de trabajo.
sudo ipvsadm -L
Como mínimo, deberías ver un resultado similar al siguiente, que muestre las entradas del servicio de servidor de API de Kubernetes en y 10.100.0.1
el servicio de 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 EKS con un rango de direcciones IP del servicio de. 10.100.0.0/16