本文档介绍了如何更新内部 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 身份验证文档中的使用 REST 时进行身份验证。
所需的角色
如需获取查看组织级内部 DNS 用量和更新默认政策所需的权限,请让您的管理员为您授予以下 IAM 角色:
-
检查文件夹或组织的默认全局 DNS 政策:Organization Policy Administrator (
roles/orgpolicy.policyAdmin
) -
确定文件夹是否已准备好迁移到可用区级 DNS:针对文件夹或组织的 Browser (
roles/browser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含查看组织级内部 DNS 用量和更新默认政策所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
您需要具备以下权限,才能查看组织级内部 DNS 用量并更新默认政策:
-
设置组织政策限制条件:
orgpolicy.*
-
确定文件夹是否已准备好迁移到可用区级 DNS:
-
resourcemanager.folders.get
-
resourcemanager.folders.list
-
resourcemanager.organizations.get
-
resourcemanager.projects.get
-
resourcemanager.projects.list
-
-
检查全球 DNS 名称和虚拟机元数据:
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 和管理>身份和组织页面。
检查组织注册日期。
如果您的组织是在 2018 年 9 月 6 日之前创建的,请检查组织政策限制条件是否将所有新创建的项目的默认 DNS 类型设置为区域级 DNS。
- 前往 Google Cloud 控制台中的 IAM 和管理>组织政策页面。
- 在过滤条件字段中,输入
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 页面。
选择
编写新查询。在查询编辑器文本区域中,输入以下 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 控制台。
在控制台中,转到组织政策页面。
点击选择,然后选择要从组织政策中豁免的文件夹。
Google Cloud 控制台会在一个或多个页面上显示该文件夹的组织政策限制条件列表。
如需查找强制执行可用区级 DNS 的组织政策限制条件,请执行以下操作:
- 点击过滤。
- 选择名称。
- 将过滤条件名称设置为将新项目的内部 DNS 设置设为“仅限可用区级 DNS”。
点击组织政策限制条件名称以打开政策详情页面。
点击修改。
在修改页面,选择自定义。
在强制执行下,选择关闭以停用限制条件的强制执行。也就是说,该文件夹中所有项目的默认内部 DNS 类型均由组织创建日期决定。
点击保存。
如需详细了解如何自定义组织政策限制条件,请参阅 Resource Manager 文档中的为布尔值限制条件自定义政策。
默认为新项目强制执行可用区级 DNS
按照以下步骤设置文件夹或组织的组织政策。
以 Google Workspace 或 Cloud Identity 超级用户身份登录 Google Cloud 控制台。
在控制台中,转到组织政策页面。
选择您要查看其组织政策的文件夹或组织。 Google Cloud 控制台会显示可用的组织政策列表。该列表可能跨多个页面。
如需查找强制执行可用区级 DNS 的政策,请点击过滤条件并选择名称,然后将过滤条件名称设置为将新项目的内部 DNS 设置设为“仅限可用区级 DNS”。
点击政策名称以查看其详细信息。
政策详情页面提供限制条件的相关信息以及限制条件的应用方式。
默认情况下,系统不会为文件夹或组织定义强制执行。但是,如果父文件夹具有已定义的强制执行,则强制执行将从具有已定义强制执行的最近父文件夹继承。如需了解详情,请参阅了解层次结构评估。
要自定义组织政策,请点击修改。
在修改页面中,选择自定义。
在强制执行下,选择开启。
这会将组织中所有新项目的默认内部 DNS 类型设置为可用区级 DNS。
点击保存。
如需验证组织政策更改,您可以在文件夹或组织下创建一个新项目,然后创建并启动虚拟机实例并检查是否已为虚拟机启用可用区级 DNS。
如果需要全球 DNS 来解析工作负载中内置的 DNS 名称查询,则可以停用强制执行,以在组织或文件夹级层回滚此更改。
还原为对组织或文件夹使用全球 DNS
如需将组织或文件夹还原为使用全球级 DNS,请停止强制执行针对区域级 DNS 的组织政策。完成以下步骤。
在组织或文件夹级层停用组织政策
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。如需了解如何修改此政策,请参阅默认为新项目强制执行可用区级 DNS。将将新项目的内部 DNS 设置设为“仅限可用区级 DNS”的强制执行设置为关闭。
如果您希望还原为对整个组织使用全球 DNS,请验证组织中没有任何文件夹强制执行组织政策
constraints/compute.setNewProjectDefaultToZonalDNSOnly
。如需验证是否已为您的项目和实例配置全球级 DNS,请参阅确定文件夹或组织中的哪些项目使用全球级 DNS。
后续步骤
- 任何使用全球级 DNS 的现有项目都必须单独迁移。如需了解详情,请参阅将项目更新为使用区域级 DNS。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-09-05。
-