本文說明如何將現有專案從全域 DNS 遷移至區域 DNS。可用區 DNS 可將服務中斷情形隔離在可用區內,避免執行個體建立和自動修復等重要服務中斷,進而提升可靠性。
事前準備
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,可以選取下列任一選項,向 Compute Engine 進行驗證:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:
gcloud init
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
- Set a default region and zone.
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:
gcloud init
如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI。
詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。
必要的角色
如要取得將專案遷移至區域 DNS 所需的權限,請要求管理員授予下列 IAM 角色:
-
將專案遷移至使用區域 DNS:
專案的專案編輯者 (
roles/resourcemanager.projectEditor
) -
在專案中將 VM 遷移至區域 DNS:
Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1
) 專案 -
如果 VM 使用服務帳戶:
服務帳戶或專案的服務帳戶使用者 (
roles/iam.serviceAccountUser
)
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備將專案遷移至使用區域 DNS 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要遷移專案以使用區域 DNS,必須具備下列權限:
-
檢查全域 DNS 名稱和 VM 中繼資料:
compute.projects.get
-
在 VM 上設定中繼資料:
compute.instances.setMetadata
-
設定全專案適用的中繼資料:
compute.projects.setCommonInstanceMetadata
-
如果 VM 使用服務帳戶:
iam.serviceAccounts.actAs
將專案遷移至可用區 DNS
如要遷移專案以使用區域 DNS,請完成下列工作:
- 檢查專案是否預設使用全域 DNS
- 使用查詢分析功能,判斷專案是否已準備好遷移
- 遷移與區域 DNS 相容的專案
- 修正不相容的查詢
- 監控全球 DNS 記錄,確認遷移完備性。
- 將其餘專案遷移至區域 DNS
- 檢查改用區域性 DNS 是否會影響專案
檢查專案是否預設使用全域 DNS
檢查專案,確認是否需要從全域 DNS 遷移至區域 DNS。您只需要遷移設為使用全域 DNS 的專案,因為這是專案中建立任何內部 DNS 名稱時的預設設定。
控制台
在 Google Cloud 控制台中,前往 Compute Engine 的「Metadata」(中繼資料) 頁面。
在「中繼資料」分頁中,查看
vmdnssetting
設定 (如有)。指派的值會指出專案是否預設使用全域 DNS。GlobalDefault
:專案已啟用全域 DNS。ZonalOnly
:專案已啟用區域 DNS。這項專案不需要遷移。
如果沒有列出
vmdnssetting
中繼資料設定,請檢查貴機構是否預設使用全域 DNS。
gcloud
執行下列 gcloud CLI 指令,檢查
vmDnsSetting
的值。gcloud compute project-info describe --project=PROJECT_ID --flatten="vmDnsSetting"
將 PROJECT_ID 替換為專案名稱。
傳回的值會指出專案是否預設使用全域 DNS。
GLOBAL_DEFAULT
:專案已啟用全域 DNS。ZONAL_ONLY
:專案已啟用區域 DNS。這項專案不需要遷移。
REST
使用
projects.get
方法檢查vmDnsSetting
的值。這個範例使用fields
查詢參數,只納入您想查看的欄位。GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID?fields=id,name,vmDnsSetting
將 PROJECT_ID 替換為專案 ID。
vmDnsSetting
的值表示專案是否預設使用全域 DNS。GLOBAL_DEFAULT
:專案已啟用全域 DNS。ZONAL_ONLY
:專案已啟用區域 DNS。這個專案不需要遷移。
使用查詢分析判斷專案是否適合遷移
如要評估專案是否能遷移至區域性 DNS,而不需變更程式碼或全域 DNS 的使用方式, Google Cloud 會分析您的 DNS 查詢記錄。這項分析會提供下列指標,指出專案是否與可用區 DNS 相容:
zonal_dns_ready
(相容的查詢):這項指標代表 100 天內可使用區域性 DNS 成功解析的查詢總數。zonal_dns_risky
(不相容的查詢):這個指標代表無法使用區域性 DNS 解析的查詢總數。這些查詢通常涉及跨區域通訊,或區域解析失敗的其他情境。請務必注意,如果這項指標的值不為零,表示專案尚未準備好遷移。您必須先解決這些不相容的查詢,才能改用區域性 DNS。
如要查看這些指標,請使用 Google Cloud 控制台中的 Metrics Explorer。
-
前往 Google Cloud 控制台的 leaderboard「Metrics Explorer」頁面:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果。
在含有「選取指標」欄位的工具列右側,按一下「程式碼編輯器」、「MQL」或「PromQL」。
如果查詢輸入欄位不是標題為「PromQL 查詢」,請選取「語言」的「PromQL」。
在查詢輸入欄位中,輸入下列文字 (請務必完全照抄):
increase({"compute.googleapis.com/global_dns/request_count", monitored_resource="compute.googleapis.com/Location"}[1d])
按一下 [Run query] (執行查詢) 按鈕。
Google Cloud 控制台會顯示兩項指標 (
zonal_dns_ready
和zonal_dns_risky
) 的圖表,以及每項指標在該時間範圍內對應的查詢次數。檢查
zonal_dns_risky
指標的值。- 如果值為
0
,代表專案已準備好遷移至區域 DNS。您可以遷移專案,詳情請參閱「遷移已準備好使用區域性 DNS 的專案」。 - 如果值為非零數字 (例如上一個螢幕截圖中顯示的
0.02k
),則在遷移至區域性 DNS 後,部分查詢可能無法運作。專案尚未準備好遷移。 繼續按照「修正不相容的查詢」中的步驟操作。
- 如果值為
遷移與區域 DNS 相容的專案
如要遷移已準備好改用區域性 DNS 的專案,請使用下列任一選項:
在 Google Cloud 控制台中,按一下「Use Zonal DNS」(使用區域 DNS) 按鈕。
查看專案的「VM instances」(VM 執行個體) 頁面時,如果專案已準備好遷移 (與可用區 DNS 查詢相容),橫幅就會顯示「使用可用區 DNS」的建議。這項建議是根據專案中的內部 DNS 使用情況而定,但僅限過去 30 天。
如果點選「使用區域性 DNS」按鈕,專案中繼資料就會更新為使用區域性 DNS。
選用:查看及查詢 VM 中繼資料,確認中繼資料變更。
手動變更專案中繼資料,改用區域性 DNS。
如要為執行個體啟用區域 DNS,請為專案設定
vmDnsSetting
中繼資料項目。設定這個中繼資料項目後,使用搜尋路徑時,只能透過區域 DNS 名稱 (VM_NAME.ZONE.c.PROJECT_ID.internal) 存取運算執行個體。執行個體仍保留區域和全域搜尋路徑,但其全域 DNS 名稱 (不含內部 DNS 名稱中的 ZONE) 則停止運作。如果啟用這項設定,只有位於相同區域和專案的執行個體,才能使用全域名稱互相存取。主控台
如要在專案層級更新設定,請在Google Cloud 控制台中前往 Compute Engine 的「Metadata」(中繼資料) 頁面。
按一下「Edit」(編輯)
。如果存在值為
VmDnsSetting
的鍵,請將其值變更為ZonalOnly
。如果沒有值為
VmDnsSetting
的鍵,請按一下「新增項目」 。- 在「Key」(金鑰) 欄位中輸入
VmDnsSetting
。 - 在「Value」(值) 欄位中,輸入
ZonalOnly
。
- 在「Key」(金鑰) 欄位中輸入
如要完成修改自訂中繼資料項目,請按一下「儲存」。
gcloud
如要更新目前專案的中繼資料設定,請使用
project-info add-metadata
指令。gcloud compute project-info add-metadata \ --metadata vmDnsSetting=ZonalOnly
選用:如要驗證專案的中繼資料設定,請使用下列指令:
gcloud compute project-info describe --project=PROJECT_ID --flatten="vmDnsSetting"
將 PROJECT_ID 替換為要查詢的專案名稱。
REST
如要在專案層級更新中繼資料設定,請使用 projects.setCommonInstanceMetadata 方法建構
POST
要求。選用:如要執行樂觀鎖定,可以視需要提供指紋。
指紋是由 Compute Engine 產生的隨機字元字串,指紋會在每次要求後變更;如果您提供的指紋不符,系統便會拒絕您的要求。
如果您未提供指紋,系統就不會檢查一致性,
projects.setCommonInstanceMetadata
要求也會成功。如果您使用instances.setMetadata
方法,則一律需要指紋。如要取得專案的目前指紋,請呼叫
project.get
方法。GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID
輸出結果會與下列內容相似:
{ "name": "myproject", "commonInstanceMetadata": { "kind": "compute#metadata", "fingerprint": "FikclA7UBC0=", ... } }
建構對
projects.setCommonInstanceMetadata
方法的POST
要求,設定中繼資料鍵值組合:POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/setCommonInstanceMetadata { "fingerprint": "FikclA7UBC0=", "items": [ { "key": "vmDnsSetting", "value": "ZonalOnly" } ] }
將
PROJECT_ID
替換為您的專案 ID。
為專案設定
vmDnsSetting
中繼資料項目後,請更新該專案中每個執行個體的 DHCP 租約。您可以透過重新啟動執行個體,等待租約到期或執行以下其中一個指令來更新租約:Linux 執行個體
sudo dhclient -v -r
Windows 執行個體
ipconfig /renew
修正不相容的查詢
如果專案尚未準備好遷移,表示在特定時間內 (例如過去 30 天),至少發出過一次不相容的 DNS 查詢。不相容的查詢可能具有下列屬性:
- 呼叫其他專案中的運算執行個體
- 撥打電話給其他區域的運算執行個體
如果專案有不相容的查詢, Google Cloud 控制台的「VM instances」(VM 執行個體) 頁面會顯示下列橫幅:
如要修正所有不相容的查詢,建議您在查詢中使用來源執行個體的可用區完整網域名稱 (FQDN)。這種做法可確保專案遷移至區域 DNS 後,查詢解析作業不會中斷。
如要解決不相容的查詢,請按照下列步驟操作:
使用 Logs Explorer 存取及查詢專案中運算執行個體的全域 DNS 用量。
選取專案。
套用資源和記錄名稱篩選器:
- 按一下「Resource」(資源)。
- 在「選取資源」對話方塊中,選取「VM 執行個體」,然後按一下「套用」。
- 按一下「記錄名稱」。
在「選取記錄檔名稱」對話方塊中,選取「gdnsusage」,然後按一下「套用」。
或者,您也可以在查詢欄位中輸入下列內容:
resource.type="gce_instance" log_name="projects/PROJECT_ID/logs/compute.googleapis.com%2Fgdnsusage"
在「查詢結果」窗格中,每個查詢都有
jsonPayload
欄位。每個jsonPayload
欄位都包含下列資訊:- 來源 VM 名稱、專案 ID 和可用區名稱。
- 目的地 VM 名稱、專案 ID 和區域名稱。
偵錯訊息,提供如何更新無法使用區域 DNS 名稱解析的全域 DNS 查詢資訊。這些查詢會導致遷移作業無法完成,因此您應進行偵錯並修正。
"To use Zonal DNS, update the Global DNS query sent from the source VM VM_NAME.c.PROJECT_ID.internal to the following zonal FQDN: VM_NAME.ZONE.c.PROJECT_ID.internal"
查詢次數,顯示來源 VM 在當天傳送至目的地 VM 的遷移封鎖查詢次數。
下圖顯示 Logs Explorer 控制台頁面中的
jsonPayload
欄位資訊。使用上一個步驟中取得的
jsonPayload
資訊,判斷要使用哪個 FQDN 手動更新全域 DNS 查詢,改用區域性 DNS,並準備好遷移專案。以下是更新 FQDN 和解決相容性問題最常見的用途:- 中繼資料伺服器的內部 DNS 名稱:不需要採取任何行動,因為遷移至區域 DNS 後,傳回的 DNS 名稱會立即變更為區域 FQDN。如果 DNS 名稱已快取,您只需要再發出一次呼叫,即可更新快取值。
- 用於存取其他區域中 VM 的內部 DNS 名稱:如果應用程式使用不同區域中 VM 的內部 DNS 名稱,您可以修改 DHCP 政策或設定檔,在其他區域中加入區域。
- 硬式編碼的全域 FQDN:如果應用程式使用 VM 的硬式編碼全域 FQDN 名稱,您可以更新應用程式中的呼叫,改用內部 DNS 名稱或區域 FQDN。您可以透過程式碼變更或 Terraform 中的設定變更進行這項變更。
- 使用共用虛擬私人雲端網路的服務專案中的 VM:如要解析使用共用虛擬私人雲端網路的服務專案中 VM 的 DNS 名稱,您必須使用 VM 的區域 FQDN。
將全域 DNS 查詢更新為使用區域性 DNS 後,請執行下列操作:
使用「記錄檔探索工具」頁面再次查詢全域 DNS 用量。 修正所有會封鎖全域 DNS 查詢的問題後,查詢結果中就不會再顯示任何偵錯記錄。
重新檢查監控指標,確認所有不相容的 DNS 查詢都已移除。
在記錄檔探索工具中查看全域 DNS 記錄
如果專案的查詢不相容於區域性 DNS,記錄檔探索工具主要會顯示專案的全域 DNS 記錄。這些記錄有助於您在遷移前,找出並分析這些有問題的查詢。
您也可以使用記錄檔探索工具,針對這些不相容的查詢執行下列操作:
檢查區域 DNS 變更是否會影響專案
遷移至區域 DNS 後,請務必確認應用程式和服務是否仍能正常運作。區域 DNS 會改變內部 DNS 名稱的解析方式,因此如果應用程式依賴全域 DNS 名稱,可能會發生問題。
下節說明如何檢查潛在影響,以及如何解決問題:
指令列執行個體通訊
工作:使用 gcloud CLI 從一個執行個體 Ping 另一個執行個體。
gcloud compute ssh VM-A --command "ping VM-B"
潛在錯誤:「無法解析主機」:這表示
VM-A
找不到VM-B
的 IP 位址。解決方法:將用於
VM-B
的主機名稱更新為完整網域名稱 (FQDN),其中包含區域名稱:INSTANCE_NAME.ZONE.c.PROJECT_ID.internal
Compute Engine 服務內的執行個體通訊
工作:如果您使用健康狀態檢查功能,檢查代管執行個體群組 (MIG) 是否正常運作,且這些群組依賴內部 DNS 名稱,請確認健康狀態檢查是否通過。
可能發生的錯誤:「健康狀態檢查失敗」:這表示健康狀態檢查因 DNS 解析問題而無法連上目標。
解決方法:確認健康狀態檢查使用目標執行個體的 FQDN,包括區域名稱。
特定應用程式的用途
許多應用程式會依賴內部 DNS 執行下列工作:
- 連線至資料庫 (例如 Cloud SQL)
與訊息佇列 (例如 Pub/Sub) 互動
潛在錯誤:這些錯誤因應用程式而異,但可能包括:
- 「無法連線至『SERVICE_NAME』」
- 「連線逾時」
- 「No such host is known」(找不到這類主機)
解決方法:檢查應用程式的設定,確認參照服務時使用的是 FQDN (包括區域名稱)。
還原為使用全域 DNS
如要復原遷移至區域性 DNS 的作業,請將預設內部 DNS 類型改回全域 DNS。您可以在機構、專案、執行個體或容器層級執行這項操作。
還原為專案使用全域 DNS
如要將專案還原為使用全域 DNS,請完成下列步驟。
在專案的中繼資料中新增以下內容:
vmDnsSetting=GlobalDefault
。如要瞭解如何設定專案中繼資料值,請參閱「設定及移除自訂中繼資料」。
確認專案中的任何執行個體,都沒有將
vmDnsSetting
中繼資料值設為ZonalOnly
。gcloud compute instances describe INSTANCE_NAME --flatten="metadata[]"
將 INSTANCE_NAME 替換為要檢查的執行個體名稱。
更新每個執行個體上的 DHCP 租約。您可以透過重新啟動執行個體,等待租約到期,或在訪客作業系統中執行以下其中一個指令來更新租約:
- Linux 執行個體:
sudo dhclient -v -r
- Windows Server 執行個體:
ipconfig /renew
- Linux 執行個體:
將執行個體還原為使用全域 DNS
如要將特定執行個體還原為使用全域 DNS,請完成下列步驟。
更新執行個體的中繼資料,加入
vmDnsSetting=GlobalDefault
。如要瞭解如何設定 Compute 執行個體中繼資料值,請參閱設定及移除自訂中繼資料。
如要強制變更 DNS 設定,請使用下列任一指令重新啟動執行個體的網路:
如果是 Container-Optimized OS 或 Ubuntu:
sudo systemctl restart systemd-networkd
如果是 CentOS、RedHat EL、Fedora CoreOS 或 Rocky Linux:
sudo systemctl restart network
或
sudo systemctl restart NetworkManager.service
如果是 Debian:
sudo systemctl restart networking
適用於搭載
nmcli
的 Linux 系統:sudo nmcli networking off sudo nmcli networking on
Windows 系統:
ipconfig /renew
還原為使用容器的全域 DNS
如果您在 Google Kubernetes Engine 或 App Engine 彈性環境的容器中執行應用程式或工作負載,則在重新啟動容器之前,系統不會自動更新容器設定中的 DNS 設定。如要在這些容器應用程式上停用區域 DNS,請完成下列步驟。
將擁有容器和 VM 的專案,其專案中繼資料設定
vmDnsSetting
設為GlobalDefault
。重新啟動容器,讓 DNS 設定還原成原始狀態。
排解全域 DNS 遷移至可用區 DNS 的程序問題
如果遷移程序發生問題,請參閱疑難排解指南。
後續步驟
- 如要瞭解機構、資料夾和專案之間的關係,請參閱Google Cloud 資源階層。
- 進一步瞭解 Compute Engine 的內部 DNS。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-09-04 (世界標準時間)。
-