
我有一個 Cloud Run 完全託管服務,它使用連接器連接到共用 VPC。此共用 VPC 由另一個 GCP 專案和另一個團隊管理,但我可以將執行個體部署到此 VPC。此 VPC 具有解析該團隊內部資源的自訂 DNS 伺服器。自訂 DNS 伺服器不會透過 DHCP 傳播給 VPC 使用者。我可以透過 Cloud Run 容器中的 IP 存取所有內部資源,但如果不使用自訂 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#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
希望能幫助你。