如何在 Google Cloud Run 上使用自訂 DNS 伺服器?

如何在 Google Cloud Run 上使用自訂 DNS 伺服器?

我有一個 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 設定的。我們有兩種選擇來做到這一點:

  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

希望能幫助你。

相關內容