principio de red k8s-ipvs
1. Conocimientos previos
?Este artículo presenta principalmente los dos modos de servicio en la red k8s (clusterIp, nodeport) y cómo fluyen los datos a través de ipvsamp; Mientras aprende los conocimientos anteriores, también debe comprender los conocimientos relevantes de ipset y conntrack. Revisar artículos de ediciones anteriores
1.1. ipset
?¿Qué es ipset? ipset es en realidad una extensión de iptables, que puede definir una colección de direcciones. Tome la lista negra como ejemplo. Quiero que las IP en la lista negra denieguen el acceso a sitios web (hay muchas listas negras, según el método tradicional de iptables, cuando es necesario agregar muchas reglas a la tabla de filtros para que coincidan una por una). La eficiencia de coincidencia es muy baja (lo que afecta seriamente el rendimiento). Con ipset, solo necesita agregar una regla y la estructura hash es muy eficiente.
El comando ipset es el siguiente
? Por supuesto, ipset también admite hash: ip, hash: ip, puerto, ip y otras composiciones de claves hash. Específicamente, puede usar ipset. -h Comprobar. A continuación, expliquemos el significado de src y dst después de -m set. src se refiere al origen, dst se refiere al destino. El significado de esta regla es que el tráfico desde la ip 192.178.113.100 que accede al puerto local 8410 se eliminará.
ipset utiliza una estructura hash, que es mucho más eficiente que el recorrido de listas vinculadas de iptables. Hay muchas formas más avanzadas de reproducir ipset, que no se explicarán en este artículo.
1.2.ipvs
¿Qué es lvs? El nombre completo es Linux Virtual Server. Es un proyecto de equilibrio de carga de código abierto dirigido por el Dr. Zhang Wensong y se ha integrado en el kernel de Linux. LVS proporciona ricas capacidades de equilibrio de carga. Después de recibir las solicitudes de los usuarios, las reenvía a un servidor back-end en el estado del kernel de acuerdo con algoritmos de equilibrio de carga específicos. Esto significa que LVS no necesita escuchar puertos específicos. A continuación, echemos un vistazo a algunos conceptos básicos de lvs.
El principio de ipvs es el siguiente. ipvs funciona en la cadena de entrada de iptables. VIP generalmente se define como una IP virtual en el nodo DS. Tome el modo NAT como ejemplo.
①: Cuando el paquete de solicitud llega al DS, primero pasa a través de la cadena PREROUTING de iptables y determina que la IP de destino (VIP) es la IP local, por lo que la solicitud se reenvía a la cadena INPUT.
②: Debido a que lvs funciona en la cadena INPUT, una vez que los datos llegan a la cadena INPUT, lvs comparará la solicitud del usuario con el servicio de back-end definido. Si es el servicio de back-end solicitado, a. se utilizará cierta carga. El algoritmo de equilibrio encuentra un RIP de back-end y modifica la IP de destino y el puerto del paquete de datos a un determinado RIP (conversión DNAT).
③: En este momento, los datos llegan a la cadena POSTROUTING (no se realizará SNAT. La IP de origen del paquete de datos es CIP, la IP de destino es RIP y el paquete de datos se envía a). ROTURA.
LVS proporciona tres modos de reenvío de paquetes, como se muestra a continuación.
Dado que k8s usa el modo NAT, echemos un vistazo al flujo de paquetes de datos en modo NAT.
Como se muestra en la siguiente figura
①: El paquete de datos de solicitud llega a DS y el paquete de datos pasa a través de la cadena PREROUTING. En este momento, el paquete ip src ip es CIP y el dst ip es. VIP
②: Debido a que el VIP solicitado es la IP virtual en el DS, el paquete de datos se envía a la cadena INPUT.
③: Después de que el paquete de datos llega a la cadena de ENTRADA, ipvs descubre que la solicitud del paquete de datos es un servicio de clúster definido, por lo que utiliza el algoritmo de equilibrio de carga definido para encontrar un nodo RS específico y realiza DNAT. y modifica el paquete de datos dst La ip es RIP, el paquete de datos llega a la cadena POSTROUTING y se envía a RS.
④: Después de recibir el paquete de datos, RS compara la ip dst y descubre que él mismo recibe el paquete de datos para su procesamiento. Una vez completado el procesamiento, el paquete de datos ip src ip es RIP. dst ip es CIP. Envía el paquete de datos a DS.
⑤: DS recibe el paquete de respuesta de RS, modifica src ip a su propio VIP, dst ip a CIP y envía el paquete de datos al cliente.
Comparación de las ventajas y desventajas de los tres modos
A continuación, hablemos brevemente sobre la estrategia de equilibrio de carga de ipvs y presentemos brevemente los siguientes cuatro tipos.
?Lo anterior ha introducido los principios básicos del modo kernel de ipvs. A continuación, presentaremos cómo utilizar el comando del modo de usuario ipvsadm para operar ipvs. Nota: Esta prueba se realizó en cuatro máquinas virtuales. El modo ipvs utiliza el modo nat. La puerta de enlace del RS no apunta a la IP del DS (no hay forma de hacerlo manualmente). Nodo DS, como se detalla a continuación. Cree un vip con IP 192.168.113.101
Agregue RS a vip
Después de agregar RS, vea las reglas de ipvs, como se muestra en la siguiente figura
cliente El La dirección IP del cliente es 192.168.113.102. Si el cliente desea acceder al VIP directamente, debe agregar una ruta estática en el lado del cliente. Agregue el comando de la siguiente manera
Después de agregar el comando, curl. 10.10.0.1:8410 en el lado del cliente. Descubrimiento No funciona En este momento, vaya a un determinado RS para capturar el paquete de la siguiente manera
¿La captura de paquetes anterior muestra que el cliente accede directamente? VIP y la IP de destino del paquete de datos cambia a la IP de RS, por lo que se puede ver que ipvs realiza la conversión DNAT. Gracias a DNAT, RS envía datos de respuesta directamente al cliente y el cliente recibe el paquete de datos de RS. El paquete enviado por el cliente al VIP recibió un paquete de respuesta de RS (el cliente pensó que nunca había enviado datos a RS), por lo que el cliente descartó el paquete de datos.
Debido a que ipvs no realiza SNAT, a continuación agregue reglas de iptables en el DS para implementar la función SNAT usted mismo. Después de agregar SNAT, RS no podrá ver el CIP real.
? En este momento, todavía está bloqueado. Después de buscar información, descubrí que el conntrack de ipvs no está activado. El artículo siguiente presentará qué es conntrack. Una vez completada la configuración, podrá acceder a ella felizmente.
?Resumen: A través de la función DNAT y la función de equilibrio de carga proporcionada por ipvs, es fácil darse cuenta de las necesidades de los usuarios externos para acceder a la intranet.
Pero también debemos considerar el alto nivel de disponibilidad. Por ejemplo, si el DS principal está inactivo, el VIP se desplazará al DS de respaldo y el RS backend se reiniciará o fallará. El RS problemático debe eliminarse del equilibrio de carga de ipvs. lista a tiempo, para que realmente se pueda lograr una alta disponibilidad.
1.3. conntrack
?Todo el mundo utiliza la dirección IP 192.168.x.x cuando navega por Internet en casa. Entonces, ¿cómo pueden todos acceder con éxito a la red externa? La respuesta es que el enrutador realiza la función SNAT por nosotros, de modo que la IP src del paquete de datos que enviamos se convierte en la IP pública del enrutador, de modo que el paquete de datos se puede reenviar felizmente a través de Internet. Esto logra la protección de la intranet.
?Entonces la pregunta es, dado que se realiza la conversión SNAT, ¿cómo sabe el enrutador a qué PC transferir el paquete de respuesta cuando regresa? El enrutador puede estar conectado a muchas PC y es imposible reenviar los datos a cada PC. . . La respuesta la implementa conntrack.
?A continuación, permítanme tomar el ejemplo de ipvs anterior como ejemplo. Implementamos manualmente la conversión SNAT en el DS y curl vip: 8410 en el cliente. En este momento, verifique las tablas de conexión en el DS. el cliente de la siguiente manera
p>Comencemos con el análisis de seguimiento de conexión en el cliente: observe principalmente los campos de src, dst, sport y dport.
El cliente envía paquetes de datos
La ip src del paquete de datos enviado por el cliente es 192.168.113.102, la ip dst es 10.10.0.1 (VIP), el puerto deportivo es 35562 y el puerto es 8410 (puerto definido VIP).
El cliente recibe el paquete de respuesta
Se espera que la ip src sea vip (10.10.0.1), la ip dst sea CIP (192.168.113.102), la sport sea 8410 , y el dport es 35562 p>
DS recibe paquetes de datos
DS recibe paquetes de datos cuya ip src es CIP (192.168.113.102), ip dst es vip (10.10.0.1), sport es 35562 y dport es 8410
¿DS recibe el paquete de respuesta?
?Debido a la conversión DNAT en el lado DS, se encontró un RS (RIP 192.168.113.99) según la carga También se realizó la política de equilibrio y la conversión SNAT (determinar si es un VIP y un puerto) y convertirla al DIP de DS. Entonces, cuando DS recibe la ip src es 192.168.113.99 (RIP), la ip dst es 192.168.113.101 (DIP), el deporte es 8080 y el dport es 35562, descubrirá de acuerdo con la tabla de seguimiento de conexiones por qué se envía el paquete. el cliente 192.168.113.102, por lo que el paquete de datos se reenvía a 192.168.113.102:35562.
El significado de cada campo de conntrack
Resumen:
Este artículo solo explica brevemente conntrack y no especifica cuándo fluyen los datos a través de netfilter. ¿Cuál es la estructura de datos del almacenamiento de datos? La capa inferior es relativamente complicada. Los expertos interesados pueden estudiarla por sí mismos ~
2. Comunicación de red k8s
¿Terminaste de presentar ipset, ipvs? y conntrack, vayamos al grano y echemos un vistazo a la comunicación de red de k8s en modo ipvs.
La función principal de kube-proxy es observar un servidor. Cuando detecta cambios en pods o servicios, modifica las reglas locales de iptables o ipvs.
2.1. modo clusterIp
El modo clusterIp es una IP accesible dentro del clúster. No se puede acceder a esta IP fuera del clúster. El entorno de prueba es el siguiente:
<. p> Creado Después de la implementación y el servicio, verifique la IP del servicio de la siguiente manera.A continuación, observe los cambios en la tarjeta de red del host, las reglas de ipvs y las reglas de ipset.
Consulte la tabla nat y la tabla de filtros de iptables para ver qué reglas ha creado k8s. y qué cadenas se han pasado
A continuación, analicemos cómo fluyen los datos curl 10.108.113.237. Solo discutiremos la dirección del flujo en la tabla nat y la tabla de filtro, porque no hay reglas en mangle y raw. .
1. Cadena PREROUTING de la tabla NAT
①: Los datos ingresan primero a la cadena PREROUTING y todas las solicitudes ingresarán a la cadena KUBE-SERVICES.
②: Después de ingresar a KUBE-SERVICES, verifique las reglas correspondientes a esta cadena y descubra que la IP y el puerto de destino solicitados están en el ipset correspondiente a KUBE-CLUSTER-IP (que se muestra arriba), y Si no, salte a la cadena KUBE-MARK-MASQ.
③: Los datos fluyen a la cadena KUBE-MARK-MASQ, que realiza principalmente la función de marcado de marcas. El comando iptables es el siguiente
④: Luego va a KUBE. -Cadena NODE-PORT, porque no hay un servicio Definir el tipo de nodo, que se omite aquí. 2. Cadena de ENTRADA de la tabla de filtros
⑤: Primero ingrese la cadena de ENTRADA y todos los datos se transfieren a la cadena KUBE-FIREWALL.
⑥: Ingrese la cadena KUBE-FIREWALL. Si se encuentra que el paquete de datos es 0x8000/0x8000, SÍGUELO. Debido a que ipvs funciona en la cadena INPUT, una vez que se completa DNAT, se reenvía directamente a la cadena POSTROUTING.
3. cadena POSTROUTING de la tabla nat
⑦: Ingresando a la cadena POSTROUTING, todos los datos se transfieren a la cadena KUBE-POSTROUTING
⑧: Ingresando a KUBE- Cadena POSTROUTING, para paquetes marcados con 0x4000/0x4000 se convierten SNAT porque ipvs solo tiene función DNAT.
4. Los datos se reenvían a la tarjeta de red de franela para su reenvío
⑨: franela empaqueta los datos de acuerdo con el modo de backend específico y luego los envía. El modo de red de franela es relativamente complicado y se explicará en un artículo especial más adelante.
2.2. Modo Nodeport
Si desea que los servicios dentro del clúster sean accesibles desde fuera del clúster, puede usar el modo nodeport para abrir un puerto en la máquina física. que el exterior pueda acceder al interior del cluster de servicio. Nota: siga utilizando la implementación creada anteriormente.
Verifique la información sobre la creación del servicio y descubra que también se ha creado una IP dentro del clúster.
Las reglas de iptables son las siguientes
A continuación, veamos los cambios en las reglas de ipset y descubramos que un miembro en KUBE-NODE-PORT-TCP es el valor de nodePort que acabamos de especificado.
A continuación, echemos un vistazo a las reglas de iptables, la tabla nat y la tabla de filtro
1. Cadena PREROUTING de la tabla nat
①: los datos primero ingresan al cadena PREROUTING, y todas las solicitudes ingresarán a la cadena KUBE-SERVICES.
②: La ip y el puerto no coinciden con el ipset de KUBE-CLUSTER-IP. Se considera que es la dirección local a la que se accede y ingresa a la cadena KUBE-NODE-PORT.
③: Después de ingresar a la cadena KUBE-NODE-PORT, se determina que el puerto de acceso está en la regla ipset KUBE-NODE-PORT-TCP, por lo que ingresa a la cadena KUBE-MARK-MASQ.
④: Ingrese la cadena KUBE-MARK-MASQ y marque los datos
El proceso posterior es el mismo que clusterIp y no se explicará aquí.
2.3. ¿Relacionado con DNS?
?El DNS en k8s usa coredns por defecto. Compruébalo con el siguiente comando. El servicio definido en k8s tiene un nombre de dominio y el acceso al nombre de dominio debe resolverse a través de dns. En este momento, coredns desempeñará su papel.
En la prueba anterior, creamos un servicio de nodePort de my-service. En este momento, verifique la IP correspondiente a este nombre de dominio, como se muestra en la figura siguiente, la IP resuelta por el nombre de dominio. es la misma que la IP correspondiente al servicio, ya está.
Referencia:
?
El contenido relacionado anterior presenta la implementación relevante del servicio k8s ipvs. Si hay algún error, indíquelo ~