內部 DNS

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

舉例來說,當您刪除執行個體時,GCP 會自動移除其 .internal DNS 名稱的相關 A 和 PTR 記錄。如果您之後建立相同名稱的執行個體,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 名稱,請參閱在私人區域中使用 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 名稱與共用的虛擬私人雲端

即使執行個體的內部 IP 位址位於主專案的共用虛擬私人雲端網路中,您也可以使用內部 DNS 名稱來參照此 IP 位址。就共用虛擬私人雲端的情況而言,區域或全域 (全專案) 內部 DNS 名稱中專案 ID 的部分會是服務專案的 ID。

判斷執行個體的內部 DNS 名稱

使用以下程序,讀取指派給執行個體的內部 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 發行版會將 DHCP 資訊儲存在 resolv.conf 中。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 變數支援下列設定:

  • 設定 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,即可自動套用至您在該專案中建立的所有執行個體。

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

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

若要強制立即更新 DHCP 租約,請使用下列其中一個指令:

  • Container-optimized OS (Google Kubernetes Engine):sudo systemctl restart systemd-networkd
  • Debian/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
  • Container-optimized OS:sudo systemctl restart systemd-networkd

如果您在 Google Kubernetes Engine 或 App Engine 彈性環境的容器中執行應用程式,則在重新啟動容器之前,系統不會自動更新容器設定中的 DNS 設定。若要在這些容器應用程式上停用區域 DNS,則必須在專案和執行個體上設定 VmDnsSetting=GlobalOnly,然後重新啟動容器,這樣才能讓其 DNS 設定還原成原始狀態。

後續步驟

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

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

這個網頁
Compute Engine 說明文件