Docker

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

  • March 4, 2021

我有一個使用連接器連接到共享 VPC 的 Cloud Run 完全託管服務。此共享 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。在這種情況下我該怎麼辦?有哪些可能的解決方案?

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 連接器,它應該轉到元數據伺服器,並且它應該知道如何使用出站伺服器策略。

引用自:https://serverfault.com/questions/1046588