本文說明如何將現有專案從全域 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
-
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
- Set a default region and zone.
REST
To use the REST API samples on this page in a local development environment, you use the credentials you provide to the gcloud CLI.
After installing the Google Cloud CLI, initialize it by running the following command:
gcloud init
If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.
For more information, see Authenticate for using REST in the Google Cloud authentication documentation.
-
必要的角色
如要取得遷移專案至使用可用區 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 控制台的「Metrics Explorer」(Metrics Explorer) 頁面leaderboard:
如果您是使用搜尋列尋找這個頁面,請選取子標題為「Monitoring」的結果。
在包含「選取指標」欄位的工具列右側,按一下「程式碼編輯器」、「MQL」或「PromQL」。
如果查詢輸入欄位的標題不是「MQL Query」,請在查詢輸入欄位的右下角,選取「Language」的「MQL」。
在查詢輸入欄位中,輸入下列文字:
fetch compute.googleapis.com/Location | metric 'compute.googleapis.com/global_dns/request_count' | every 1d | within 7d
按一下 [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」按鈕。
查看專案的「VM 執行個體」頁面時,如果專案已準備好遷移 (與區域性 DNS 查詢相容),橫幅會提供「使用區域性 DNS」的建議。這項最佳化建議是根據專案中的內部 DNS 用量計算得出,但僅限於過去 30 天。
如果您點選「Use Zonal DNS」按鈕,專案中繼資料就會更新為使用區域性 DNS。
選用步驟:查看及查詢 VM 中繼資料,確認中繼資料變更。
手動變更專案中繼資料,使用可用區 DNS。
為專案設定
vmDnsSetting
中繼資料項目,即可為執行個體啟用區域 DNS。設定此中繼資料項目後,使用搜尋路徑時,只有區域 DNS 名稱 (VM_NAME.ZONE.c.PROJECT_ID.internal) 才能存取運算執行個體。執行個體仍保留區域和全域搜尋路徑,但其全域 DNS 名稱 (不包含內部 DNS 名稱中的 ZONE) 則停止運作。啟用這項設定後,只有位於相同區域和專案的執行個體才能使用全域名稱互相存取。主控台
如要在專案層級更新設定,請在 Google Cloud 控制台中前往 Compute Engine 的「Metadata」頁面。
按一下「Edit」(編輯)
。如果有值為
VmDnsSetting
的鍵,請將其值變更為ZonalOnly
。如果沒有值為
VmDnsSetting
的鍵,請按一下 「Add item」。- 在「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=", ... } }
建構
POST
要求,以便向projects.setCommonInstanceMetadata
方法設定中繼資料鍵/值組合: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」頁面會顯示下列橫幅:
如要修正所有不相容的查詢,建議您在查詢中使用來源執行個體的可用區完整網域名稱 (FQDN)。這種做法可確保在將專案遷移至區域性 DNS 後,查詢解析作業不會中斷。
如要解決不相容的查詢,請執行下列操作:
使用 Logs Explorer 存取及查詢專案中運算執行個體的全域 DNS 用量。
選取專案。
套用資源和記錄名稱篩選器:
- 按一下「Resource」(資源)。
- 在「Select resource」對話方塊中,選取「VM Instance」,然後按一下「Apply」。
- 按一下「記錄名稱」。
在「Select log names」對話方塊中,選取「gdnsusage」,然後按一下「Apply」。
或者,您也可以在查詢欄位中輸入以下內容:
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 後,請執行下列操作:
使用 Logs Explorer 頁面再次查詢全域 DNS 用量。修正所有阻斷全域 DNS 查詢後,查詢結果中就不會顯示任何偵錯記錄。
重新檢查監控指標,看看是否已移除所有不相容的 DNS 查詢。
在 Logs Explorer 中查看全域 DNS 記錄
Logs Explorer 主要會針對查詢與區域性 DNS 不相容的專案,顯示全域 DNS 記錄。這些記錄可協助您在遷移前,找出並分析有問題的查詢。
您也可以使用 Logs Explorer 查看這些不相容的查詢,執行以下操作:
檢查區域 DNS 異動是否影響專案
遷移至區域 DNS 後,請務必確認應用程式和服務仍能正常運作。由於區域 DNS 會變更內部 DNS 名稱的解析方式,因此如果某些應用程式依賴全域 DNS 名稱,可能會發生問題。
下節將說明如何檢查潛在影響,以及如何解決這些問題:
指令列執行個體通訊
工作:請嘗試使用 gcloud CLI 對另一個執行個體的一個執行個體執行 ping 作業。
gcloud compute ssh VM-A --command "ping VM-B"
可能的錯誤:「Could not resolve host」:這表示
VM-A
找不到VM-B
的 IP 位址。解決方法:將您用於
VM-B
的主機名稱更新為完整網域名稱 (FQDN),其中包含區域名稱:INSTANCE_NAME.ZONE.c.PROJECT_ID.internal
Compute Engine 服務內的執行個體通訊
工作:如果您為依賴內部 DNS 名稱的代管執行個體群組 (MIG) 使用健康狀態檢查,請檢查健康狀態檢查是否通過。
可能的錯誤:「健康檢查失敗」:這表示因 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
。如要瞭解如何設定運算執行個體中繼資料值,請參閱「設定及移除自訂中繼資料」。
如要強制更改 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。