内部 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 的所有组织或独立项目均默认使用此类型。 虚拟机实例名称在可用区内必须是唯一的,但可以跨可用区重复。例如,您可以拥有多个名为 instance-1 的实例,只要这些实例位于不同的可用区即可。
全局(项目范围)DNS VM_NAME.c.PROJECT_ID.internal 2018 年 9 月 6 日之前启用了 Compute Engine API 的所有组织或独立项目均默认使用此类型。 虚拟机实例名称在整个项目中必须是唯一的。您不能重复实例名称。

请替换以下内容:

  • 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 可以设置为 1500 字节。如需了解网络 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=ZonalPreferred 以启用可用区 DNS 搜索路径,同时仍保留全局 DNS 名称。具有此设置的实例可以使用可用区或全局 DNS 名称互相访问,并且可以继续访问仅配置了全局 DNS 名称的实例。此选项可用作尝试和测试可用区 DNS 名称的中间步骤。
  • 设置 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 名称。可用区 DNS 名称可降低跨区域服务中断的风险。

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

  1. 检查您的应用并更新它们以解决与“仅使用地区名称”设置的兼容性问题:
    • 通过实例名称或全局完全限定域名来访问实例的应用:实例名称和全局实例名称并不总在“仅使用地区名称”的环境中进行解析。最佳做法是更新这些名称以使用地区完全限定域名
    • 采用特定全局完全限定域名格式的应用:采用某种域名格式通常意味着应用设计中存在一项重大问题。Google 建议您将应用设计为独立于域名格式运行。
    • 不希望域名发生更改的应用:某些应用不希望域名发生更改,并且在获取新名称之前需要完全重启。如果可能,请更新您的应用以识别和处理实例域名中的更改。
  2. 您的应用在只使用可用区域名的情况下正常运行后,您可以在该 VPC 网络中停用全局名称。在内部虚拟私有云网络中将实例配置为使用 VmDnsSetting=ZonalOnly 设置,该设置仅使用可用区 DNS 名称:
    1. 通过在自定义元数据中设置相应的值,在一个实例上启用 VmDnsSetting=ZonalOnly
    2. 刷新该实例上的 DHCP 租约,以让实例开始使用地区 DNS 名称:
      • Linux 实例:sudo dhclient -v -r
      • Windows Server 实例:ipconfig /renew
    3. 测试该实例上的应用以确保它们按预期运行。
    4. 重复执行此过程以启用 VmDnsSetting=ZonalOnly 并刷新 VPC 网络中剩余实例上的 DHCP 租约,直到它们在仅使用地区 DNS 名称的情况下都能按预期运行。
  3. 在每个虚拟私有云网络中重复执行此过程,直到您项目中的所有实例都使用 VmDnsSetting=ZonalOnly 设置。您可以在项目级层元数据中设置 VmDnsSetting=ZonalOnly,以便此设置自动应用于您在该项目中创建的所有实例。

停用项目或实例上的地区 DNS

如需在特定实例上停用地区 DNS,请在该实例的元数据中设置 VmDnsSetting=GlobalOnly。如需在整个项目中停用地区 DNS,请在项目元数据中设置 VmDnsSetting=GlobalOnly,并确保未使用 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=GlobalOnly,并重启容器,以使其 DNS 设置恢复到原始状态。

后续步骤

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