Estoy ejecutando un clúster de Kubernetes en una nube pública (Azure / AWS / Google Cloud), y tengo algunos servicios que no son HTTP que me gustaría exponer para los usuarios.
Para los servicios HTTP, normalmente usaría un recurso Ingress para exponer ese servicio públicamente a través de una entrada DNS direccionable.
Para servicios no basados en HTTP, basados en TCP (por ejemplo, una base de datos como PostgreSQL), ¿cómo debo exponerlos para el consumo público?
Pensé en usar los NodePort
servicios, pero esto requiere que los nodos sean accesibles públicamente (confiando en la kube-proxy
ruta al nodo apropiado). Prefiero evitar esto si es posible.
LoadBalancer
Los servicios parecen otra opción, aunque no quiero crear un equilibrador de carga en la nube dedicado para cada servicio TCP que quiero exponer.
Soy consciente de que el controlador NGINX Ingress admite la exposición de servicios TCP y UDP , pero eso parece requerir una definición estática de los servicios que le gustaría exponer. Para mi caso de uso, estos servicios se crean y destruyen dinámicamente, por lo que no es posible definir estas asignaciones de servicios por adelantado en una estática ConfigMap
.
fuente
Bueno, ¿eso depende de cómo espera que el usuario final se dirija a esos Servicios? Como señaló, con un Ingress, es posible usar un alojamiento virtual para enrutar todas las solicitudes al mismo controlador de Ingress, y luego usar el
Host:
encabezado para enviar dentro del clúster.Con un servicio TCP, como PostgreSQL, no existe ese encabezado. Por lo tanto, necesariamente debe tener un mecanismo basado en IP o asignar a cada uno un puerto dedicado en su IP con conexión a Internet
Si sus clientes conocen IPv6, asignar a cada Servicio una dirección IP dedicada es absolutamente razonable, dado el espacio de IP absolutamente masivo que ofrece IPv6. Pero de lo contrario, tiene dos botones para activar: la IP y el puerto.
A partir de ahí, cómo enrutará esas conexiones dentro de su clúster hacia el Servicio correcto dependerá de cómo resolvió el primer problema
fuente
NodePort
s requieren abrir los puertos en los nodos públicamente, lo que no es ideal desde el punto de vista de la seguridad. LoadBalancer por servicio es costoso. Suponiendo que puedo enrutar correctamente al host, ¿qué servicio de Kubernetes debería usar para hacer que los usuarios puedan conectarse públicamente, particularmente cuando se activan y desactivan dinámicamente?