本文說明如何更新內部 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/orgpolicy.policyAdmin
) 在資料夾或組織中 -
判斷資料夾是否已準備好遷移至區域 DNS:
瀏覽器 (
roles/browser
) 在資料夾或機構上
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。
這些預先定義的角色具備查看機構內部 DNS 使用情形,以及更新預設政策所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
如要查看全機構的內部 DNS 使用情形及更新預設政策,必須具備下列權限:
-
設定機構政策限制:
orgpolicy.*
-
判斷資料夾是否已準備好遷移至區域 DNS:
-
resourcemanager.folders.get
-
resourcemanager.folders.list
-
resourcemanager.organizations.get
-
resourcemanager.projects.get
-
resourcemanager.projects.list
-
-
檢查全域 DNS 名稱和 VM 中繼資料:
compute.projects.get
設定總覽
如果您設定機構政策來覆寫預設的內部 DNS 類型,新建立的專案預設會使用可用區 DNS。如果現有專案已啟用 Compute Engine API,機構政策不會對這些專案造成影響。如要將現有專案改為使用可用區 DNS,請參閱將現有專案改為使用可用區 DNS。
建議您在機構層級強制執行可用區 DNS 政策。這種做法可確保在貴機構內建立的所有新專案都會使用可用區 DNS,進而提升可靠性和復原能力。不過,您可能需要從這項全機構政策中排除部分資料夾。如果資料夾中的新專案依附於與可用區 DNS 不相容的現有專案,就必須豁免資料夾。
在機構層級強制執行區域 DNS 政策的程序包括下列步驟:
- 收集專案和資料夾清單:彙整機構內的所有專案及其相關聯的資料夾。
- 找出要排除的資料夾:找出含有步驟 1 中不相容專案的資料夾。這些資料夾需要暫時豁免於區域 DNS 政策。
- 設定機構政策:在機構層級強制執行區域 DNS 政策。
- 豁免特定資料夾:對步驟 3 中識別的資料夾套用豁免。這樣一來,他們就能繼續使用全域 DNS,而您則可處理當中不相容的專案。
這種做法可確保新專案使用區域性 DNS,提升可靠性,同時也能配合舊專案的現有依附元件,這些專案可能還無法立即遷移。
限制
在整個機構啟用區域 DNS 名稱,會將區域 DNS 設定套用至其他服務的執行個體,例如:
- App Engine 彈性環境、Google Kubernetes Engine,以及在 Compute Engine 上執行的容器
- Cloud SQL、Cloud Run functions 和 Batch
- Dataproc 和 Dataflow
請檢查應用程式是否使用上述任一服務,並使用查詢分析功能,找出與這些應用程式相關聯的資料夾和專案,是否與區域 DNS 有相容性問題。
檢查貴機構是否預設使用全域 DNS
貴機構的預設 DNS 設定取決於下列兩項因素:
機構建立日期:
- 2018 年 9 月 6 日後建立:貴機構預設使用區域 DNS。因此無需採取進一步行動。
- 在 2018 年 9 月 6 日前建立:貴機構預設使用全域 DNS。建議您改用可用區 DNS。
機構政策限制的存在和強制執行:
即使貴機構是在 2018 年 9 月 6 日前建立,管理員也可能已強制執行政策,規定機構內所有新專案都必須使用區域 DNS。如要檢查是否有這類政策,可以使用 Google Cloud 控制台或 Google Cloud CLI。
主控台
前往控制台的「IAM & Admin」>「Identity & Organization」頁面。
查看機構的註冊日期。
如果貴機構是在 2018 年 9 月 6 日前建立,請檢查機構政策限制是否將所有新建立專案的預設 DNS 類型設為可用區 DNS。
- 前往 Google Cloud 控制台的「IAM & Admin」(IAM 與管理)>「Organization Policies」(機構政策) 頁面。
- 在「Filter」欄位中輸入
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。 - 如果已設定限制,請按一下名稱「Sets the internal DNS setting for new projects to Zonal DNS Only」(將新專案的內部 DNS 設定設為僅限可用區 DNS)。
- 在「政策詳細資料」頁面中,查看「狀態」。
- 如果狀態為「已強制執行」,則在機構中建立的所有新專案,預設內部 DNS 類型都是區域性 DNS。
- 否則,專案的預設 DNS 類型仍會由機構建立時間決定。
- 如果未為機構設定限制,專案的預設 DNS 類型會取決於機構的建立日期。
gcloud
使用
organizations describe
指令和resource-manager org-policies list
指令,判斷機構的預設 DNS 類型。檢查機構
creationTime
中繼資料值。gcloud organizations describe ORGANIZATION_ID
將 ORGANIZATION_ID 替換為機構 ID 號碼或機構網域名稱。
如果機構是在 2018 年 9 月 6 日前建立,請判斷是否已設定機構政策限制,將所有新建立專案的預設 DNS 類型設為可用區 DNS。
gcloud resource-manager org-policies list --organization=ORGANIZATION_ID \ --filter="constraints/compute"
在輸出內容中,尋找
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。- 如果存在限制且
Status
為Enforced
,則在機構中建立的所有新專案預設都會使用可用區 DNS。 - 如果沒有限制或未強制執行限制,預設 DNS 類型會依機構的建立日期決定,如第一個步驟所述。
- 如果存在限制且
判斷資料夾或機構中的哪些專案使用全域 DNS
如要判斷哪些專案使用全域 DNS,建議使用 BigQuery 建立資料表,列出機構的相關專案及其專案中繼資料。然後使用這個資料表執行查詢
- 建立 BigQuery 資料集。
-
- 確認已啟用 Cloud Asset Inventory API。
- 設定使用 Cloud Asset Inventory API 時所需的權限。
使用下列 gcloud CLI 指令匯出
compute.googleapis.com/Project
資產:gcloud asset export \ --content-type resource \ --organization 'ORGANIZATION_ID' \ --bigquery-table 'projects/PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME' \ --asset-types='compute.googleapis.com/Project' \ --output-bigquery-force
更改下列內容:
- ORGANIZATION_ID:機構 ID 編號
- PROJECT_ID:專案 ID
- DATASET_ID:BigQuery 資料集的名稱
- TABLE_NAME:要將中繼資料匯出至的資料表。如果資料表不存在,BigQuery 會建立資料表。
前往Google Cloud 控制台的「BigQuery」BigQuery頁面。
選取「撰寫新查詢」
。在查詢編輯器文字區域中,輸入下列 GoogleSQL 查詢,然後按一下「執行」
。SELECT JSON_VALUE(SAFE.PARSE_JSON(resource.data).vmDnsSetting) AS vmDnsSetting, count(*) as project_count FROM PROJECT_ID.DATASET_ID.TABLE_NAME GROUP BY 1
更改下列內容:
- PROJECT_ID:專案 ID
- DATASET_ID:BigQuery 資料集的名稱
- TABLE_NAME:包含匯出中繼資料的資料表 (步驟 2)。
如果專案的
vmDnsSetting
值為ZONAL_ONLY
,表示已設定區域 DNS。否則專案預設會使用全域 DNS。選用:如要查看每個專案的
vmDnsSetting
詳細資料,請輸入下列 GoogleSQL 查詢,然後按一下「執行」 。SELECT SUBSTR(name,35) as project_id, JSON_VALUE(SAFE.PARSE_JSON(resource.data).vmDnsSetting) AS vmDnsSetting FROM PROJECT_ID.DATASET_ID.TABLE_NAME
判斷資料夾是否適合遷移
這個步驟會使用
bash
指令碼和前一節中建立的 BigQuery 資料表,判斷資料夾是否適合遷移。- 如果所有專案在過去 30 天內,都沒有與區域性 DNS 不相容的查詢,資料夾就可遷移。
- 如果資料夾尚未準備好遷移,指令碼會回應資料夾中導致無法遷移的專案 ID。這份結果清單中的專案尚未與區域 DNS 相容,因此需要採取其他行動。
操作步驟如下:
- 取得資料夾 ID。如果不知道資料夾 ID,請按照下列步驟操作:
- 前往 Google Cloud 控制台的「受管理資源」頁面。
- 套用篩選器
Name:FOLDER_NAME
取得資料夾 ID。
使用匯出的
compute.Project assets
資料查詢 BigQuery 資料表。如需建立 BigQuery 資料表的說明,請參閱「判斷資料夾或機構中的哪些專案使用全域 DNS」。
輸入下列 GoogleSQL 查詢,然後點選「執行」
:SELECT SUBSTR(name,35) AS project_id, FROM PROJECT_ID.DATASET_ID.TABLE_NAME WHERE CONTAINS_SUBSTR(ancestors, 'FOLDER_NUMBER')
更改下列內容:
- PROJECT_ID:專案 ID
- DATASET_ID:BigQuery 資料集的名稱
- TABLE_NAME:包含匯出中繼資料的資料表
- FOLDER_NUMBER:資料夾 ID 編號
複製專案 ID 清單,並儲存到檔案。
執行下列
bash
指令碼。腳本會逐一檢查儲存檔案中的專案 ID,判斷資料夾是否已準備好遷移。
#!/bin/bash inaccessible_projects=() unready_projects=() for project in $(cat ~/FILENAME | tr '\n' ' '); do echo -e "Checking project $project..." ERROR=`curl -s --request POST "https://monitoring.googleapis.com/v3/projects/$project/timeSeries:query" -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Accept: application/json" -H "Content-Type: application/json" --data '{"query":"fetch compute.googleapis.com/Location | metric '"'"'compute.googleapis.com/global_dns/request_count'"'"' | filter metric.zonal_dns_readiness = '"'"'zonal_dns_risky'"'"' | every 30d | within 30d"}' --compressed | jq --raw-output '.error'` if ! [[ "$ERROR" -eq "null" ]]; then inaccessible_projects+=($project) continue fi QUERY_COUNT=`curl -s --request POST "https://monitoring.googleapis.com/v3/projects/$project/timeSeries:query" -H "Authorization: Bearer $(gcloud auth print-access-token)" -H "Accept: application/json" -H "Content-Type: application/json" --data '{"query":"fetch compute.googleapis.com/Location | metric '"'"'compute.googleapis.com/global_dns/request_count'"'"' | filter metric.zonal_dns_readiness = '"'"'zonal_dns_risky'"'"' | every 30d | within 30d"}' --compressed | jq --raw-output '.timeSeriesData[0].pointData[0].values[0].int64Value'` if [[ "$QUERY_COUNT" -ne "null" ]] && [[ "$QUERY_COUNT" -ne "0" ]]; then unready_projects+=($project) fi done error_len=${#inaccessible_projects[@]} unready_len=${#unready_projects[@]} echo -e "$error_len projects were inaccessible" echo -e "$unready_len projects were not ready for migration" if [ $error_len -ne 0 ]; then echo "Unable to access the following projects:" for project in "${inaccessible_projects[@]}"; do echo "$project" done fi if [ $unready_len -ne 0 ]; then echo "The following projects are not ready for migration:" for project in "${unready_projects[@]}"; do echo "$project" done fi if (( $error_len + $unready_len > 0 )); then echo "This folder is NOT ready for gDNS -> zDNS migration." else echo "This folder is ready for gDNS -> zDNS migration." fi
將 FILENAME 替換為您儲存專案 ID 清單的檔案名稱。
向專案擁有者說明遷移準備分析結果:
- 對於可安全遷移的資料夾和專案,請通知專案擁有者,他們可以開始遷移已準備就緒的專案。
- 如果資料夾含有不適合遷移的專案,請指示專案擁有者修正不相容的查詢。
不適用的資料夾尚未準備好遷移至區域性 DNS
如要從機構政策中排除資料夾,請完成下列步驟,將資料夾層級政策的強制執行選項設為
Off
。- 以 Google Workspace 或 Cloud Identity 超級管理員身分登入 Google Cloud 控制台。
前往控制台的「Organization policies」(機構政策) 頁面。
按一下「選取」,然後選取要排除在機構政策外的資料夾。
Google Cloud 控制台會在一或多個頁面上,顯示該資料夾的機構政策限制清單。
如要找出強制執行可用區 DNS 的機構政策限制,請按照下列步驟操作:
- 按一下 [篩選]。
- 選取「名稱」。
- 將篩選器名稱設為「將新專案的內部 DNS 設定設為僅限可用區 DNS」。
按一下機構政策限制名稱,開啟「政策詳細資料」頁面。
按一下 [編輯]。
在「Edit」(編輯) 頁面選取 [Customize] (自訂)。
在「Enforcement」(強制執行) 下方,選取「Off」(關閉),即可停用限制條件的強制執行功能。也就是說,資料夾中所有專案的預設內部 DNS 類型,取決於機構的建立日期。
按一下 [儲存]。
如要進一步瞭解如何自訂機構政策限制,請參閱 Resource Manager 說明文件中的「自訂布林值限制條件的政策」一節。
為新專案強制預設使用可用區 DNS
請按照下列步驟,為資料夾或機構設定機構政策。
以 Google Workspace 或 Cloud Identity 超級管理員身分登入 Google Cloud 控制台。
前往控制台的「Organization policies」(機構政策) 頁面。
選取要檢視機構政策的資料夾或機構。 Google Cloud 控制台會顯示可用的機構政策限制清單。這份清單可能會有數頁之長。
如要尋找強制執行可用區 DNS 的政策,請按一下「篩選器」並選取「名稱」,然後將篩選器名稱設為「將新專案的內部 DNS 設定設為僅限可用區 DNS」。
按一下政策名稱即可查看詳細資料。
政策詳細資料頁面會提供限制條件的相關資訊,以及限制條件的套用方式。
根據預設,系統不會為資料夾或機構定義強制執行狀態。 不過,如果上層資料夾已定義強制執行設定,則會從最接近的上層資料夾繼承強制執行設定。詳情請參閱「瞭解階層評估」。
如要自訂機構政策,請按一下「編輯」。
在編輯頁面中選取「自訂」。
在「Enforcement」(強制執行) 下方,選取 [On] (開啟)。
這會將機構中所有新專案的預設內部 DNS 類型設為可用區 DNS。
按一下 [儲存]。
如要驗證機構政策變更,請在資料夾或機構下建立新專案,然後建立並啟動 VM 執行個體,並檢查 VM 是否已啟用可用區 DNS。
如果工作負載內建的 DNS 名稱查詢需要全域 DNS 才能解析,您可以停用強制執行,在機構或資料夾層級還原這項變更。
還原為使用機構或資料夾的全域 DNS
如要讓機構或資料夾還原為使用全域 DNS,請停止強制執行區域 DNS 的機構政策。操作步驟如下。
在機構或資料夾層級停用機構政策
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。如需如何修改這項政策的操作說明,請參閱「為新專案預設強制執行可用區 DNS」。將「Sets the internal DNS setting for new projects to Zonal DNS Only」(將新專案的內部 DNS 設定設為僅限可用區 DNS) 的強制執行設為「Off」(關閉)。
如要還原為整個機構使用全域 DNS,請確認機構中的所有資料夾都沒有強制執行機構政策
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。如要確認專案和執行個體已設定全域 DNS,請參閱「判斷資料夾或機構中的哪些專案使用全域 DNS」。
後續步驟
- 如果現有專案使用全域 DNS,則必須另外遷移。詳情請參閱「更新專案以使用區域性 DNS」。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-09-04 (世界標準時間)。
-