Actualmente estoy trabajando en un pequeño proyecto de pasatiempo que haré de código abierto una vez que esté listo. Este servicio se ejecuta en Google Container Engine. Elegí GCE para evitar problemas de configuración, los costos son asequibles y aprender cosas nuevas.
Mis pods están funcionando bien y creé un servicio con tipo LoadBalancer
para exponer el servicio en los puertos 80 y 443. Esto funciona perfectamente.
Sin embargo, descubrí que para cada LoadBalancer
servicio, se crea un nuevo equilibrador de carga de Google Compute Engine. Este equilibrador de carga es bastante costoso y realmente ha terminado para un proyecto de hobby en una sola instancia.
Para reducir los costos, estoy buscando una manera de exponer los puertos sin el equilibrador de carga.
Lo que he probado hasta ahora:
Implementar un
NodePort
servicio. Desafortunadamente, no está permitido exponer un puerto por debajo de 30000.Implemente un Ingress pero esto también crea un equilibrador de carga.
Intenté deshabilitar
HttpLoadBalancing
( https://cloud.google.com/container-engine/reference/rest/v1/projects.zones.clusters#HttpLoadBalancing ) pero aún crea un equilibrador de carga.
¿Hay alguna manera de exponer los puertos 80 y 443 para una sola instancia en Google Container Engine sin un equilibrador de carga?
fuente
externalIp
Además de la excelente y funcional solución de ConnorJC: La misma solución también se describe en esta pregunta: Kubernetes : ¿puedo evitar usar el equilibrador de carga GCE para reducir los costos?
El "internalIp" se refiere a la ip interna de la instancia de cómputo (también conocida como el nodo) (como se ve en Google Cloud Platform -> Google Compute Engine -> VM Instances)
Este comentario da una pista de por qué se debe configurar la IP interna y no la externa.
Además, después de haber configurado el servicio para los puertos 80 y 443, tuve que crear una regla de firewall que permitiera el tráfico a mi nodo de instancia:
Después de esta configuración, podría acceder a mi servicio a través de http (s): // externalIp
fuente
Si solo tiene exactamente un pod, puede usarlo
hostNetwork: true
para lograr esto:Tenga en cuenta que al hacer esto, su pod heredará la resolución DNS del host y no la de Kubernetes. Eso significa que ya no puede resolver los servicios de clúster por nombre DNS. Por ejemplo, en el ejemplo anterior no puede acceder al
static
servicio en http: // static . Todavía puede acceder a los servicios por su IP de clúster, que son inyectadas por variables de entorno .Esta solución es mejor que usar el IP externo del servicio, ya que omite el proxy kube, y recibirá la IP de origen correcta.
fuente
Para sintetizar las respuestas de @ConnorJC @ derMikey en lo que funcionó exactamente para mí:
Dado un grupo de clústeres que se ejecuta en la instancia de Compute Engine :
Hice el servicio:
y luego abrió el firewall para todos los (?) ips en el proyecto:
y luego
my-app
fue accesible a través de la IP pública de la instancia de GCE34.56.7.001
(no la IP del clúster)fuente
Prefiero no usar los equilibradores de carga en la nube, hasta que sea necesario, debido al costo y al bloqueo del proveedor.
En cambio, uso esto: https://kubernetes.github.io/ingress-nginx/deploy/
Es un pod que ejecuta un equilibrador de carga para usted. Esa página tiene notas de instalación específicas de GKE.
fuente