本文档介绍了如何将现有项目从全球 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:针对项目的 Project Editor (
roles/resourcemanager.projectEditor
) -
将虚拟机迁移到项目中的区域级 DNS:针对项目的 Compute Instance Admin (v1) (
roles/compute.instanceAdmin.v1
) -
如果您的虚拟机使用服务账号:针对服务账号或项目的 Service Account User (
roles/iam.serviceAccountUser
)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含将项目迁移到使用区域级 DNS 所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
将项目迁移到使用区域级 DNS 需要以下权限:
-
检查全球 DNS 名称和虚拟机元数据:
compute.projects.get
-
在虚拟机上设置元数据:
compute.instances.setMetadata
-
设置项目范围的元数据:
compute.projects.setCommonInstanceMetadata
-
如果您的虚拟机使用服务账号:
iam.serviceAccounts.actAs
将项目迁移到区域级 DNS
如需将项目迁移为使用区域级 DNS,请完成以下任务:
- 检查您的项目是否默认使用全球 DNS
- 使用查询分析确定项目的迁移就绪情况
- 迁移与区域级 DNS 兼容的项目
- 修正不兼容的查询
- 监控全局 DNS 日志以确认迁移就绪情况。
- 将剩余项目迁移到区域级 DNS
- 检查对区域级 DNS 所做的更改是否会影响您的项目
检查您的项目是否默认使用全球 DNS
检查您的项目,了解它们是否需要从使用全球 DNS 迁移到区域级 DNS。您只需迁移配置为对项目内创建的任何内部 DNS 名称使用全球 DNS 作为默认 DNS 的项目。
控制台
在 Google Cloud 控制台中,前往 Compute Engine 元数据页面。
在元数据标签页上,查看
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 页面:
如果您使用搜索栏查找此页面,请选择子标题为监控的结果。
在包含选择指标字段的工具栏右侧,点击代码编辑器、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 控制台中的使用区域级 DNS 按钮。
当您查看项目的虚拟机实例页面时,如果项目已准备好迁移(与区域级 DNS 查询兼容),则横幅中会包含关于使用区域级 DNS的建议。此建议基于项目中的内部 DNS 使用情况,但仅限于过去 30 天。
如果您点击使用区域级 DNS 按钮,系统会更新项目元数据以使用区域级 DNS。
可选:查看和查询虚拟机元数据,以确认元数据更改。
手动更改项目元数据以使用区域级 DNS。
通过为项目设置
vmDnsSetting
元数据条目,为您的实例启用区域级 DNS。设置此元数据条目后,在使用搜索路径时,您的计算实例只能通过其区域级 DNS 名称 (VM_NAME.ZONE.c.PROJECT_ID.internal) 进行访问。这些实例仍保留区域级和全球搜索路径,但其全球 DNS 名称(未包含 ZONE)不再起作用。启用此设置后,仅同一地区且属于同一项目的实例才能通过全球名称互相访问。控制台
如需在项目级别更新设置,请在Google Cloud 控制台中前往 Compute Engine元数据页面。
点击
修改。如果存在值为
VmDnsSetting
的键,请将其值更改为ZonalOnly
。如果不存在值为
VmDnsSetting
的键,请点击 添加内容。- 在密钥字段中,输入
VmDnsSetting
。 - 在值字段中,输入
ZonalOnly
。
- 在密钥字段中,输入
如需完成自定义元数据条目的修改,请点击保存。
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 控制台的虚拟机实例页面中会显示以下横幅:
如需修复所有不兼容的查询,建议您在查询中使用来源实例的区域级完全限定域名 (FQDN)。此方法可确保在将项目迁移到区域级 DNS 后,查询解析不会中断。
如需解决不兼容的查询问题,请执行以下操作:
使用 Logs Explorer 访问并查询项目中计算实例的全球 DNS 使用情况。
选择项目。
应用资源和日志名称过滤条件:
- 点击资源。
- 在选择资源对话框中,选择虚拟机实例,然后点击应用。
- 点击日志名称。
在选择日志名称对话框中,选择 gdnsusage,然后点击应用。
或者,您可以在查询字段中输入以下内容:
resource.type="gce_instance" log_name="projects/PROJECT_ID/logs/compute.googleapis.com%2Fgdnsusage"
在查询结果窗格中,每个查询都有一个
jsonPayload
字段。每个jsonPayload
字段都包含以下信息:- 来源虚拟机名称、其项目 ID 和可用区名称。
- 目标虚拟机名称、其项目 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"
查询计数,显示来源虚拟机在当天向目标虚拟机发送的迁移阻塞查询数量。
以下屏幕截图显示了 Logs Explorer 控制台页面中的
jsonPayload
字段信息。使用您在上一步中获取的
jsonPayload
中的信息,确定要使用哪个 FQDN 来将全球 DNS 查询手动更新为使用区域级 DNS,从而使项目准备好迁移。要更新 FQDN 和解决兼容性问题的最常见应用场景如下:- 来自元数据服务器的内部 DNS 名称:无需执行任何操作,因为返回的 DNS 名称会在迁移到可用区级 DNS 后立即更改为可用区级 FQDN。如果 DNS 名称已缓存,您只需再进行一次调用即可更新缓存值。
- 用于访问其他区域中的虚拟机的内部 DNS 名称:如果您的应用为不同区域中的虚拟机使用内部 DNS 名称,您可以修改 DHCP 政策或配置文件以将该可用区包含在另一个区域中。
- 硬编码的全球 FQDN:如果您有一个应用为虚拟机使用硬编码的全球 FQDN 名称,则可以更新应用中的调用以改用内部 DNS 名称或可用区级 FQDN。您可以通过 Terraform 中的代码更改或配置更改来进行此项更改。
- 服务项目中使用共享 VPC 网络的虚拟机:如果服务项目中的虚拟机使用共享 VPC 网络且需要解析这些虚拟机的 DNS 名称,您必须使用虚拟机的可用区级 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"
潜在错误:“无法解析主机”— 这意味着
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”
- “连接已超时”
- “没有此类主机”
解决方案:检查应用的配置,确保引用服务时使用 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,请完成以下步骤。
在拥有容器和虚拟机的项目中,将项目元数据设置
vmDnsSetting
设为GlobalDefault
。重启容器,使其 DNS 设置恢复到原始状态。
排查从全球 DNS 迁移到可用区级 DNS 过程中的问题
如果您在迁移过程中遇到问题,请参阅问题排查指南。
后续步骤
- 查看Google Cloud 资源层次结构,了解组织、文件夹和项目之间的关系。
- 详细了解 Compute Engine 的内部 DNS 名称。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-09-03。
-