本文說明如何更新內部 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/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 函式和 批次
- Dataproc 和 Dataflow
檢查應用程式是否使用上述任一服務,並使用查詢分析來找出區域 DNS 的相容性問題,針對與這些應用程式相關聯的資料夾和專案進行這項檢查。
確認貴機構是否預設使用全球 DNS
貴機構的預設 DNS 設定取決於兩個因素:
機構建立日期:
- 2018 年 9 月 6 日後建立的機構:預設會使用區域 DNS。因此無需採取進一步行動。
- 在 2018 年 9 月 6 日前建立:貴機構預設會使用全球 DNS。建議您考慮改用可用區 DNS。
機構政策限制的存在與強制執行:
即使您的機構是在 2018 年 9 月 6 日前建立,管理員也可能會強制執行政策,要求在機構內建立的所有新專案都使用區域 DNS。如要確認是否有這類政策,您可以使用 Google Cloud 控制台或 Google Cloud CLI。
主控台
前往控制台的「IAM 與管理」>「身分識別與機構」 頁面。
查看機構的註冊日期。
如果您的機構是在 2018 年 9 月 6 日前建立,請檢查機構政策限制是否將所有新建立專案的預設 DNS 類型設為可用區 DNS。
- 前往 Google Cloud 控制台中的 「IAM & Admin>「Organization Policies」(機構政策)」頁面。
- 在「Filter」欄位中輸入
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。 - 如果已設定限制條件,請按一下名稱「將新專案的內部 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 頁面。
選取
「Compose a new query」(編寫新查詢)。在查詢編輯器文字區域中輸入下列 GoogleSQL 查詢,然後按一下
「Run」。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 查詢,然後按一下 「Run」。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,這些 ID 會導致資料夾無法準備好進行遷移。這個結果清單中的專案尚不支援區域 DNS,因此需要採取其他行動。
操作步驟如下:
- 取得資料夾 ID。如果不知道資料夾 ID,請按照下列步驟操作:
- 在 Google Cloud 控制台中前往「受管理的資源」頁面。
- 套用篩選器
Name:FOLDER_NAME
來取得資料夾 ID。
使用匯出的
compute.Project assets
資料查詢 BigQuery 資料表。如需建立 BigQuery 資料表的操作說明,請參閱「判斷資料夾或機構中的哪些專案使用全球 DNS」。
輸入以下 GoogleSQL 查詢,然後按一下
「Run」: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 的機構政策限制,請按照下列步驟操作:
- 按一下 [篩選]。
- 選取「名稱」。
- 將篩選器名稱設為「Sets the internal DNS setting for new projects to Zonal DNS Only」。
按一下機構政策限制名稱,開啟「政策詳細資料」頁面。
按一下 [編輯]。
在「Edit」(編輯) 頁面選取 [Customize] (自訂)。
在「Enforcement」下方,選取「Off」,即可停用限制條件的強制執行功能。也就是說,資料夾中所有專案的預設內部 DNS 類型,會根據機構建立日期決定。
按一下 [儲存]。
如要進一步瞭解如何自訂組織政策限制,請參閱 Resource Manager 說明文件中的「自訂布林值限制條件的政策」。
為新專案預設強制執行可用區 DNS
請按照下列步驟,為資料夾或機構設定機構政策。
以 Google Workspace 或 Cloud Identity 超級管理員身分登入 Google Cloud 主控台。
前往控制台的「Organization policies」(機構政策) 頁面。
選取要查看其機構政策的資料夾或機構。Google Cloud 控制台會顯示可用的機構政策限制條件清單。清單可能會跨越多個頁面。
如要找出要強制執行區域 DNS 的政策,請按一下「Filter」(篩選器) 並選取「Name」(名稱),然後將篩選器名稱設為「Sets the internal DNS setting for new projects to Zonal DNS Only」(將新專案的內部 DNS 設定設為僅限可用區 DNS)。
按一下政策名稱即可查看詳細資料。
政策詳細資料頁面會提供限制條件資訊,以及限制條件的套用方式。
根據預設,資料夾或機構的強制執行機制未定義。不過,如果父項資料夾已定義強制執行機制,則會從定義強制執行機制的最接近父項資料夾繼承強制執行機制。詳情請參閱「瞭解階層評估」。
如要自訂機構政策,請按一下「編輯」。
在編輯頁面中,選取「自訂」。
在「Enforcement」(強制執行) 下方,選取 [On] (開啟)。
這會將機構中所有新專案的預設內部 DNS 類型設為區域性 DNS。
按一下 [儲存]。
如要驗證機構政策變更,您可以在資料夾或機構下建立新專案,然後建立及啟動 VM 執行個體,並檢查 VM 是否已啟用可用區 DNS。
如果全域 DNS 需要解析工作負載內建的 DNS 名稱查詢,您可以停用強制執行功能,在機構或資料夾層級還原這項變更。
將機構或資料夾還原為使用全域 DNS
如要讓機構或資料夾恢復使用全域 DNS,請停止強制執行區域 DNS 的機構政策。請完成下列步驟。
在機構或資料夾層級停用機構政策
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。如需修改這項政策的操作說明,請參閱「為新專案預設強制使用可用區 DNS」。將「將新專案的內部 DNS 設定設為僅限可用區 DNS」的強制執行設為「關閉」。
如果您想恢復使用整個機構的全球 DNS,請確認機構中沒有任何資料夾會強制執行機構政策
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。如要確認已為專案和執行個體設定全域 DNS,請參閱「判斷資料夾或機構中的哪些專案使用全域 DNS」。
後續步驟
- 任何使用全球 DNS 的現有專案都必須個別遷移。詳情請參閱「更新專案以使用區域性 DNS」。