內部 DNS

GCP 上的虛擬私人雲端網路具有內部 DNS 服務,允許同網路中的執行個體使用內部 DNS 名稱互相存取。虛擬機器 (VM) 執行個體的內部 A 記錄建立在 .internal 的 DNS 區域中。VM 的 PTR 記錄則建立在對應的反解區域中。在管理 VM 執行個體時,GCP 會自動建立、更新和移除這些 DNS 記錄。

舉例來說,如果將一個 VM 刪除,GCP 就會自動移除其 .internal DNS 名稱的關聯 A 和 PTR 記錄。如果用相同名稱建立一個新的 VM,GCP 則會為此替換項目建立新的記錄。

內部 DNS 相關資訊

內部 DNS 名稱有以下規範:

  • VM 執行個體的內部 DNS 名稱僅會解析為其主要內部 IP 位址。內部 DNS 名稱不能用來連線至執行個體的外部 IP 位址。

  • 內部 DNS 名稱無法設定成解析為次要的別名 IP

  • 內部 DNS 名稱僅能從相同專案內的其他 VM 解析,且此 VM 須使用相同的虛擬私人雲端或舊版網路。其他網路中的執行個體即使位於同個專案中,也無法使用內部 DNS 加以聯絡。

PTR 記錄和內部 DNS

GCP 內部 DNS 會在下列反解區域中為 VM 自動建立 PTR 記錄:

  • 10.in-addr.arpa.
  • 168.192.in-addr.arpa.
  • 16.172.in-addr.arpa.17.172.in-addr.arpa.、... 到 31.172.in-addr.arpa.

內部 DNS 和 Cloud DNS

內部 DNS 與 Cloud DNS 是不同的服務。 內部 DNS名稱是由 GCP 自動建立。如果需要為 VM 建立自訂 DNS 名稱,您可以使用 Cloud DNS 不公開區域

如果您需要建立自訂 PTR 記錄以覆寫自動建立的內部 DNS PTR 記錄,請參閱 Cloud DNS 說明文件中的使用不公開區域中的 PTR 記錄

自訂主機名稱

您可以在建立 VM 時指定 VM 的自訂主機名稱。以這種方式指定的自訂主機名稱無法由內部 DNS 解析。若使用自訂主機名稱,您仍須在適當的區域建立對應的 DNS 記錄 (例如使用 Cloud DNS)。詳情請參閱使用自訂主機名稱建立 VM 執行個體一文。

內部 DNS 名稱的類型

GCP 有兩種類型的內部 DNS 名稱。預設的內部 DNS 類型是依據 Compute Engine API 的啟用時間而定。

內部 DNS 類型 完整網域名稱 (FQDN) 專案預設類型
區域 DNS [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal 在 2018 年 9 月 6 日之後啟用 Compute Engine API 的所有機構或獨立專案均會預設為此類型。
全域 (全專案) DNS [INSTANCE_NAME].c.[PROJECT_ID].internal 在 2018 年 9 月 6 日之前啟用 Compute Engine API 的所有機構或獨立專案均會預設為此類型。

其中:

  • [INSTANCE_NAME] 是執行個體的名稱。
  • [ZONE] 是您執行個體的所在區域。
  • [PROJECT_ID] 是執行個體所屬的專案。

您可以在專案或執行個體層級,控制要使用何種類型的內部 DNS 名稱。請參閱設定專案或執行個體的 DNS 名稱一文。

內部 DNS 名稱與共用虛擬私人雲端

即使 VM 的內部 IP 位址位於主專案中的共用虛擬私人雲端網路,也可以使用內部 DNS 名稱來參照此 IP 位址。透過共用的虛擬私人雲端,區域或全域 (全專案) 內部 DNS 名稱中專案 ID 的部分會是服務專案的 ID。

判斷 VM 的內部 DNS 名稱

可使用以下步驟來讀取指派給 VM 的 內部 DNS 名稱。內部 DNS 名稱的可靠來源是其中繼資料伺服器

  1. 連線至執行個體
  2. 檢視執行個體中繼資料的主機名稱:

    curl "http://metadata.google.internal/computeMetadata/v1/instance/hostname" \
    -H "Metadata-Flavor: Google"
    

主機名稱的格式代表了 VM 所使用的內部 DNS 名稱類型

透過內部 DNS 存取 VM

中繼資料伺服器同時也具有名稱伺服器解析器的功能,可以用來解析 VM 所發出的 DNS 查詢。中繼資料伺服器會將所有的 DNS 查詢解析為內部 DNS 名稱和外部 DNS 名稱。對於外部 DNS 查詢,中繼資料伺服器會將查詢傳送到 Google 的公開名稱伺服器。

下列範例使用 ping 來聯絡使用區域 DNS 的執行個體。如要使用這個方式,您必須先建立允許執行個體接收 ICMP 流量的防火牆規則

$ ping [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal -c 1

PING [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal (10.240.0.17) 56(84) bytes of data.
64 bytes from [INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal (10.240.0.17): icmp_seq=1 ttl=64 time=0.136 ms

其中:

  • [INSTANCE_NAME] 是執行個體的名稱。
  • [ZONE] 是執行個體所在的區域。
  • [PROJECT_ID] 是執行個體所屬的專案。

內部 DNS 和 resolv.conf

大多數 Linux 發行版都會預設在 resolv.conf 中儲存 DHCP 資訊。Compute Engine 執行個體是設定為每 24 小時更新 DHCP 租約。對於啟用區域 DNS 的執行個體,DHCP 租約則每小時到期一次。DHCP 更新會覆寫此檔案,撤銷任何您已完成的變更。使用 區域 DNS 的執行個體在 resolv.conf 檔案中同時擁有區域和全域項目。

區域 DNS

區域 resolv.conf 範例檔案:

# Local domain name. Computed from your project name.
domain [ZONE].c.[PROJECT_ID].internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
search [ZONE].c.[PROJECT_ID].internal. c.[PROJECT_ID].internal. google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254

其中:

  • [ZONE] 是您執行個體的所在區域。
  • [PROJECT_ID] 是執行個體所屬的專案。

區域 dhcp.lease 範例檔案:

lease {
  # What interface we are using for the network
  interface "eth0";
  fixed-address 10.128.0.9;
  option subnet-mask 255.255.255.255;
  option routers 10.128.0.1;
  # Lease timeout, older VM instances will have this value set to infinite.
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 169.254.169.254;
  option dhcp-server-identifier 169.254.169.254;
  option interface-mtu 1460;
  # Search path options that are copied into the resolv.conf
  option domain-search "[ZONE].c.[PROJECT_ID].internal.", "c.[PROJECT_ID].internal.", "google.internal.";
  option ntp-servers 169.254.169.254;
  option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
  option host-name "[INSTANCE_NAME].[ZONE].c.[PROJECT_ID].internal";
  option domain-name "[ZONE].c.[PROJECT_ID].internal";
  renew 4 2017/11/16 02:15:52;
  rebind 4 2017/11/16 02:43:59;
  expire 4 2017/11/16 02:51:29;
}

其中:

  • [INSTANCE_NAME] 是執行個體的名稱。
  • [ZONE] 是您執行個體的所在區域。
  • [PROJECT_ID] 是執行個體所屬的專案。

全球 DNS

全域 resolv.conf 範例檔案:

# Local domain name. Computed from your project name.
domain c.[PROJECT_ID].internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
search c.[PROJECT_ID].internal google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254

其中 [PROJECT_ID] 是執行個體所屬的專案。

全域 dhcp.lease 範例檔案:

lease {
  # What interface we are using for the network
  interface "eth0";
  fixed-address 10.128.0.8;
  option subnet-mask 255.255.255.255;
  option routers 10.128.0.1;
  # Lease timeout, older VM instances will have this value set to infinite.
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 169.254.169.254;
  option dhcp-server-identifier 169.254.169.254;
  option interface-mtu 1460;
  # Search path options that are copied into the resolv.conf
  option domain-search "c.[PROJECT_ID].internal.", "google.internal.";
  option ntp-servers 169.254.169.254;
  option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
  option host-name "[INSTANCE_NAME].c.[PROJECT_ID].internal";
  option domain-name "c.[PROJECT_ID].internal";
  renew 4 2017/11/16 12:07:00;
  rebind 4 2017/11/16 22:44:53;
  expire 5 2017/11/17 01:44:53;
}

其中:

  • [INSTANCE_NAME] 是執行個體的名稱。
  • [PROJECT_ID] 是執行個體所屬的專案。

這些檔案的限制如下:

  • 搜尋路徑只能處理 6 個記錄,其中 3 個由 Compute Engine 提供。如果您向搜尋路徑新增項目使項目總數大於 6,則作業系統將不會套用第 6 個項目之後的搜索規則。這可能導致 Compute Engine 功能停止運作,例如透過執行個體名稱來存取執行個體。
  • 手動編輯 resolv.conf 將導致執行個體在每 24 小時 DHCP 租約到期時,都會恢復為預設 DHCP。對於使用區域 DNS 的執行個體,DHCP 租約則每小時到期一次。如要修改 resolv.conf 檔案,有數個 Linux 發行版允許將項目新增或附加到 DHCP 政策中。

Debian 9

/etc/dhcp/dhclient.conf 範例檔案:

# Configuration file for /sbin/dhclient.
#
...
append domain-search "mydomain.com";
prepend domain-name-servers 172.16.1.1;

其中 mydomain.com 是新的搜尋網域,而 172.16.1.1 是 DNS 伺服器的 IP。

區域 DNS 名稱

區域 DNS 名稱包括執行個體的名稱、執行個體所在的區域以及擁有該執行個體的專案。全域 DNS 名稱不包括執行個體所在的區域。位置中的區域 DNS 名稱功能獨立於其他位置,讓您構建具有更好可用性特徵的優質多地區容錯應用程式。

現有專案和機構可以繼續使用全域 DNS 名稱,但建議遷移至區域 DNS 名稱

設定專案或執行個體的 DNS 名稱

透過在專案或執行個體中繼資料設定 VmDnsSetting 變數,即可在執行個體上啟用區域 DNS 和/或全域 DNS 搜尋路徑。如果您在特定執行個體的中繼資料上設定 VmDnsSetting 變數,它將複寫從該執行個體專案中繼資料繼承的任何 VmDnsSetting 變數。

  • 設定 VmDnsSetting=ZonalOnly 以讓您的執行個體只能通過其區域 DNS 名稱進行尋址。執行個體仍保留區域和全域搜尋路徑,但其全域 DNS 名稱則停止運作。其他執行個體可以僅使用其區域 DNS 名稱來處理具有此設置的執行個體,並且無法使用其全域 DNS 名稱或搜尋路徑來處理這些執行個體。只要您的應用程式可以支持,這就是優先選項。對於在 2018 年 9 月 6 日之後啟用 Compute Engine API 的獨立專案或是機構所建的專案,這是執行個體的預設設定。請注意,如果專案遷移至機構,並不會變更專案的預設 DNS 名稱。
  • 設定 VmDnsSetting=ZonalPreferred 以啟用區域 DNS 搜尋路徑,同時仍保留全域 DNS 名稱。具有此設定的執行個體可以使用區域或全域 DNS 名稱互相尋址,並可以繼續應對僅有全域 DNS 名稱設定的執行個體。
  • 設定 VmDnsSetting=GlobalOnly 以讓執行個體僅使用全域名稱做為網域名稱和搜尋路徑項目。使用此值可從全專案範圍中排除區域 DNS 設定的執行個體,或將執行個體還原為僅使用全域 DNS 名稱。對於在 2018 年 9 月 6 日之前啟用 Compute Engine API 的獨立專案或是機構所建的專案,這是執行個體的預設設定。請注意,如果專案遷移至機構,並不會變更專案的預設 DNS 名稱。

請參閱設定自訂中繼資料,瞭解如何設定專案中繼資料或執行個體中繼資料值。

為執行個體設定 VmDnsSetting 變數後,請更新執行個體上的 DHCP 租約。您可以透過重新啟動執行個體,等待租約到期或執行以下其中一個指令來更新租約:

  • Linux 執行個體:sudo dhclient -v -r
  • Windows Server 執行個體:ipconfig /renew

將現有應用程式遷移至區域 DNS 名稱

雖然現有專案可繼續使用全域 DNS 名稱,但建議您將現有執行個體和應用程式遷移至使用區域 DNS 名稱,以獲得區域 DNS 系統的好處。一般來說,您可以採取下列遷移程序:

  1. 檢查並更新您的應用程式以解決對於僅限區域設定的相容性問題:
    • 根據執行個體名稱或全域完整網域名稱尋址的應用程式:執行個體名稱和全域執行個體名稱不一定能在僅限區域的環境中解析。使用區域完整網域名稱為最佳做法來更新這些名稱。
    • 假定特定全域完整網域名稱格式的應用程式:假設網域名稱格式通常代表應用程式設計中的基本問題。Google 建議您將應用程式設計為獨立於網域名稱格式運行。
    • 不預期更改網域名稱的應用程式:某些應用程式可能不會預期更改網域名稱,並且需要完全重新啟動才能獲取新名稱。如果可行,請更新您的應用程式以識別和處理執行個體網域名稱中的變更內容。
  2. 在內部虛擬私人雲端網路上將執行個體設為使用 VmDnsSetting=ZonalPreferred 設定,該設定使用全域和區域 DNS 名稱。此過渡階段允許執行個體繼續使用全域名稱,直到您的應用程式準備好僅使用區域名稱:
    1. 設定自訂中繼資料的值,以此方式在執行個體上啟用 VmDnsSetting=ZonalPreferred
    2. 更新該執行個體上的 DHCP 租約,讓它開始使用區域 DNS 名稱:
      • Linux 執行個體:sudo dhclient -v -r
      • Windows Server 執行個體:ipconfig /renew
    3. 測試該執行個體上的應用程式以確定會如預期般運行。某些應用程式可能不會預期更改網域名稱,並且需要完全重新啟動才能獲取新名稱。
    4. 重複此程序以啟用 VmDnsSetting=ZonalPreferred 並更新虛擬私人雲端網路中其他執行個體上的 DHCP 租約,直到它們如預期般僅使用區域 DNS 名稱為止。此外,您可以在專案中繼資料中設定 VmDnsSetting=ZonalPreferred,以將專案中的每個執行個體設為使用區域 DNS 名稱。
  3. 在應用程式僅使用帶有 VmDnsSetting=ZonalPreferred 設定的區域網域名稱且正常執行後,您可以在該虛擬私人雲端網路上停用全域名稱。請在內部虛擬私人雲端網路上將執行個體設為使用 VmDnsSetting=ZonalOnly 設定,該設定僅會使用區域 DNS 名稱。
    1. 設定自訂中繼資料的值,以此方式在執行個體上啟用 VmDnsSetting=ZonalOnly
    2. 更新該執行個體上的 DHCP 租約,讓它開始使用區域 DNS 名稱:
      • Linux 執行個體:sudo dhclient -v -r
      • Windows Server 執行個體:ipconfig /renew
    3. 測試該執行個體上的應用程式以確保它們如預期般運行。
    4. 重複此程序以啟用 VmDnsSetting=ZonalOnly 並更新虛擬私人雲端網路中其他執行個體上的 DHCP 租約,直到它們如預期般僅使用區域 DNS 名稱為止。
  4. 在每個虛擬私人雲端網路上重複此程序,直到專案中的所有執行個體都使用 VmDnsSetting=ZonalOnly 設定為止。您可以在專案層級的中繼資料內設定 VmDnsSetting=ZonalOnly,如此會自動套用至您在該專案中建立的任何執行個體。此外,您可以在專案中繼資料中設定 VmDnsSetting=ZonalOnly,以將專案中的每個執行個體設為使用區域 DNS 名稱。

在專案或執行個體上停用區域 DNS

如要在特定執行個體上停用區域 DNS,請在該執行個體的中繼資料中設定 VmDnsSetting=GlobalOnly 即可。如要在專案中停用區域 DNS,請在專案中繼資料中設定 VmDnsSetting=GlobalOnly,並確保沒有任何執行個體個別使用 VmDnsSetting 值。請參閱設定自訂中繼資料,瞭解如何設定專案中繼資料或執行個體中繼資料值。

如果您需要強制立即刷新 DHCP 租約,可以使用下列其中一項指令:

  • 容器最佳化 OS (Google Kubernetes Engine):sudo systemctl restart systemd-networkd
  • Debian/Google App Engine 彈性環境執行個體:sudo dhclient -r -v eth0 && sudo rm /var/lib/dhcp/dhclient.* ; sudo dhclient -v eth0
  • Ubuntu 15.04 及以上版本:sudo dhclient -r -v ens4 && sudo rm /var/lib/dhcp/dhclient.* ; sudo dhclient -v ens4
  • Ubuntu 15.04 及以下版本:sudo dhclient -r -v eth0 && sudo rm /var/lib/dhcp/dhclient.* ; sudo dhclient -v eth0
  • Windows:ipconfig /renew

即使在 DHCP 租約更新後,某些操作系統也無法完全更改其 DNS 設定。在這些情況下,請重新啟動 VM 執行個體的網路以強制更改 DNS 設定:

  • Ubuntu:sudo ifdown --exclude=lo -a && sudo ifup --exclude=lo -a
  • CentOS:sudo /etc/init.d/network restart
  • CoreOS:sudo systemctl restart systemd-networkd
  • 容器最佳化 OS:sudo systemctl restart systemd-networkd

如果您在容器、Kubernetes Engine 或是 App Engine 彈性環境上執行應用程式,則在重新啟動容器之前,容器設定中的 DNS 配置可能不會自動更新。如要在這些容器應用程式上禁用區域 DNS,必須在專案和執行個體上設定 VmDnsSetting=GlobalOnly 並重新啟動容器,以使其 DNS 設置恢復到原始狀態。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Compute Engine 說明文件