
Tenho um serviço totalmente gerenciado do Cloud Run que se conecta a uma VPC compartilhada usando um conector. Essa VPC compartilhada é gerenciada por outro projeto do GCP e outra equipe, mas posso implantar instâncias nessa VPC. Essa VPC possui servidores DNS personalizados que resolvem os recursos internos dessa equipe. Os servidores DNS personalizados não são propagados pelo DHCP para os usuários da VPC. Tenho acesso a todos os recursos internos por IP do contêiner do Cloud Run, mas não consigo acessá-los por nome sem usar servidores DNS personalizados.
O problema é que não consigo propagar esses servidores para o container sem receber alguns erros.
Fiz o seguinte script de ponto de entrada em meu contêiner:
#!/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 "$@"
Isso leva ao seguinte conteúdo de arquivo no contêiner em execução:
nameserver 10.80.64.21
nameserver 10.80.64.20
nameserver 10.80.64.19
search google.internal.
nameserver 169.254.169.254
(Linhas personalizadas adicionadas após o que meu script escreve)
Às vezes, o último servidor NS é usado e recebo erros ao conectar recursos VPC compartilhados por nome (como Failed to resolve 'some-name'
).
Como resolver este problema? AFAIK, preciso usar apenas servidores DNS personalizados ou "mesclar" informações deles e do servidor padrão 169.254.169.254
. Como devo fazer neste caso? Quais são as soluções possíveis?
Responder1
As opções de solução foram sugeridas pelo suporte do Google:
O problema com o manuseio no lado do Cloud Run é que não podemos sobrescrever, resolv.conf
pois o material de rede está sendo configurado pelo Docker. Temos duas opções para fazer isso:
- Zona de encaminhamento de saída:https://cloud.google.com/dns/docs/zones#creating-forwarding-zones
- Política de servidor de saída:https://cloud.google.com/dns/docs/policies#create-out
Ao implementar uma zona de encaminhamento, você instrui o DNS da nuvem a solicitar quais nomes de domínio devem ir para um servidor DNS específico. Boa opção se você não tiver tantos nomes de zonas internas atendidas por servidores DNS personalizados.
Ao implementar uma política de saída, você altera a ordem de resolução e pode forçar o envio de solicitações de resolução primeiro para servidores personalizados. Assim que a solicitação chegar ao conector VPC, ela deverá ir para o servidor de metadados e saber como usar a política do servidor de saída.
Responder2
Você poderia fazer seu próprio cliente DNS no código e enviar consultas para os servidores de sua escolha em vez de depender dos servidores configurados pelo sistema.
Por exemplo, em python, para consultar o servidor DNS 1.1.1.1 em busca de registros A (endereços IP) do recurso 'tut.by', eu faria ( configure=False
para evitar que o Resolver seja configurado com valores de todo o 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 que ajude.