内部 DNS

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

Google Cloud 上的虚拟私有云网络具有一项内部 DNS 服务,允许同一网络内的实例使用内部 DNS 名称彼此访问。虚拟机实例的内部 A 记录是在 .internal 的 DNS 区域中创建的。虚拟机实例的 PTR 记录是在相应的反向区域中创建的。在您管理实例时,Google Cloud 会自动创建、更新和移除这些 DNS 记录。

举例来说,如果您删除了一个实例,Google Cloud 会自动移除与其 .internal DNS 名称相关联的 A 和 PTR 记录。如果您随后创建了一个同名实例,Google Cloud 将为替换实例创建一条记录。

关于内部 DNS

内部 DNS 名称具有以下规范:

  • 虚拟机实例的内部 DNS 名称只会解析为其主要内部 IP 地址。内部 DNS 名称不能用于连接到实例的外部 IP 地址。

  • 无法通过配置使内部 DNS 名称解析为辅助别名 IP

  • 只能通过位于同一网络中的虚拟机解析内部 DNS 名称。这些虚拟机可以与网络位于同一项目中,也可以位于使用同一共享 VPC 网络的服务项目中。如需解析服务项目中虚拟机的 DNS 名称,您必须使用虚拟机的 FQDN。您无法使用内部 DNS 访问其他网络中的虚拟机。

内部 DNS 名称的类型

Google Cloud 有两种类型的内部 DNS 名称。默认内部 DNS 类型根据启用 Compute Engine API 的时间设置。

通常,Google 强烈建议使用可用区 DNS,因为它可将 DNS 注册中的故障隔离到个别可用区,从而提供更高的可靠性保证。

内部 DNS 类型 完全限定域名 (FQDN) 项目的默认类型 备注
地区 DNS VM_NAME.ZONE.c.PROJECT_ID.internal 2018 年 9 月 6 日之后启用了 Compute Engine API 的所有组织或独立项目均默认使用此类型。 虚拟机实例名称在每个可用区中必须是唯一的。但是,使用可用区级 DNS 时,您可以跨可用区重复使用虚拟机实例名称。例如,您可以有多个名为 instance-1 的实例,只要这些实例位于不同的可用区即可。
全局(项目范围)DNS VM_NAME.c.PROJECT_ID.internal 2018 年 9 月 6 日之前启用了 Compute Engine API 的所有组织或独立项目均默认使用此类型。 虚拟机实例名称在整个项目中必须是唯一的。使用全局 DNS 时,您无法在项目中重复使用虚拟机实例名称。

请替换以下内容:

  • VM_NAME:虚拟机的名称。对于地区 DNS,此值在地区内必须是唯一的,但可以跨地区重复。对于全局 DNS,实例名称在整个项目中必须是唯一的。
  • ZONE:实例所在的可用区
  • PROJECT_ID:实例所属的项目

如需了解如何控制在项目级层或实例级层使用哪种内部 DNS 名称,请参阅为项目或实例配置 DNS 名称

PTR 记录和内部 DNS

Google Cloud 的内部 DNS 服务会自动为以下反向地区中的虚拟机创建 PTR 记录:

  • 10.in-addr.arpa.
  • 168.192.in-addr.arpa.
  • 16.172.in-addr.arpa.17.172.in-addr.arpa.、......一直到 31.172.in-addr.arpa.

使用 Cloud DNS 自定义记录

您可以使用 Cloud DNS 专用地区为虚拟机实例创建自定义 DNS 条目。您可以配置 PTR 记录,以使用您提供的自定义网址替换默认的内部 DNS 虚拟机网址。

如需创建用于替换自动创建的内部 DNS PTR 名称的自定义 PTR 记录,请参阅专用区域中的 RFC 1918 地址的 PTR 记录

自定义主机名

您可以在创建虚拟机时为其指定自定义主机名。内部 DNS 不会解析以此方式分配的自定义主机名。使用自定义主机名,您仍然需要在适当的地区创建相应的 DNS 记录(例如,使用 Cloud DNS)。如需了解详情,请参阅使用自定义主机名创建虚拟机实例

内部 DNS 名称和共享 VPC

即使实例的内部 IP 地址位于宿主项目的共享 VPC 网络中,您也可以使用内部 DNS 名称来指代该 IP 地址。对于共享 VPC,可用区或全局(项目范围)内部 DNS 名称中的项目 ID 部分是服务项目的 ID。

确定虚拟机实例的内部 DNS 名称

按照以下过程读取分配给虚拟机实例的内部 DNS 名称。内部 DNS 名称的可靠来源是其元数据服务器

  1. 连接到虚拟机实例
  2. 查询 hostname 元数据:

    Linux 虚拟机

    curl "http://metadata.google.internal/computeMetadata/v1/instance/hostname" \
      -H "Metadata-Flavor: Google"
    

    Windows 虚拟机

    Invoke-RestMethod `
      -Headers @{"Metadata-Flavor" = "Google"} `
      -Uri "http://metadata.google.internal/computeMetadata/v1/instance/hostname"
    

元数据服务器以以下某一格式返回虚拟机的主机名,并且显示虚拟机使用的内部 DNS 名称的类型

  • 区域 DNSVM_NAME.ZONE.c.PROJECT_ID.internal
  • 全球 DNSVM_NAME.c.PROJECT_ID.internal

在输出中:

  • VM_NAME:虚拟机实例的名称
  • ZONE:实例所在的区域
  • PROJECT_ID:实例所属的项目

通过内部 DNS 访问虚拟机

元数据服务器也是虚拟机发出的 DNS 查询的域名服务器解析器。元数据服务器会对所有 DNS 查询执行解析,包括解析为内部 DNS 名称和外部 DNS 名称。对于外部 DNS 查询,元数据服务器会将请求传递到 Google 的公开域名服务器。

以下示例使用 ping 来检查使用地区 DNS 的实例是否连接。如果您已创建允许传入 ICMP 流量进入实例的防火墙规则,则可以使用这种方法。

$ ping VM_NAME.ZONE.c.PROJECT_ID.internal -c 1

PING VM_NAME.ZONE.c.PROJECT_ID.internal (10.240.0.17) 56(84) bytes of data.
64 bytes from VM_NAME.ZONE.c.PROJECT_ID.internal (10.240.0.17): icmp_seq=1 ttl=64 time=0.136 ms

请替换以下内容:

  • VM_NAME:虚拟机实例的名称
  • ZONE:实例所在的区域
  • PROJECT_ID:实例所属的项目

内部 DNS 和 resolv.conf

默认情况下,大多数 Linux 发行版都将 DHCP 信息存储在 resolv.conf 中。Compute Engine 实例被配置为每 24 小时续订一次 DHCP 租约。对于启用了可用区 DNS 的实例而言,DHCP 租约每小时到期一次。DHCP 续订操作会覆盖此文件,从而撤消您之前可能做过的任何更改。使用可用区 DNS 的实例在 resolv.conf 文件中同时具有可用区条目和全局条目。

在将 DHCP 信息存储在 systemd.resolved.conf 中的 Linux 发行版上,您可以查看 /etc/systemd/resolved.conf 文件中的地区 DNS 条目和全局 DNS 条目。

注意:VPC 网络的默认最大传输单元 (MTU)1460 个字节。不过,可以将网络 MTU 设置为标准以太网 MTU(即 1500 字节),设置为最多 8896 字节(对于巨型帧),或者设置为低至 1300。如需详细了解网络 MTU,请参阅最大传输单元概览

地区 DNS

示例地区 resolv.conf 文件:

# Local domain name. Computed from your project name.
domain ZONE.c.PROJECT_ID.internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
search ZONE.c.PROJECT_ID.internal. c.PROJECT_ID.internal. google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254

请替换以下内容:

  • ZONE:实例所在的可用区
  • PROJECT_ID:实例所属的项目

示例地区 dhcp.lease 文件:

lease {
  # What interface we are using for the network
  interface "eth0";
  fixed-address 10.128.0.9;
  option subnet-mask 255.255.255.255;
  option routers 10.128.0.1;
  # Lease timeout, older VM instances will have this value set to infinite.
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 169.254.169.254;
  option dhcp-server-identifier 169.254.169.254;
  option interface-mtu 1460;
  # Search path options that are copied into the resolv.conf
  option domain-search "ZONE.c.PROJECT_ID.internal.", "c.PROJECT_ID.internal.", "google.internal.";
  option ntp-servers 169.254.169.254;
  option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
  option host-name "VM_NAME.ZONE.c.PROJECT_ID.internal";
  option domain-name "ZONE.c.PROJECT_ID.internal";
  renew 4 2017/11/16 02:15:52;
  rebind 4 2017/11/16 02:43:59;
  expire 4 2017/11/16 02:51:29;
}

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • ZONE:虚拟机所在的地区
  • PROJECT_ID:虚拟机所属的项目

全局 DNS

示例全局 resolv.conf 文件:

# Local domain name. Computed from your project name.
domain c.PROJECT_ID.internal
# Search list for hostname lookup. Starting with entries that represent
# your project and ending with google.internal to facilitate metadata server requests.
search c.PROJECT_ID.internal google.internal.
# Address of the DNS server to resolve project specific, and global domain names.
nameserver 169.254.169.254

PROJECT_ID 替换为实例所属的项目。

示例全局 dhcp.lease 文件:

lease {
  # What interface we are using for the network
  interface "eth0";
  fixed-address 10.128.0.8;
  option subnet-mask 255.255.255.255;
  option routers 10.128.0.1;
  # Lease timeout, older VM instances will have this value set to infinite.
  option dhcp-lease-time 86400;
  option dhcp-message-type 5;
  option domain-name-servers 169.254.169.254;
  option dhcp-server-identifier 169.254.169.254;
  option interface-mtu 1460;
  # Search path options that are copied into the resolv.conf
  option domain-search "c.PROJECT_ID.internal.", "google.internal.";
  option ntp-servers 169.254.169.254;
  option rfc3442-classless-static-routes 32,10,128,0,1,0,0,0,0,0,10,128,0,1;
  option host-name "VM_NAME.c.PROJECT_ID.internal";
  option domain-name "c.PROJECT_ID.internal";
  renew 4 2017/11/16 12:07:00;
  rebind 4 2017/11/16 22:44:53;
  expire 5 2017/11/17 01:44:53;
}

请替换以下内容:

  • VM_NAME:虚拟机的名称
  • PROJECT_ID:虚拟机所属的项目

这些文件具有以下限制:

  • 搜索路径只能处理 6 条记录,其中 3 条记录由 Compute Engine 提供。如果您向搜索路径中添加条目,使得条目总数超过 6 个,则操作系统将不会应用第 6 个条目之后的搜索规则。这可能导致 Compute Engine 功能不起作用,例如无法通过其实例名称访问实例。
  • 每当实例上为期 24 小时的 DHCP 租约到期时,对 resolv.conf 的任何手动修改都将恢复为默认的 DHCP。在使用地区 DNS 的实例上,DHCP 租约每小时到期一次。为了在 resolv.conf 文件中进行静态修改,多种 Linux 发行版都允许您在 DHCP 政策的开头或末尾处附加相应修改项。

Debian 9

示例 /etc/dhcp/dhclient.conf 文件:

# Configuration file for /sbin/dhclient.
#
...
append domain-search "mydomain.com";
prepend domain-name-servers 172.16.1.1;

其中 mydomain.com 是新的搜索网域,172.16.1.1 是您的 DNS 服务器的 IP 地址。

地区 DNS 名称

地区 DNS 名称包括虚拟机的名称、虚拟机所在的可区及拥有虚拟机的项目。全局 DNS 名称不包含虚拟机所在的地区。一个位置中的可用区级 DNS 名称是独立于其他位置使用的,这使您可以构建更多可用性更好的容错型多区域应用。

现有项目和组织可以继续使用全局 DNS 名称,但最好迁移到可用区级 DNS 名称,以实现区域隔离并改善多区域可靠性。

为项目或实例配置 DNS 名称

通过在项目或实例元数据中设置 VmDnsSetting 变量,为您的实例启用可用区 DNS 和全局 DNS。如果在特定实例的元数据中设置 VmDnsSetting 变量,它将替换从该实例的项目元数据继承而来的任何 VmDnsSetting 变量。

VmDnsSetting 变量支持以下设置:

  • 建议:设置 VmDnsSetting=ZonalOnly 以使您的实例只能通过其可用区 DNS 名称来访问。实例仍保留地区搜索路径和全局搜索路径,但其全局 DNS 名称不再起作用。其他实例只能使用地区 DNS 名称来访问采用此设置的实例,并且无法使用其全局 DNS 名称或搜索路径来访问这些实例。只要您的应用可支持此设置,它就是更可靠的首选选项。2018 年 9 月 6 日之后启用 Compute Engine API 的独立项目及组织中创建的项目内的实例均默认使用此设置。
  • 设置 VmDnsSetting=GlobalDefault 以便实例注册全局和可用区 DNS 名称,但仅使用全局名称作为默认域名和搜索路径条目。2018 年 9 月 6 日之前启用 Compute Engine API 的独立项目及组织中创建的项目内的实例均默认使用此设置。

请注意,将项目迁移到其他组织时,系统不会更改项目的默认 DNS 名称。

如需了解如何设置项目元数据值或实例元数据值,请参阅设置自定义元数据

为实例配置 VmDnsSetting 变量后,刷新实例上的 DHCP 租约。您可以通过重启实例、等待租约到期或运行以下命令之一来刷新租约:

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

刷新 DHCP 租期后,检查是否已为虚拟机启用可用区级 DNS

在未来的/新的项目中强制执行“仅限可用区级 DNS”

与内部全局 DNS 相比,内部可用区级 DNS 通过将 DNS 注册中的故障隔离到个别可用区来提供更高的可靠性。Google 强烈建议尽可能改用可用区级 DNS。

如果在 2018 年 9 月 6 日之前创建的组织下创建了新项目,则该项目的内部 DNS 类型仍默认为全局 DNS。为避免与全局 DNS 相关的可靠性风险,您可以在组织或文件夹级层强制执行布尔值组织政策 constraints/compute.setNewProjectDefaultToZonalDNSOnly。当您设置此类政策以替换默认 DNS 设置时,新创建的项目会默认使用内部可用区级 DNS:但该政策不会影响已启用 Compute Engine API 的现有项目。如需将现有项目切换为使用可用区级 DNS,请参阅将现有项目切换为可用区级 DNS

要执行此政策更改,您必须拥有 IAM 角色 roles/orgpolicy.policyAdmin 的文件夹或组织级层访问权限。

按照以下步骤设置文件夹或组织的组织政策:

  1. 以 Google Workspace 或 Cloud Identity 超级用户身份登录 Google Cloud Console。

  2. 在控制台中,转到组织政策页面。

    转到组织政策

  3. 选择您要查看其组织政策的文件夹或组织。可用的组织政策限制条件列表会显示在一页或多页中。

  4. 如需查找强制执行可用区级 DNS 的政策,请点击过滤条件并选择名称,然后将过滤条件名称设置为将新项目的内部 DNS 设置设为“仅限可用区级 DNS”

  5. 点击政策名称以查看其详细信息

  6. 政策详情页面提供限制条件的相关信息以及限制条件当前的应用方式。默认情况下,系统不会为文件夹或组织定义强制执行。但是,如果父文件夹具有已定义的强制执行,则强制执行将从具有已定义强制执行的最近父文件夹继承。如需了解详情,请参阅了解层次结构评估页面。

  7. 要自定义组织政策,请点击修改

  8. 在修改页面中,选择自定义

  9. 强制执行下,选择强制执行选项:

    • 如需强制执行限制条件,请选择启用。对于新项目,默认的内部 DNS 类型是可用区级 DNS。
    • 要停用限制条件,请选择关闭。默认项目 DNS 类型仍由组织创建时间决定。
  10. 点击保存

如需验证组织政策更改,您可以在文件夹或组织下创建一个新项目,然后创建虚拟机实例检查是否已为虚拟机启用可用区级 DNS

如果需要内部全局 DNS 来解析工作负载中内置的 DNS 名称查询,则可以停用强制执行,以在组织或文件夹级层回滚此更改。

将现有项目切换为使用可用区级 DNS 名称

2018 年 9 月 6 日之后,Google Cloud 上的所有新组织的默认内部 DNS 类型从全局 DNS 更改为可用区级 DNS。如果现有项目仍在使用全局 DNS,Google 强烈建议将这些项目切换为使用内部可用区级 DNS 名称。可用区级 DNS 可降低跨区域服务中断的风险。

通常,您可以通过以下过程执行迁移:

  1. 检查您的应用并更新它们以解决与“仅限可用区级 DNS”设置的兼容性问题:
    • 如果您有任何使用硬编码的内部全局 DNS 名称的应用,请将它们改为使用内部可用区级 DNS 名称。
    • 如果虚拟机名称用于访问其他可用区中的实例,请确保在查询中添加目标可用区名称,例如 <DESTINATION_VM_NAME>.<DESTINATION_ZONE_NAME>
    • 要使用共享 VPC 网络解析服务项目中虚拟机的 DNS 名称,您必须使用虚拟机的可用区级完全限定域名
  2. 如需将项目切换为使用内部可用区级 DNS,请在项目级层元数据中设置 VmDnsSetting=ZonalOnly

如需测试项目元数据已更新,您可以运行 gcloud compute project-info describe --flatten="commonInstanceMetadata[VmDnsSetting]"。该命令应返回 ZonalOnly

将项目或实例还原为全局 DNS

如需将特定实例还原为全局 DNS,请将以下内容添加到实例的元数据中:VmDnsSetting=GlobalDefault

如需将项目还原为全局 DNS,请将以下内容添加到项目的元数据中:VmDnsSetting=GlobalDefault。并确保未使用 VmDnsSetting 元数据值单独配置您的任何实例。如需了解如何设置项目元数据值或实例元数据值,请参阅设置自定义元数据

如需强制更改 DNS 配置,请重启虚拟机实例的网络:

  • Container-optimized OS/Ubuntu:sudo systemctl restart systemd-networkd
  • CentOS/RHEL/Fedora CoreOS/Rocky Linux:sudo systemctl restart network
  • Debian:sudo systemctl restart networking
  • Windows:ipconfig /renew

如果您在容器、Google Kubernetes Engine 或 App Engine 柔性环境中运行应用,容器设置中的 DNS 配置可能不会自动更新,直到您重启容器。如需在这些容器应用上停用地区 DNS,必须在项目和实例中设置 VmDnsSetting=GlobalDefault,并重启容器,以使其 DNS 设置恢复到原始状态。

后续步骤

  • 如需了解 Google Cloud VPC 网络,请参阅 VPC 概览
  • 如需了解如何创建和修改 VPC 网络,请参阅使用 VPC