Problemas causados por la configuración conn_reuse_mode en el modo de reenvío IPVS de clústeres de CCE
Síntoma
En el modo de reenvío IPVS utilizado en un clúster de CCE, puede haber una latencia de 1 segundo cuando un Service accede al clúster de CCE. Esto se debe a un error en la reutilización de las conexiones IPVS de Kubernetes.
Parámetro de reutilización de conexión de IPVS
La política de reutilización de puertos de IPVS viene determinada por el parámetro net.ipv4.vs.conn_reuse_mode del núcleo.
- Si net.ipv4.vs.conn_reuse_mode se establece en 0, IPVS no reprograma una nueva conexión, sino que reenvía la nueva conexión al RS original (IPVS backend).
- Si net.ipv4.vs.conn_reuse_mode se establece en 1, IPVS reprograma una nueva conexión.
Problemas causados por la reutilización de la conexión de IPVS
- Problema 1
Si net.ipv4.vs.conn_reuse_mode se establece en 0, IPVS no programa de forma proactiva nuevas conexiones con reutilización de puertos ni activa ninguna operación de terminación o desconexión de la conexión. Los paquetes de datos de las nuevas conexiones se reenviarán directamente al RS original. Si se ha eliminado el pod de backend, se produce una excepción. Sin embargo, de acuerdo con la lógica de implementación actual, el RS no será borrado por kube-proxy siempre y cuando las solicitudes de conexión para la reutilización del puerto se envíen continuamente.
- Problema 2
Si net.ipv4.vs.conn_reuse_mode se establece en 1, si el puerto de origen es el mismo que el de una conexión anterior en un escenario de alta simultaneidad, la conexión no se reutiliza sino que se reprograma. De acuerdo con la lógica de procesamiento de ip_vs_in(), si net.ipv4.vs.conntrack está habilitado, se descarta el primer paquete SYN. Como resultado, el paquete SYN se retransmitirá, conduciendo a una latencia de 1 segundo. Como resultado, el rendimiento se deteriora.
Configuración de la comunidad e impacto en los clústeres de CCE
En Kubernetes 1.17 y versiones anteriores, el valor predeterminado de net.ipv4.vs.conn_reuse_mode es 0. A partir de Kubernetes 1.19, puede determinar si habilitar net.ipv4.vs.conn_reuse_mode en función de la versión del núcleo. Si la versión del núcleo es posterior a 4.1, establezca net.ipv4.vs.conn_reuse_mode en 1. En otros casos, conserve el valor predeterminado 0.
Impacto en los nodos de CCE
- En clústeres de CCE de 1.17 y versiones anteriores, si se utiliza IPVS para reenviar datos, el problema 1 se produce cuando net.ipv4.vs.conn_reuse_mode se establece en 0. El RS no se puede quitar debido a la reutilización del puerto.
- En los clústeres de CCE de 1.19:
- Si está utilizando EulerOS 2.5 o CentOS 7.6, el problema 1 se produce cuando net.ipv4.vs.conn_reuse_mode se establece en 0. El RS no se puede quitar debido a la reutilización del puerto.
- Si está usando EulerOS 2.9 o Ubuntu 18.04, el problema 2 se produce cuando net.ipv4.vs.conn_reuse_mode se establece en 1. Se produce una latencia de 1 segundo en escenarios de alta simultaneidad.
Sugerencias
Si los problemas anteriores afectan a sus servicios, tome las siguientes medidas:
- Utilice un clúster cuyo modo de reenvío sea iptables.
- Si el impacto de este problema es leve, seleccione una versión del sistema operativo adecuada para clústeres de 1.19.
Plan de Rectificación
CCE ha solucionado los problemas relacionados en EulerOS 2.9. Restablezca el nodo o crear un nuevo nodo para resolver el problema.
- x86: 4.18.0-147.5.1.6.h686.eulerosv2r9.x86_64
- Arm: 4.19.90-vhulk2103.1.0.h584.eulerosv2r9.aarch64
Problema de la comunidad de Kubernetes: https://github.com/kubernetes/kubernetes/issues/81775