Как использовать пользовательские DNS-серверы в Google Cloud Run?

Как использовать пользовательские DNS-серверы в Google Cloud Run?

У меня есть полностью управляемая служба 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. У нас есть два варианта сделать это:

  1. Зона исходящей переадресации:https://cloud.google.com/dns/docs/zones#создание-зон-переадресации
  2. Политика исходящего сервера: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

Надеюсь, поможет.

Связанный контент