es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué tengo que editar /etc/hosts solo a veces cuando uso el controlador nginx-ingress y los recursos en mi entorno k8s local?

No estoy seguro si esto es específico del sistema operativo, pero en mi Mac M1, estoy instalando el controlador de Nginx y el ejemplo de recurso que se encuentra en la Guía de inicio rápido oficial del controlador para Docker Desktop para Mac. Las instrucciones son las siguientes:

// Crear el Ingress
helm upgrade –install ingress-nginx ingress-nginx \
–repo https://kubernetes.github.io/ingress-nginx \
–namespace ingress-nginx –create-namespace

// Verificar antes de continuar
kubectl get pods –namespace=ingress-nginx

kubectl wait –namespace ingress-nginx \
–for=condition=ready pod \
–selector=app.kubernetes.io/component=controller \
–timeout=120s

// Y finalmente, implementar y probar el recurso.
kubectl create deployment demo –image=httpd –port=80
kubectl expose deployment demo

kubectl create ingress demo-localhost –class=nginx \
–rule=demo.localdev.me/*=demo:80

kubectl port-forward –namespace=ingress-nginx service/ingress-nginx-controller 8080:80

Me di cuenta de que las instrucciones no mencionaban la necesidad de editar el archivo /etc/hosts, lo cual me pareció extraño. Y cuando lo probé ingresando demo.localdev.me:8080 en el navegador, ¡funcionó como se esperaba!

Pero, ¿por qué? ¿Qué sucedió para que una aplicación dentro de un contenedor de Docker pudiera afectar el comportamiento de mi máquina host e interceptar el tráfico web sin tener que editar el archivo /etc/hosts?

Para mi siguiente prueba, volví a ejecutar todo lo anterior con el único cambio de cambiar demo por demo2. Eso no funcionó. Tuve que ir a /etc/hosts y agregar demo2.localdev.me 127.0.0.1 como entrada. Después de eso, tanto demo como demo2 funcionaron como se esperaba.

¿Por qué está sucediendo esto? No tener que editar el archivo /etc/hosts es atractivo. ¿Hay alguna forma de configurarlo para que todos funcionen? ¿Cómo podría desactivarlo de forma automática si necesito dirigir el tráfico de vuelta a internet en lugar de a mi máquina local?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    La razón por la que la aplicación dentro del contenedor de Docker pudo interceptar el tráfico web sin necesidad de modificar el archivo /etc/hosts es porque el controlador de Ingress crea un nombre DNS para el recurso de Ingress basado en su regla. En este caso, se utilizó la regla demo.localdev.me/* para crear un nombre DNS para el despliegue de demo. Cuando accediste a demo.localdev.me:8080 en el navegador, tu computadora resolvió ese nombre DNS a la dirección IP del controlador de Ingress, que estaba configurado para redirigir el tráfico al despliegue de demo.

    Sin embargo, cuando cambiaste demo a demo2, el controlador de Ingress creó un nuevo nombre DNS para el recurso de Ingress basado en su regla, que no coincidía con el nombre DNS al que el navegador intentaba acceder. Como resultado, necesitaste agregar el nuevo nombre DNS a tu archivo /etc/hosts para que tu computadora pudiera resolverlo a la dirección IP del controlador de Ingress.

    Si quieres evitar modificar el archivo /etc/hosts, puedes utilizar un servidor DNS local o configurar tu enrutador para resolver los nombres DNS a la dirección IP del controlador de Ingress. Alternativamente, puedes utilizar un nombre DNS comodín como *.localdev.me en tus reglas de Ingress, lo cual creará un nombre DNS para cada despliegue que coincida con el patrón *.localdev.me. Esto te permitirá acceder a todos los despliegues sin tener que modificar el archivo /etc/hosts.

    Para desactivar la creación automática de nombres DNS, puedes eliminar el recurso de Ingress y las reglas asociadas. Esto evitará que el controlador de Ingress intercepte el tráfico web y lo redirija a los despliegues.

Comments are closed.