我有一项 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 设置的。我们有两种选择可以做到这一点:
- 出站转发区域:https://cloud.google.com/dns/docs/zones#creating-forwarding-zones
- 出站服务器策略: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
希望能帮助到你。