Saltar al contenido

Red privada ​

Los servicios de un mismo proyecto se comunican por nombre de host privado:

<hostname>.zenavo.internal

Por ejemplo, una API se conecta a postgresql.zenavo.internal:5432. El nombre de host de un servicio nuevo sale de su nombre (My API → my-api, un segundo PostgreSQL → postgresql-2); cámbialo en los Settings del servicio, en Private hostname. El host se muestra en la pestaña Networking del servicio, en Private. El tráfico no sale del servidor; los proyectos no pueden llegar a los servicios de otros proyectos.

Resolución de nombres ​

Los hosts privados son nombres DNS reales en el resolvedor del servidor, así que funcionan en todas partes: el resolvedor del sistema, dig y nslookup, y los programas que consultan el DNS por su cuenta, como el resolver de nginx con un proxy_pass variable, o los clientes de Go y Node con su propio resolvedor. Indica a nginx el servidor de nombres del /etc/resolv.conf del contenedor:

nginx
resolver 10.43.0.10 valid=10s;   # la línea nameserver de /etc/resolv.conf
set $api api.zenavo.internal;
location / { proxy_pass http://$api:8080; }

Un nombre solo resuelve a un servicio del propio proyecto del servicio que pregunta: api.zenavo.internal es un servicio distinto en cada proyecto, y un nombre que no tiene ningún servicio de tu proyecto no devuelve dirección. El ID del servicio también sirve como nombre (svc-k3j9x2ab.zenavo.internal). El /etc/hosts de cada contenedor también lista los hosts privados del proyecto, como respaldo.

La respuesta es un CNAME al nombre del servicio en el clúster (api.<project namespace>.svc.cluster.local) seguido de su dirección; configura el nombre zenavo.internal, porque el nombre del clúster es un detalle interno que puede cambiar.

En un servidor recién conectado, el DNS privado empieza a funcionar uno o dos minutos después del primer despliegue; /etc/hosts cubre ese intervalo.

Cambiar un nombre de host ​

Un nombre de host nuevo se aplica en el siguiente despliegue del servicio, y el anterior deja de resolver entonces. Las variables que usan ${CONTAINER_HOSTNAME} (como las variables compartidas de los servicios de base de datos) siguen el cambio; lo que tenga la dirección anterior escrita a mano, como una cadena de conexión que escribiste tú, hay que actualizarlo.

ID de servicio ​

Cada servicio tiene además un ID aleatorio y permanente, como svc-k3j9x2ab, que se muestra bajo su nombre y en sus Settings. Los volúmenes, los registros y las rutas de la API lo usan, así que cambiar el nombre de un servicio o su nombre de host no mueve ningún dato.

Los volúmenes de un servicio eliminado se quedan en el servidor hasta que se elimina el proyecto, así que su ID nunca se asigna a otro servicio.

Los servicios creados antes de que existieran los nombres de host tienen un ID formado a partir de su nombre (postgresql), que también es su nombre de host hasta que elijas otro.

Puertos ​

Expose Port en Private añade un puerto en el que escucha el servicio. Cada puerto tiene:

  • un nombre, como web, que se usa en variables integradas como WEB_PORT;
  • un número, el puerto dentro del contenedor;
  • un tipo: HTTP (puede tener un dominio), TCP o UDP (se puede publicar).

Los cambios de puertos y dominios se aplican enseguida: Zenavo los guarda y vuelve a desplegar el proyecto.

Sin relación con Zeabur.