将项目更新为使用区域级 DNS


本文档介绍了如何将现有项目从全球 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

    1. 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.

    2. Set a default region and zone.
    3. 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:针对项目的 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,请完成以下任务:

  1. 检查您的项目是否默认使用全球 DNS
  2. 使用查询分析确定项目的迁移就绪情况
  3. 迁移与区域级 DNS 兼容的项目
  4. 修正不兼容的查询
  5. 监控全局 DNS 日志以确认迁移就绪情况
  6. 将剩余项目迁移到区域级 DNS
  7. 检查对区域级 DNS 所做的更改是否会影响您的项目

检查您的项目是否默认使用全球 DNS

检查您的项目,了解它们是否需要从使用全球 DNS 迁移到区域级 DNS。您只需迁移配置为对项目内创建的任何内部 DNS 名称使用全球 DNS 作为默认 DNS 的项目。

控制台

  1. 在 Google Cloud 控制台中,前往 Compute Engine 元数据页面。

    转到元数据

  2. 元数据标签页上,查看 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

  1. 在 Google Cloud 控制台中,前往  Metrics Explorer 页面:

    进入 Metrics Explorer

    如果您使用搜索栏查找此页面,请选择子标题为监控的结果。

  2. 在包含选择指标字段的工具栏右侧,点击代码编辑器MQLPromQL

  3. 如果查询输入字段的标题不是 MQL 查询,请在查询输入字段的右下角,选择 MQL作为语言

  4. 在查询输入字段中,按原样输入以下文本:

    fetch compute.googleapis.com/Location
    | metric 'compute.googleapis.com/global_dns/request_count'
    | every 1d
    | within 7d
    
  5. 点击运行查询按钮。

    Google Cloud 控制台会显示两个指标(zonal_dns_readyzonal_dns_risky)的图表,以及每个指标在一段时间内的相应查询数。

    全球 DNS 使用情况指标的图表屏幕截图。

  6. 查看 zonal_dns_risky 指标的值。

    • 如果该值为 0,则表示项目已准备好迁移到可用区级 DNS。您可以按照将准备好的项目迁移到可用区级 DNS 中所述迁移项目。
    • 如果该值为非零数字(例如上一屏幕截图中所示的 0.02k),则在迁移到可用区级 DNS 后,某些查询可能无法正常运行。项目尚未准备好进行迁移。继续执行修复不兼容的查询中的步骤。

迁移与区域级 DNS 兼容的项目

使用以下任一选项迁移准备好切换到区域级 DNS 的项目:

  • 点击 Google Cloud 控制台中的使用区域级 DNS 按钮。

    1. 当您查看项目的虚拟机实例页面时,如果项目已准备好迁移(与区域级 DNS 查询兼容),则横幅中会包含关于使用区域级 DNS的建议。此建议基于项目中的内部 DNS 使用情况,但仅限于过去 30 天。

      控制台中准备好迁移到区域级 DNS 横幅的屏幕截图

      如果您点击使用区域级 DNS 按钮,系统会更新项目元数据以使用区域级 DNS。

    2. 可选:查看和查询虚拟机元数据,以确认元数据更改。

  • 手动更改项目元数据以使用区域级 DNS。

    1. 通过为项目设置 vmDnsSetting 元数据条目,为您的实例启用区域级 DNS。设置此元数据条目后,在使用搜索路径时,您的计算实例只能通过其区域级 DNS 名称 (VM_NAME.ZONE.c.PROJECT_ID.internal) 进行访问。这些实例仍保留区域级和全球搜索路径,但其全球 DNS 名称(未包含 ZONE)不再起作用。启用此设置后,仅同一地区且属于同一项目的实例才能通过全球名称互相访问。

      控制台

      1. 如需在项目级别更新设置,请在Google Cloud 控制台中前往 Compute Engine元数据页面。

        转到“自定义元数据”页面

      2. 点击 修改

      3. 如果存在值为 VmDnsSetting 的键,请将其值更改为 ZonalOnly

      4. 如果不存在值为 VmDnsSetting 的键,请点击 添加内容

        • 密钥字段中,输入 VmDnsSetting
        • 字段中,输入 ZonalOnly
      5. 如需完成自定义元数据条目的修改,请点击保存

      gcloud

      1. 如需更新当前项目的元数据设置,请使用 project-info add-metadata 命令

        gcloud compute project-info add-metadata \
            --metadata vmDnsSetting=ZonalOnly
        
      2. (可选)如需验证项目的元数据设置,请使用以下命令:

        gcloud compute project-info describe --project=PROJECT_ID --flatten="vmDnsSetting"
        

        PROJECT_ID 替换为要查询的项目名称。

      REST

      如需在项目级层更新元数据设置,请使用 projects.setCommonInstanceMetadata 方法构造 POST 请求。

      1. 可选:如需执行乐观锁定,您可以酌情提供指纹。

        指纹是由 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=",
           ...
         }
        }
        
      2. 构造一个针对 projects.setCommonInstanceMetadata 方法POST 请求,以设置元数据键值对:

        POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/setCommonInstanceMetadata
        
        {
        "fingerprint": "FikclA7UBC0=",
        "items": [
          {
          "key": "vmDnsSetting",
          "value": "ZonalOnly"
          }
        ]
        }
        

        PROJECT_ID 替换为项目 ID。

    2. 为项目配置 vmDnsSetting 元数据条目后,刷新该项目中每个实例的 DHCP 租约。您可以通过重启实例、等待租约到期或运行以下命令之一来刷新租约:

      Linux 实例

      sudo dhclient -v -r
      

      Windows 实例

      ipconfig /renew
      
    3. 检查您的项目是否使用区域级 DNS

修正不兼容的查询

项目未准备好迁移,意味着在某个时间段内(例如过去 30 天)至少发出了一个不兼容的 DNS 查询。不兼容的查询可能具有以下属性:

  • 调用其他项目中的计算实例
  • 调用其他地区中的计算实例

如果您的项目包含不兼容的查询, Google Cloud 控制台的虚拟机实例页面中会显示以下横幅:

横幅,指明您的项目尚未准备好迁移到区域级 DNS。

如需修复所有不兼容的查询,建议您在查询中使用来源实例的区域级完全限定域名 (FQDN)。此方法可确保在将项目迁移到区域级 DNS 后,查询解析不会中断。

如需解决不兼容的查询问题,请执行以下操作:

  1. 使用 Logs Explorer 访问并查询项目中计算实例的全球 DNS 使用情况。

    转到日志浏览器

  2. 选择项目。

  3. 应用资源和日志名称过滤条件:

    1. 点击资源
    2. 选择资源对话框中,选择虚拟机实例,然后点击应用
    3. 点击日志名称
    4. 选择日志名称对话框中,选择 gdnsusage,然后点击应用

    或者,您可以在查询字段中输入以下内容:

       resource.type="gce_instance"
       log_name="projects/PROJECT_ID/logs/compute.googleapis.com%2Fgdnsusage"
      
  4. 查询结果窗格中,每个查询都有一个 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 字段信息。

    gdnsusage 日志查询结果中的 jsonPayload 的屏幕截图。

  5. 使用您在上一步中获取的 jsonPayload 中的信息,确定要使用哪个 FQDN 来将全球 DNS 查询手动更新为使用区域级 DNS,从而使项目准备好迁移。要更新 FQDN 和解决兼容性问题的最常见应用场景如下:

    • 来自元数据服务器的内部 DNS 名称:无需执行任何操作,因为返回的 DNS 名称会在迁移到可用区级 DNS 后立即更改为可用区级 FQDN。如果 DNS 名称已缓存,您只需再进行一次调用即可更新缓存值。
    • 用于访问其他区域中的虚拟机的内部 DNS 名称:如果您的应用为不同区域中的虚拟机使用内部 DNS 名称,您可以修改 DHCP 政策或配置文件以将该可用区包含在另一个区域中。
    • 硬编码的全球 FQDN:如果您有一个应用为虚拟机使用硬编码的全球 FQDN 名称,则可以更新应用中的调用以改用内部 DNS 名称或可用区级 FQDN。您可以通过 Terraform 中的代码更改或配置更改来进行此项更改。
    • 服务项目中使用共享 VPC 网络的虚拟机:如果服务项目中的虚拟机使用共享 VPC 网络且需要解析这些虚拟机的 DNS 名称,您必须使用虚拟机的可用区级 FQDN。
  6. 将全球 DNS 查询更新为使用区域级 DNS 后,请执行以下操作:

    1. 使用 Logs Explorer 页面再次查询全球 DNS 使用情况。 修复所有阻塞的全球 DNS 查询后,查询结果中不应再显示调试日志。

    2. 重新检查监控指标,了解是否已移除所有不兼容的 DNS 查询。

在 Logs Explorer 中查看全球 DNS 日志

Logs Explorer 主要显示包含与区域级 DNS 不兼容查询的项目的全球 DNS 日志。这些日志可帮助您在迁移之前识别和分析有问题的查询。

您还可以针对这些不兼容的查询使用 Logs Explorer 执行以下操作:

  • 创建信息中心:直观呈现不兼容的全球 DNS 查询模式,以深入了解应用的通信行为。
  • 汇总日志:分析整个组织的 DNS 日志,以发现更广泛的趋势和潜在的改进领域。

检查对区域级 DNS 所做的更改是否会影响您的项目

迁移到区域级 DNS 后,请务必验证您的应用和服务是否仍能正常运行。由于区域级 DNS 会更改内部 DNS 名称的解析方式,因此如果某些应用依赖于全局 DNS 名称,可能会遇到问题。

以下部分介绍了如何检查潜在影响以及如何解决相关问题:

  1. 命令行实例通信

    任务:尝试使用 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

  2. Compute Engine 服务中的实例通信

    任务:如果您对依赖于内部 DNS 名称的托管式实例组 (MIG) 使用健康检查,请检查健康检查是否通过。

    潜在错误:“健康检查失败”— 这表示健康检查因 DNS 解析问题而无法到达目标。

    解决方案:确保健康检查使用的是目标实例的 FQDN,包括区域名称。

  3. 特定于应用的用例

    许多应用都依赖于内部 DNS 来执行以下任务:

    • 连接到数据库(例如 Cloud SQL)
    • 与消息队列(例如 Pub/Sub)互动

    • 潜在错误:这些错误因应用而异,但可能包括:

      • “无法连接到 SERVICE_NAME
      • “连接已超时”
      • “没有此类主机”
    • 解决方案:检查应用的配置,确保引用服务时使用 FQDN(包括区域名称)。

还原为使用全球 DNS

如需撤消迁移到可用区级 DNS 的操作,您可以将默认内部 DNS 类型更改回全球 DNS。您可以在组织、项目、实例或容器级别执行此操作。

还原为对项目使用全球 DNS

如需将项目还原为使用全球 DNS,请完成以下步骤。

  1. 将以下内容添加到项目的元数据中:vmDnsSetting=GlobalDefault

    如需了解如何设置项目元数据值,请参阅设置和移除自定义元数据

  2. 验证项目中所有实例均未将 vmDnsSetting 元数据值设置为 ZonalOnly

    gcloud compute instances describe INSTANCE_NAME --flatten="metadata[]"
    

    INSTANCE_NAME 替换为要检查的实例的名称。

  3. 刷新每个实例上的 DHCP 租期。您可以通过重启实例、等待租约到期或在客机操作系统中运行以下命令之一来刷新租约:

    • Linux 实例:sudo dhclient -v -r
    • Windows Server 实例:ipconfig /renew

将实例还原为使用全球 DNS

如需将特定实例还原为使用全球 DNS,请完成以下步骤。

  1. 更新实例的元数据,以包含 vmDnsSetting=GlobalDefault

    如需了解如何设置计算实例元数据值,请参阅设置和移除自定义元数据

  2. 如需强制更改 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,请完成以下步骤。

  1. 在拥有容器和虚拟机的项目中,将项目元数据设置 vmDnsSetting 设为 GlobalDefault

  2. 重启容器,使其 DNS 设置恢复到原始状态。

排查从全球 DNS 迁移到可用区级 DNS 过程中的问题

如果您在迁移过程中遇到问题,请参阅问题排查指南

后续步骤