内部 DNS 概览


当您创建 Compute Engine 虚拟机 (VM) 实例时,内部 DNS 会自动为虚拟机创建 DNS 名称。此 DNS 名称通过解析内部 IP 地址来支持内部虚拟机之间的通信。Google Cloud 上的 Virtual Private Cloud 网络使用内部 DNS 服务允许同一网络内的虚拟机使用内部 DNS 名称彼此访问。

Google Cloud 会在您管理虚拟机时自动创建、更新和移除以下 DNS 记录类型:

  • DNS 地址记录(即 A 记录)是为 .internal 的 DNS 区域中的虚拟机创建的。
  • 用于DNS 反向查找的虚拟机 PTR 记录是在相应的反向区域中创建的。

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

限制

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

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

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

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

可用区级和全局内部 DNS 名称

Google Cloud 有两种类型的内部 DNS 名称:

  • 可用区级 DNS:虚拟机名称在每个可用区内必须是唯一的,但您可以跨可用区重复使用虚拟机名称。例如,您可以有多个名为 instance-1 的虚拟机,只要这些虚拟机位于不同的可用区即可。
  • 全局 DNS:虚拟机名称在每个项目中必须是唯一的。使用全局 DNS 时,您无法在项目中重复使用虚拟机名称。

Google 强烈建议使用可用区级 DNS,因为它可将 DNS 注册中的故障隔离到个别可用区,从而提供更高的可靠性保证。如果发生服务中断,全局 DNS 会出现以下问题:

  • 虚拟机名称在整个项目中必须是唯一的。因此,您无法在发生控制平面故障且已拥有或之前拥有项目资源的任何区域中创建新虚拟机。Google Cloud 无法验证不可用的区域中的现有资源 DNS 名称。
  • Compute Engine 的某些功能不可用,例如代管式实例组 (MIG) 自动扩缩。因此,使用自动扩缩功能来从容处理工作负载增加情况的应用将无法扩容。

默认内部 DNS 类型是启用 Compute Engine API 时设置的。

  • 默认内部 DNS 类型是可用区级 DNS。
  • 如果您的组织或独立项目在 2018 年 9 月 6 日之前启用了 Compute Engine API,则默认的内部 DNS 类型设置为全局 DNS。

下表介绍了内部 DNS 名称的完全限定域名。

内部 DNS 类型 完全限定域名 (FQDN)
地区 DNS VM_NAME.ZONE.c.PROJECT_ID.internal
全局(项目范围)DNS VM_NAME.c.PROJECT_ID.internal

替换以下内容:

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

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

DNS 名称解析

虚拟机将内部 DNS 解析信息作为其 DHCP 租约的一部分接收。DNS 解析的方法取决于操作系统平台:

  • Linux:默认情况下,虚拟机的 DNS 服务器 (169.254.169.254:53) 会解析内部 DNS 名称。
  • Windows:默认情况下,子网的默认网关会解析内部 DNS 名称。

PTR 记录的反向区域

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.

内部 DNS 名称和共享 VPC

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

自定义内部 DNS 名称

某些组织或应用可能需要自定义内部 DNS 名称,而不是 Google Cloud 创建的默认内部 DNS 名称。

Cloud DNS 专用区域和自定义记录

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

如需创建用于替换自动创建的内部 DNS PTR 名称的自定义 PTR 记录,请参阅专用区域中的 RFC 1918 地址的 PTR 记录。如需了解如何为虚拟机创建 PTR 记录,请参阅为虚拟机实例创建 PTR 记录

自定义主机名

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

内部 DNS 和 DHCP

Compute Engine 虚拟机被配置为每 24 小时续订一次 DHCP 租约。对于启用了可用区级 DNS 的虚拟机而言,DHCP 租约每小时到期一次。使用可用区级 DNS 的虚拟机在 DHCP 配置文件中同时具有可用区级条目和全局条目。

默认情况下,大多数 Linux 发行版都将 DHCP 信息存储在 resolv.conf 中。每当虚拟机上 DHCP 租约到期时,手动修改 resolv.conf 都会将其恢复为默认的 DHCP。为了在 resolv.conf 文件中进行静态修改,多种 Linux 发行版都允许您在 DHCP 政策的开头或末尾处附加相应修改项。

修改 DHCP 政策或配置文件的方式取决于您使用的 Linux 发行版。例如,Red Hat Enterprise Linux 和 Debian 使用 /etc/dhcp/dhcpd.conf 配置文件。在 CentOS 上,使用网络管理器命令行实用程序 nmcli

如需了解如何配置自定义 DHCP 和 DNS 网络设置,请参阅操作系统文档。

resolv.conf 文件示例

默认情况下,大多数 Linux 发行版都将 DHCP 信息存储在 resolv.conf 中。systemd-resolved 服务还提供 DNS 解析器服务。您可以通过修改 /etc/systemd/resolved.conf.d/ 目录中的 /etc/systemd/resolved.conf 文件和其他 *.conf 文件来配置此服务。在将 DHCP 信息存储在 resolved.conf 中的 Linux 发行版上,您可以查看 /etc/systemd/resolved.conf 文件中的可用区级 DNS 条目和全局 DNS 条目。

这些文件具有以下限制:

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

可用区级 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:虚拟机所属的项目

dhclient.conf 文件示例

某些操作系统(如 Debian 9)使用 dhclient.conf 文件,而不是 resolv.conf 文件。

示例 /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 地址。

后续步骤