如何在 Google Cloud Run 上使用自定义 DNS 服务器?

如何在 Google Cloud Run 上使用自定义 DNS 服务器?

我有一项 Cloud Run 全托管服务,该服务使用连接器连接到共享 VPC。此共享 VPC 由另一个 GCP 项目和另一个团队管理,但我可以将实例部署到此 VPC。此 VPC 具有自定义 DNS 服务器,可解析该团队的内部资源。DHCP 不会将自定义 DNS 服务器传播给 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')。

如何解决这个问题?据我所知,我要么只使用自定义 DNS 服务器,要么“合并”来自自定义 DNS 服务器和标准服务器的信息169.254.169.254。在这种情况下我该怎么办?有哪些可能的解决方案?

答案1

Google 支持建议的解决方案选项如下:

在 Cloud Run 端处理的问题在于我们无法覆盖,resolv.conf因为网络内容是由 Docker 设置的。我们有两种选择可以做到这一点:

  1. 出站转发区域:https://cloud.google.com/dns/docs/zones#creating-forwarding-zones
  2. 出站服务器策略:https://cloud.google.com/dns/docs/policies#create-out

通过实施转发区域,您可以指示云 DNS 哪些域名的请求应转到特定的 DNS 服务器。如果您没有太多由自定义 DNS 服务器提供服务的内部区域名称,这是一个不错的选择。

通过实施出站策略,您可以更改解析顺序,并且可以强制首先将解析请求发送到自定义服务器。一旦请求到达 VPC 连接器,它应该转到元数据服务器,并且它应该知道如何使用出站服务器策略。

答案2

您可以在代码中执行自己的 DNS 客户端并将查询发送到您选择的服务器,而不是依赖系统配置的服务器。

例如,在 python 中,为了查询 dns 服务器 1.1.1.1 以获取“tut.by”资源的 A 记录(ip 地址),我会这样做(configure=False为了防止使用系统范围的值配置解析器):

>>> 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

希望能帮助到你。

相关内容