使用 Cloud DNS

此页面介绍如何使用 Cloud DNS 和 Cloud Tools for PowerShell 为网域配置 DNS 设置。本文将通过一个简单示例,说明如何创建一个托管地区来管理网域及其子网域,然后将资源记录添加到该地区,以在处理发送给该地区网域的请求时提供用于确定 DNS 服务器行为的信息。

本文档假定您拥有域名以及该域名可以指向的 IP 地址。如果您没有域名,可以通过 Google Domains 或您选择的其他域名注册商注册一个域名。

如需详细了解 Cloud DNS cmdlet,请参阅 Cloud Tools for PowerShell cmdlet 参考。如需从整体上了解 Cloud DNS,请参阅 Cloud DNS 概览

为网域创建托管地区

整个 DNS 命名空间由许多网域组成,这些网域很快将包含您自己的域名。Cloud DNS 中的托管式区域为 DNS 区域建模,并充当容器,用于组织同一 DNS 名称后缀的 DNS 记录(例如 A、CNAME 或 TXT 条目)。例如,“example.com.”和子网域(例如“first.example.com.”)的记录可以位于同一地区,因为它们共用“example.com.”后缀。请注意结尾的句点,这是必需的,用于表示绝对 DNS 名称。

要开始使用,请设置托管地区以组织您将为域名创建的 DNS 记录。您可以创建新的托管区域,并使用 Add-GcdManagedZone cmdlet 将其添加到 Google Cloud 控制台项目:

Add-GcdManagedZone `
    -Name "my-new-zone" `
    -DnsName "example.com." `
    -Description "This is my first zone."

这将创建一个包含指定详细信息的新地区,并将其添加到活动 gcloud CLI 配置的当前项目中,但如果需要,您也可以选择指定其他项目 ID。此外,这还会为您在地区中创建默认的 NS 和 SOA 记录

不过,要将地区中的新记录发布到互联网,还需要更新域名服务器以使用 Cloud DNS。即使您的网域已在 Google Domains 中注册,您仍需更新其域名服务器

要查找分配给您的网域的 Cloud DNS 域名服务器,您可以在管理该网域的托管地区上使用 Get-GcdManagedZone cmdlet 返回有关该地区的信息:

Get-GcdManagedZone -Zone "my-new-zone"

添加和移除资源记录集

DNS 资源记录提供的信息指示了 DNS 服务器在处理发送到网域的请求时的行为。例如,DNS 记录可用于告知服务器要将网域解析到的 IP 地址,指示网域的可用邮件交换服务器等等。

在 Cloud DNS 中,您可以在地区中添加或移除 DNS 记录以配置此类行为。要添加或移除不可变资源记录集,您不能直接对地区中的记录进行操作,而是要分别使用 New-GcdResourceRecordSetGet-GcdResourceRecordSet cmdlet 创建独立的资源记录或检索现有资源记录,然后使用 Add-GcdChange cmdlet 将包含这些记录的更改请求发送到特定地区。

创建资源记录集

您可以使用帮助程序 cmdlet New-GcdResourceRecordSet 创建一个资源记录集,可以将创建的资源记录集放入更改中,然后添加到托管地区中或从托管地区中移除。

例如,如果要创建 A 记录以将网域指向格式为 #.#.#.# 的外部 IPv4 地址(如果有 IPv6 地址,请使用 AAAA 记录),您可以使用以下命令:

$ARecord = New-GcdResourceRecordSet `
    -Name "example.com." -Rrdata "107.1.23.134" -Type "A"

同样,要为 www 子网域创建 CNAME 记录,以将“www.example.com.”解析为相同的 IP 并且行为与“example.com.”相同,您可以使用以下命令:

$CNAMERecord = New-GcdResourceRecordSet `
    -Name "www.example.com." -Rrdata "example.com." -Type "CNAME"

您可以创建并包含在地区更改中的受支持资源记录类型包括 A、AAAA、CNAME、MX、NAPTR、NS、PTR、SOA、SPF、SRV 和 TXT。若在确定所需记录以及如何创建记录时需要帮助,请参阅支持的 Cloud DNS 资源记录格式

检索资源记录集

如果要检索地区中的现有资源记录集,可以使用 Get-GcdResourceRecordSet cmdlet 返回地区中的所有记录,然后将结果编入索引:

$allRecords = Get-GcdResourceRecordSet -Zone "my-new-zone"
$record0 = $allRecords[0]

如果您只需要特定类型的记录,可以相应地过滤结果:

$ARecord = Get-GcdResourceRecordSet -Zone "my-new-zone" -Filter "A"

将更改应用于托管地区

cmdlet New-GcdResourceRecordSetGet-GcdResourceRecordSet 都会返回资源记录集,但它们不会将记录添加到任何地区中或从地区中移除。为此,请使用 Add-GcdChange cmdlet:

Add-GcdChange `
    -Zone "my-new-zone" -Add $record1,$record2 -Remove $record0

例如,要将上文创建的 A 记录和 CNAME 记录添加到我们的地区,请执行以下操作:

Add-GcdChange -Zone "my-new-zone" -Add $ARecord,$CNAMERecord

如果您以后想更改将网域解析到的 IPv4 地址,您可以创建新的 A 类型记录,然后将其添加到托管地区,同时删除旧的 A 记录:

$oldARecord = Get-GcdResourceRecordSet -Zone "my-new-zone" -Filter "A"
$newARecord = New-GcdResourceRecordSet `
    -Name "example.com." -Rrdata "104.1.34.167" -Type "A"
Add-GcdChange -Zone "my-new-zone" -Remove $oldARecord -Add $newARecord

每次调用 Add-GcdChange cmdlet 都会返回新执行的更改请求对象。您还可以向 Add-GcdChange cmdlet 传递一个更改请求对象以直接执行,而不是传递资源记录集列表:

Add-GcdChange -Zone "my-new-zone" -ChangeRequest $change0

建议不要手动创建更改请求对象,但如果要重新应用先前所做的更改或在不同地区中进行的更改,更改请求对象会很有用。 您可以使用 Get-GcdChange cmdlet 检索过去应用于某个地区的所有更改请求对象:

$allChanges = Get-GcdChange -Zone "my-new-zone"

您可以通过为上一个结果编制索引来选择特定更改,或指定要使用 ChangeId 检索哪个更改。更改请求通常根据其发送到地区的顺序从 0 开始编号:

$firstChange = Get-GcdChange -Zone "my-new-zone" -ChangeId 0
Add-GcdChange -Zone "my-new-zone" -ChangeRequest $firstChange

删除托管地区

有时,您可能希望完全移除托管地区。出现这种情况有很多原因。也许您为子网域“user1.example.com.”托管了地区“user1-zone”,但 user1 删除了自己的账号,在这种情况下,您便想要移除该子网域和所有关联的 DNS 记录。

要从项目中移除托管地区,请使用 Remove-GcdManagedZone cmdlet:

Remove-GcdManagedZone -Zone "user1-zone"

如果成功,该命令不会返回任何内容。

但是,此 cmdlet 不会立即处理 Cloud DNS 认为“非空”的托管地区或包含非 NS 或非 SOA 类型记录(非默认记录)的地区。例如,如果不在处理或使用 -Force 开关期间为 cmdlet 授予相关权限,将无法删除添加了 A 和 CNAME 类型记录的“my-new-zone”:

Remove-GcdManagedZone -Zone "my-new-zone" -Force

Remove-GcdManagedZone cmdlet 还接受要删除的地区的流水线输入。例如,以下命令会强制删除当前项目中的所有托管地区。如果您不再维护项目中设置的任何网域,这可能会很有用:

Get-GcdManagedZone | Remove-GcdManagedZone -Force