
У меня есть полностью управляемая служба Cloud Run, которая подключается к общему VPC с помощью коннектора. Этот общий VPC управляется другим проектом GCP и другой командой, но я могу развертывать экземпляры в этом VPC. У этого VPC есть настраиваемые DNS-серверы, которые разрешают внутренние ресурсы этой команды. Настраиваемые DNS-серверы не распространяются DHCP среди пользователей VPC. У меня есть доступ ко всем внутренним ресурсам по IP из контейнера Cloud Run, но я не могу получить к ним доступ по имени без использования настраиваемых DNS-серверов.
Проблема в том, что я не могу распространить эти серверы на контейнер, не получив при этом некоторых ошибок.
Я создал следующий скрипт точки входа в своем контейнере:
#!/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 "$@"
Это приводит к следующему содержимому файла в работающем контейнере:
nameserver 10.80.64.21
nameserver 10.80.64.20
nameserver 10.80.64.19
search google.internal.
nameserver 169.254.169.254
(Пользовательские строки добавлены после того, что пишет мой скрипт)
Иногда используется последний NS-сервер, и я получаю ошибки при подключении общих ресурсов VPC по имени (например Failed to resolve 'some-name'
, ).
Как решить эту проблему? AFAIK, мне нужно либо использовать только пользовательские DNS-серверы, либо "объединить" информацию с них и со стандартного сервера 169.254.169.254
. Как мне поступить в этом случае? Какие возможны решения?
решение1
Варианты решения, предложенные службой поддержки Google:
Проблема с обработкой на стороне Cloud Run заключается в том, что мы не можем перезаписать, resolv.conf
так как сетевые настройки настраиваются Docker. У нас есть два варианта сделать это:
- Зона исходящей переадресации:https://cloud.google.com/dns/docs/zones#создание-зон-переадресации
- Политика исходящего сервера:https://cloud.google.com/dns/docs/policies#create-out
Реализуя зону пересылки, вы указываете облачному DNS, что запросы на доменные имена должны отправляться на определенный DNS-сервер. Хороший вариант, если у вас не так много внутренних зон, имен, обслуживаемых пользовательскими DNS-серверами.
Внедряя политику исходящего трафика, вы меняете порядок разрешения и можете принудительно отправлять запросы разрешения сначала на пользовательские серверы. Как только запрос достигает коннектора VPC, он должен перейти на сервер метаданных, и он должен знать, как использовать политику исходящего сервера.
решение2
Вы можете создать собственный DNS-клиент в коде и отправлять запросы на серверы по вашему выбору, вместо того чтобы полагаться на серверы, настроенные системой.
Например, в Python для запроса записей A (IP-адресов) ресурса «tut.by» на DNS-сервере 1.1.1.1 я бы сделал следующее ( configure=False
чтобы предотвратить настройку Resolver с использованием общесистемных значений):
>>> 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
Надеюсь, поможет.