本页面介绍了如何在 Private Service Connect 中配置 DNS。
概览
我们建议使用 DNS 连接到启用了 Private Service Connect 的实例。借助 DNS 名称,不同的网络可以连接到同一实例,并且每个网络中的 Private Service Connect 端点可能具有不同的 IP 地址。此外,Cloud SQL Auth 代理和语言连接器需要 DNS 名称才能连接到这些实例。
启用了 Private Service Connect 的 Cloud SQL 实例可以具有两种类型的 DNS 名称:
单实例 DNS 名称 。所有 Cloud SQL 版本的实例都可以使用此名称。主实例和每个副本实例都有不同的单实例 DNS 名称。
全局写入端点 DNS 名称 。Cloud SQL 企业 Plus 版中的实例可以使用此名称, 以帮助实现 高级灾难恢复 (ADR)。 写入端点是一个全局 DNS 名称,它会自动解析为当前主实例的 IP 地址。如果发生副本故障切换或切换操作,此写入端点会自动将传入连接重定向到新的主实例。通过使用写入端点,您在执行副本故障切换或切换操作以进行区域服务中断恢复或灾难恢复演练时,可以无需更改应用连接。
Private Service Connect 中的 DNS 自动化
如需创建单实例 DNS 名称,您可以使用 Cloud SQL DNS 自动化功能为您设置 DNS 记录和名称。启用 DNS 自动化后,Cloud SQL 会在您授权的使用方 VPC 网络中自动预配和管理单实例 DNS 名称的 DNS 记录。
在 Cloud SQL 企业 Plus 版实例上启用 DNS 自动化后,您还可以启用全局写入端点 DNS 名称,该名称始终会自动解析为当前主实例的 IP 地址。
(可选)您可以为实例手动配置单实例 DNS 记录(请参阅手动配置 DNS),但我们建议使用 DNS 自动化。手动 DNS 配置是一种旧版选项。
启用 DNS 自动化的前提条件
- 如需使用 DNS 自动化或全局写入端点 DNS 名称,您需要启用 Cloud DNS API。
- 只有在启用 Private Service Connect
后,才能启用 DNS 自动化(使用
--enable-private-service-connect参数)。 - 只有在指定至少一个
Private Service Connect 自动连接(使用
--psc-auto-connections=network)后,才能启用 DNS 自动化。 - 只有在启用了 DNS 自动化的 Cloud SQL 企业 Plus 版实例上 ,才能启用全局写入端点 DNS 名称。
DNS 自动化配置
您可以在创建新实例时启用 DNS 自动化和全局写入端点 DNS 名称, 并启用 Private Service Connect,如 创建 Cloud SQL 实例中所述。
您还可以为现有实例启用或停用 DNS 自动化。执行此操作时,Cloud SQL 会在相应网络中自动预配或清理关联的 DNS 记录。
gcloud
gcloud sql instances patch INSTANCE_NAME \ --enable-psc-auto-dns=DNS_ENABLEMENT \ --enable-psc-write-endpoint-dns=GLOBAL_DNS_ENABLEMENT \
REST
HTTP 方法和网址如下所示:
POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instancesJSON 请求正文的格式如下所示:
{ "name": "INSTANCE_NAME", "project": "PROJECT_ID", "region": "REGION_NAME", "databaseVersion": "DATABASE_VERSION", "kind": "sql#instance", "settings": { "availabilityType": "AVAILABILITY_TYPE", "ipConfiguration": { "ipv4Enabled": false, "pscConfig": { "allowedConsumerProjects": [ "ALLOWED_PROJECTS" ], "pscAutoConnections": [ { "consumerProject":"CONSUMER_PROJECT", "consumerNetwork":"projects/PARENT_PROJECT/global/networks/CONSUMER_NETWORK" } ], "pscEnabled": true, "pscAutoDnsEnabled": DNS_ENABLEMENT, "pscWriteEndpointDnsEnabled": GLOBAL_DNS_ENABLEMENT, } }, "kind": "sql#settings", "pricingPlan": "PER_USE", "replicationType": "SYNCHRONOUS", "tier": "MACHINE_TYPE" } }
进行以下替换:
- DNS_ENABLEMENT:
true或false,具体取决于您是想启用还是停用 DNS 自动化。 - GLOBAL_DNS_ENABLEMENT:
true或false具体取决于您是想启用还是停用全局写入端点 DNS 名称。 如果为true,则enable-psc-auto-dns也必须为true。
查看 DNS 名称
您可以使用 describe 命令查找实例的单实例 DNS 名称和项目的全局写入端点 DNS 名称。
gcloud
单实例 DNS 名称
如需查找使用 DNS 自动化创建的单实例 DNS 名称,请使用
gcloud sql instances describe
命令,如下所示:
gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID \ --flatten="dnsNames[]" \ --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \ | grep "INSTANCE,CLOUD_SQL_AUTOMATION"
输出将如下所示(其中 DNS_NAME 将是 实例的单实例 DNS 名称):
INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME
DNS 名称将以实例的区域名称后跟
.sql-psc-goog 结尾,如下所示:
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog。
如需仅返回未修饰的 DNS 名称,请在命令末尾添加 | cut -d, -f3。
全局写入端点 DNS 名称
同样,您可以使用 describe 命令查找复制集群的全局写入端点 DNS 名称:
gcloud sql instances describe INSTANCE_NAME \ --project=INSTANCE_NAME \ --flatten="dnsNames[]" \ --format="csv[no-heading](dnsNames.dnsScope, dnsNames.recordManager, dnsNames.name)" \ | grep "CLUSTER,CLOUD_SQL_AUTOMATION"
输出将如下所示(其中 GLOBAL_DNS_NAME 将是复制集群的全局写入端点 DNS 名称):
CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME
全局写入端点 DNS 名称以
.global.sql-psc-goog 结尾,如下所示:
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog。
如需仅返回未修饰的 DNS 名称,请在命令末尾添加 | cut -d, -f3。
REST
HTTP 方法和网址如下所示:
GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances单实例 DNS 名称和全局写入端点 DNS 名称将在响应的
dnsNames 字段中返回,如下所示:
{ "dnsNames": [ { "connectionType": "PRIVATE_SERVICE_CONNECT", "dnsScope": "INSTANCE", "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql.goog.", "recordManager": "CUSTOMER" }, { "connectionType": "PRIVATE_SERVICE_CONNECT", "dnsScope": "INSTANCE", "name": "31f5395197d0.3e0v7ztul56ph.us-central1.sql-psc.goog", "recordManager": "CLOUD_SQL_AUTOMATION" }, { "connectionType": "PRIVATE_SERVICE_CONNECT", "dnsScope": "CLUSTER", "name": "3lbvojtu2fo6q.3e0v7ztul56ph.global.sql-psc.goog", "recordManager": "CLOUD_SQL_AUTOMATION" } ], }
您可以使用全局写入端点 DNS 名称或单实例 DNS 名称连接到实例。请参阅 使用 DNS 记录进行连接。
DNS 自动化状态字段
您可以在以下两个输出字段中确定实例和复制集群的 DNS 状态:
instanceAutoDnsStatus:显示单实例 DNS 的状态。writeEndpointAutoDnsStatus:显示全局写入端点 DNS 的状态。
这两个字段都可以具有以下值:
AUTO_DNS_STATUS_UNSPECIFIEDAUTO_DNS_OKAUTO_DNS_FAILEDAUTO_DNS_UNKNOWN
这些字段显示在 pscAutoConnections 输出字段中:
"pscAutoConnections": [ { "consumerNetwork": "projects/my-psc-project/global/networks/psc-dns-net2", "consumerNetworkStatus": "VALID", "consumerProject": "my-psc-project", "instanceAutoDnsStatus": "AUTO_DNS_OK", "ipAddress": "10.0.2.4", "status": "ACTIVE", "writeEndpointAutoDnsStatus": "AUTO_DNS_OK" } ]
排查 DNS 自动化问题
如果未启用 Cloud DNS API,或者缺少 Private Service Connect 连接政策,或者在创建 DNS 记录期间出现后端错误,则 DNS 自动化可能无法创建单实例 DNS 记录或全局写入端点 DNS 名称。
如果您遇到 DNS 自动化未正确预配的情况,可以使用 update/patch API 或
gcloud CLI 中的以下两个标志:
--reconcile-psc-networking(boolean):设置后,Cloud SQL 会尝试恢复任何无法正常运行的 DNS 自动化部分。 此标志不会导致停机。--reconcile-psc-networking-force(boolean):与reconcile-psc-networking类似,但如果设置,Cloud SQL 会尝试完全 恢复所有 DNS 自动化,但代价是现有正常运行的 PSC DNS 自动化部分会短暂停机。在某些情况下,这有助于解决reconcile-psc-networking无法解决的问题。
分配自定义 DNS 名称
您可以为 Private Service Connect Cloud SQL 实例配置自定义 DNS 名称。只需创建一个 CNAME 记录,并以 Private Service Connect 实例 DNS 名称作为其值即可。例如,
如果您想使用数据库 DNS 名称
sample-db.mycompany.example.com 配置应用以引用
Private Service Connect DNS 名称
abcdef123456.987654321fedcb.us-central1.sql-psc.goog 的数据库实例,则必须先
使用
自定义 DNS 名称配置实例,然后使用 DNS 提供商创建
DNS CNAME 记录:
| NAME | 类型 | TTL | 值 |
|---|---|---|---|
sample-db.mycompany.example.com |
CNAME | 600 | abcdef123456.987654321fedcb.us-central1.sql-psc.goog |
手动配置 DNS
我们建议使用 DNS 自动化,因为手动 DNS 配置是一种旧版选项。(可选)您可以为实例手动配置单实例 DNS 记录。DNS 名称提供了一种使用 Auth 代理或语言连接器从不同网络进行连接的一致方法。实例查找 API 响应提供了一个建议的 DNS 名称,您可以使用该名称在相应 VPC 网络的 专用 DNS 区域中创建 DNS 记录。
gcloud
如需查看有关 Cloud SQL 实例的摘要信息, 包括实例的 DNS 名称,请使用
gcloud sql instances describe命令:gcloud sql instances describe INSTANCE_NAME \ --project=PROJECT_ID
进行以下替换:
- INSTANCE_NAME:Cloud SQL 实例的名称
- PROJECT_ID:包含 Google Cloud 实例的项目的 ID 或项目编号
在响应中,验证是否显示 DNS 名称。此名称的格式如下:
INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.. 例如:1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.。如果您想使用自定义 DNS 名称(而不是使用本部分中的预定义 DNS 名称)连接到 Cloud SQL 实例,那么请在创建实例时配置自定义主体备用名称 (SAN) 设置。您在自定义 SAN 设置中插入的自定义 DNS 名称会添加到实例的服务器证书的 SAN 字段中。这样,您就可以安全地使用自定义 DNS 名称进行 主机名验证。
如需详细了解如何配置自定义 SAN 设置,请参阅 创建实例。
-
如需创建专用 DNS 区域,请使用
gcloud dns managed-zones create命令。此区域与用于通过 Private Service Connect 端点连接到 Cloud SQL 实例的 VPC 网络相关联。gcloud dns managed-zones create ZONE_NAME \ --project=PROJECT_ID \ --description="DESCRIPTION" \ --dns-name=DNS_NAME \ --networks=NETWORK_NAME \ --visibility=private
进行以下替换:
- ZONE_NAME:DNS 区域的名称
- PROJECT_ID:包含 DNS 区域的项目的 ID 或编号 Google Cloud
- DESCRIPTION:区域的说明(例如 Cloud SQL 实例的 DNS 区域)
- DNS_NAME:区域的 DNS 后缀名称,例如
REGION_NAME.sql.goog.(其中 REGION_NAME 是区域的名称) - NETWORK_NAME:VPC 网络的名称
创建 Private Service Connect 端点后,如需在可用区中 创建 DNS 记录,请使用
gcloud dns record-sets create命令:gcloud dns record-sets create DNS_RECORD \ --project=PROJECT_ID \ --type=RRSET_TYPE \ --rrdatas=RR_DATA \ --zone=ZONE_NAME
进行以下替换:
- DNS_RECORD:DNS 记录的名称。此记录会设置为先前在此过程中从 Cloud SQL 实例检索到的 DNS 名称(例如
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)。 - RRSET_TYPE:DNS 记录集的资源记录类型。
如果您为 Private Service Connect 端点预留的内部 IP 地址是 IPv4 地址,请为此参数指定
A。否则, 如果端点的 IP 地址是 IPv6 地址,请指定AAAA。 - RR_DATA:为
Private Service Connect 端点分配的 IP 地址(例如
198.51.100.5)。您也可以输入多个值,例如rrdata1 rrdata2 rrdata3(例如
10.1.2.3 10.2.3.4 10.3. 4.5)。
- DNS_RECORD:DNS 记录的名称。此记录会设置为先前在此过程中从 Cloud SQL 实例检索到的 DNS 名称(例如
REST
- 获取 Cloud SQL 实例的 DNS 名称。
- PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
- INSTANCE_NAME:实例的名称
- 创建专用 DNS 区域。此区域与用于通过 Private Service Connect 端点连接到 Cloud SQL 实例的 VPC 网络相关联。
- PROJECT_ID:包含DNS 区域的 Google Cloud 项目的 ID 或编号
- ZONE_NAME:区域的名称
- DESCRIPTION:区域的说明(例如 Cloud SQL 实例的 DNS 区域)
- DNS_NAME:区域的 DNS 后缀名称,例如
REGION_NAME.sql.goog.(其中 REGION_NAME 是区域的名称) - NETWORK_NAME:VPC 网络的名称
- 创建 Private Service Connect 端点 后,在区域中创建 DNS 记录。
- PROJECT_ID:包含DNS 区域的 Google Cloud 项目的 ID 或编号。
- ZONE_NAME:区域的名称。
- DNS_RECORD:DNS 记录的名称。此记录会设置为先前在此过程中从 Cloud SQL 实例检索到的 DNS 名称(例如
1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.)。 - RRSET_TYPE:DNS 记录集的资源记录类型。如果您为 Private Service Connect 端点预留的内部 IP 地址是 IPv4,请为此参数指定
A。否则,如果端点的 IP 地址是 IPv6,请指定AAAA。 - TTL:记录集的存留时间 (TTL),以秒为单位(例如
300)。 - RR_DATA:为 Private Service Connect 端点分配的 IP 地址(例如
198.51.100.5)。您也可以输入多个值,例如rrdata1 rrdata2 rrdata3(例如10.1.2.3 10.2.3.4 10.3.4.5)。
在使用任何请求数据之前, 请先进行以下替换:
HTTP 方法和网址:
GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
...
"dnsName": "INSTANCE_ID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog."
}
dnsName 字段显示 Cloud SQL 实例的 DNS 名称。DNS 名称始终以英文句点 (.) 结尾。
在使用任何请求数据之前, 请先进行以下替换:
HTTP 方法和网址:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones
请求 JSON 正文:
{
"name": "ZONE_NAME",
"description": "DESCRIPTION",
"dnsName": "DNS_NAME",
"visibility": "private",
"privateVisibilityConfig": {
"kind": "dns#managedZonePrivateVisibilityConfig",
"networks": [
{
"kind": "dns#managedZonePrivateVisibilityConfigNetwork",
"networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME"
}
]
}
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"name": "ZONE_NAME",
"dnsName": "DNS_NAME",
"description": "DESCRIPTION",
"id": "ID",
"nameServers": [
"ns-gcp-private.googledomains.com."
],
"creationTime": "2024-05-10T17:05:34.607Z",
"visibility": "private",
"privateVisibilityConfig": {
"networks": [
{
"networkUrl": "https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME",
"kind": "dns#managedZonePrivateVisibilityConfigNetwork"
}
],
"gkeClusters": [],
"kind": "dns#managedZonePrivateVisibilityConfig"
},
"cloudLoggingConfig": {
"kind": "dns#managedZoneCloudLoggingConfig"
},
"kind": "dns#managedZone"
}
在使用任何请求数据之前, 请先进行以下替换:
HTTP 方法和网址:
POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ZONE_NAME
请求 JSON 正文:
{
"deletions": []
"additions": [
{
"name": "DNS_RECORD",
"type": "RRSET_TYPE",
"ttl": TTL,
"rrdatas": [
"RR_DATA"
]
}
]
}
如需发送您的请求,请展开以下选项之一:
您应该收到类似以下内容的 JSON 响应:
{
"additions": [
{
"name": "DNS_RECORD",
"type": "RRSET_TYPE",
"ttl": TTL,
"rrdatas": [
"RR_DATA"
],
"signatureRrdatas": [],
"kind": "dns#resourceRecordSet"
}
],
"deletions": [],
"startTime": "2024-05-10T17:29:44.375Z",
"id": "CHANGE_ID",
"status": "pending",
"kind": "dns#change"
}