本文档介绍了如何将现有项目从全球 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.
-
迁移项目以使用区域级 DNS:针对项目的 Project Editor (
roles/resourcemanager.projectEditor
) -
将虚拟机迁移到项目中的区域级 DNS:针对项目的 Compute Instance Admin (v1) (
roles/compute.instanceAdmin.v1
) -
如果您的虚拟机使用服务账号:针对服务账号或项目的 Service Account User (
roles/iam.serviceAccountUser
) -
检查全球 DNS 名称和虚拟机元数据:
compute.projects.get
-
在虚拟机上设置元数据:
compute.instances.setMetadata
-
设置项目范围的元数据:
compute.projects.setCommonInstanceMetadata
-
如果您的虚拟机使用服务账号:
iam.serviceAccounts.actAs
- 检查您的项目是否默认使用全球 DNS
- 使用查询分析确定项目的迁移就绪情况
- 迁移与区域级 DNS 兼容的项目
- 修正不兼容的查询
- 监控全局 DNS 日志以确认迁移就绪情况。
- 将剩余项目迁移到区域级 DNS
- 检查对区域级 DNS 所做的更改是否会影响您的项目
在 Google Cloud 控制台中,前往 Compute Engine 元数据页面。
在元数据标签页上,查看
vmdnssetting
设置(如果存在)。分配的值表示项目是否默认使用全球 DNS。GlobalDefault
:项目已启用全球 DNS。ZonalOnly
:项目已启用可用区级 DNS。 此项目不需要迁移。
如果未列出
vmdnssetting
元数据设置,请检查您的组织是否默认使用全球 DNS。GLOBAL_DEFAULT
:项目已启用全球 DNS。ZONAL_ONLY
:项目已启用可用区级 DNS。此项目不需要迁移。GLOBAL_DEFAULT
:项目已启用全球 DNS。ZONAL_ONLY
:项目已启用可用区级 DNS。此项目不需要迁移。zonal_dns_ready
(兼容查询):此指标表示在 100 天内可使用区域级 DNS 成功解析的查询总数。zonal_dns_risky
(不兼容的查询):此指标表示无法使用区域级 DNS 解析的查询总数。这些查询通常涉及跨地区通信或区域解析失败的其他场景。重要的是,如果此指标具有非零值,则表示您的项目尚未准备好迁移。您必须先解决这些不兼容的查询,然后才能切换为使用区域级 DNS。-
在 Google Cloud 控制台中,前往 leaderboard Metrics Explorer 页面:
如果您使用搜索栏查找此页面,请选择子标题为监控的结果。
在包含选择指标字段的工具栏右侧,点击代码编辑器、MQL 或 PromQL。
如果查询输入字段的标题不是 MQL 查询,请在查询输入字段的右下角,选择 MQL作为语言。
在查询输入字段中,按原样输入以下文本:
fetch compute.googleapis.com/Location | metric 'compute.googleapis.com/global_dns/request_count' | every 1d | within 7d
点击运行查询按钮。
Google Cloud 控制台会显示两个指标(
zonal_dns_ready
和zonal_dns_risky
)的图表,以及每个指标在一段时间内的相应查询数。查看
zonal_dns_risky
指标的值。- 如果该值为
0
,则表示项目已准备好迁移到可用区级 DNS。您可以按照将准备好的项目迁移到可用区级 DNS 中所述迁移项目。 - 如果该值为非零数字(例如上一屏幕截图中所示的
0.02k
),则在迁移到可用区级 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
- 调用其他项目中的计算实例
- 调用其他地区中的计算实例
使用 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 查询。
命令行实例通信
任务:尝试使用 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(包括区域名称)。
将以下内容添加到项目的元数据中:
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 实例:
更新实例的元数据,以包含
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
在拥有容器和虚拟机的项目中,将项目元数据设置
vmDnsSetting
设为GlobalDefault
。重启容器,使其 DNS 设置恢复到原始状态。
- 查看Google Cloud 资源层次结构,了解组织、文件夹和项目之间的关系。
- 详细了解 Compute Engine 的内部 DNS 名称。
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 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.
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
所需的角色
如需获得迁移项目以使用区域级 DNS 所需的权限,请让您的管理员为您授予以下 IAM 角色:
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
这些预定义角色包含将项目迁移到使用区域级 DNS 所需的权限。如需查看所需的确切权限,请展开所需权限部分:
所需权限
将项目迁移到使用区域级 DNS 需要以下权限:
将项目迁移到区域级 DNS
如需将项目迁移为使用区域级 DNS,请完成以下任务:
检查您的项目是否默认使用全球 DNS
检查您的项目,了解它们是否需要从使用全球 DNS 迁移到区域级 DNS。您只需迁移配置为对项目内创建的任何内部 DNS 名称使用全球 DNS 作为默认 DNS 的项目。
控制台
gcloud
运行以下 gcloud CLI 命令以检查
vmDnsSetting
的值。gcloud compute project-info describe --project=PROJECT_ID --flatten="vmDnsSetting"
将 PROJECT_ID 替换为该项目的名称。
返回的值表示项目是否默认使用全球 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。使用查询分析来确定项目的迁移准备情况
如需评估项目是否可以在不更改代码或更改全球 DNS 使用方式的情况下迁移到区域级 DNS,请 Google Cloud 分析您的 DNS 查询历史记录。此分析提供了以下指标,用于指明项目与区域级 DNS 的兼容性:
如需查看这些指标,请使用 Google Cloud 控制台中的 Metrics Explorer。
迁移与区域级 DNS 兼容的项目
使用以下任一选项迁移准备好切换到区域级 DNS 的项目:
修正不兼容的查询
项目未准备好迁移,意味着在某个时间段内(例如过去 30 天)至少发出了一个不兼容的 DNS 查询。不兼容的查询可能具有以下属性:
如果您的项目包含不兼容的查询, Google Cloud 控制台的虚拟机实例页面中会显示以下横幅:
如需修复所有不兼容的查询,建议您在查询中使用来源实例的区域级完全限定域名 (FQDN)。此方法可确保在将项目迁移到区域级 DNS 后,查询解析不会中断。
如需解决不兼容的查询问题,请执行以下操作:
在 Logs Explorer 中查看全球 DNS 日志
Logs Explorer 主要显示包含与区域级 DNS 不兼容查询的项目的全球 DNS 日志。这些日志可帮助您在迁移之前识别和分析有问题的查询。
您还可以针对这些不兼容的查询使用 Logs Explorer 执行以下操作:
检查对区域级 DNS 所做的更改是否会影响您的项目
迁移到区域级 DNS 后,请务必验证您的应用和服务是否仍能正常运行。由于区域级 DNS 会更改内部 DNS 名称的解析方式,因此如果某些应用依赖于全局 DNS 名称,可能会遇到问题。
以下部分介绍了如何检查潜在影响以及如何解决相关问题:
还原为使用全球 DNS
如需撤消迁移到可用区级 DNS 的操作,您可以将默认内部 DNS 类型更改回全球 DNS。您可以在组织、项目、实例或容器级别执行此操作。
还原为对项目使用全球 DNS
如需将项目还原为使用全球 DNS,请完成以下步骤。
将实例还原为使用全球 DNS
如需将特定实例还原为使用全球 DNS,请完成以下步骤。
还原为对容器使用全球 DNS
如果您在容器、Google Kubernetes Engine 或 App Engine 柔性环境中运行应用或工作负载,容器设置中的 DNS 配置可能在您重启容器后才会自动更新。如需在这些容器应用上停用可用区级 DNS,请完成以下步骤。
排查从全球 DNS 迁移到可用区级 DNS 过程中的问题
如果您在迁移过程中遇到问题,请参阅问题排查指南。
后续步骤
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2025-06-24。
-