
Tengo un servicio totalmente administrado de Cloud Run que se conecta a una VPC compartida mediante un conector. Esta VPC compartida la administra otro proyecto de GCP y otro equipo, pero puedo implementar instancias en esta VPC. Esta VPC tiene servidores DNS personalizados que resuelven los recursos internos de ese equipo. DHCP no propaga los servidores DNS personalizados a los usuarios de VPC. Tengo acceso a todos los recursos internos por IP desde el contenedor de Cloud Run, pero no puedo acceder a ellos por nombre sin usar servidores DNS personalizados.
El problema es que no puedo propagar estos servidores al contenedor sin recibir algunos errores.
Hice el siguiente script de punto de entrada en mi contenedor:
#!/usr/bin/env sh
set -e
{
echo "nameserver 10.80.64.19";
echo "nameserver 10.80.64.20";
echo "nameserver 10.80.64.21";
} >> /etc/resolv.conf
exec "$@"
Esto lleva al siguiente contenido de archivo en el contenedor en ejecución:
nameserver 10.80.64.21
nameserver 10.80.64.20
nameserver 10.80.64.19
search google.internal.
nameserver 169.254.169.254
(Se agregaron líneas personalizadas después de lo que escribe mi script)
A veces se utiliza el último servidor NS y aparecen errores al conectar recursos VPC compartidos por nombre (como Failed to resolve 'some-name'
).
¿Cómo solucionar este problema? AFAIK, necesito usar solo servidores DNS personalizados o "combinar" información de ellos y del servidor estándar 169.254.169.254
. ¿Cómo debo hacer en este caso? ¿Cuáles son las posibles soluciones?
Respuesta1
Las opciones de solución fueron sugeridas por el soporte de Google:
El problema con el manejo en el lado de Cloud Run es que no podemos sobrescribirlo, resolv.conf
ya que Docker está configurando las cosas de red. Tenemos dos opciones para hacer esto:
- Zona de reenvío saliente:https://cloud.google.com/dns/docs/zones#creating-forwarding-zones
- Política del servidor saliente:https://cloud.google.com/dns/docs/policies#create-out
Al implementar una zona de reenvío, le indica al DNS de la nube que solicite qué nombres de dominio deben ir a un servidor DNS específico. Buena opción si no tiene tantos nombres de zonas internas atendidos por servidores DNS personalizados.
Al implementar una política de salida, cambia el orden de resolución y puede forzar el envío de solicitudes de resolución a servidores personalizados primero. Una vez que la solicitud llega al conector VPC, debe ir al servidor de metadatos y debe saber cómo utilizar la política del servidor de salida.
Respuesta2
Puede crear su propio cliente DNS en el código y enviar consultas a los servidores que elija en lugar de depender de los servidores configurados por el sistema.
Por ejemplo, en Python para consultar el servidor dns 1.1.1.1 para registros A (direcciones IP) del recurso 'tut.by', lo que haría ( configure=False
para evitar que el Resolver se configure con valores para todo el sistema):
>>> import dns.resolver
>>> resolver = dns.resolver.Resolver(configure=False)
>>> resolver.nameservers.append('1.1.1.1')
>>> response = resolver.resolve('tut.by')
>>> for ip in response:
... print(ip)
...
178.172.160.4
178.172.160.5
178.172.160.3
178.172.160.2
Espero eso ayude.