在 Private Service Connect 中配置 DNS

本页介绍如何在 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(使用 --enable-private-service-connect 参数)时,才能启用 DNS 自动化。
  • 只有在指定至少一个 Private Service Connect 自动连接(使用 --psc-auto-connections=network)时,才能启用 DNS 自动化。
  • 只有启用了 DNS 自动化的 Cloud SQL 企业 Plus 版实例才能启用全局写入端点 DNS 名称。

DNS 自动化配置

您可以在创建启用 Private Service Connect 的新实例时启用 DNS 自动化和全局写入端点 DNS 名称,如创建 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/instances

JSON 请求正文将采用如下形式:

{
  "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_ENABLEMENTtruefalse,具体取决于您要启用还是停用 DNS 自动化。
  • GLOBAL_DNS_ENABLEMENTtruefalse,具体取决于您是要启用还是停用全局写入端点 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_UNSPECIFIED
  • AUTO_DNS_OK
  • AUTO_DNS_FAILED
  • AUTO_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 记录:

名称 类型 TTL VALUE
sample-db.mycompany.example.com CNAME 600 abcdef123456.987654321fedcb.us-central1.sql-psc.goog

手动配置 DNS

我们建议使用 DNS 自动化,因为手动 DNS 配置是旧版选项。您可以选择为实例手动配置每个实例的 DNS 记录。DNS 名称提供了一种使用身份验证代理或语言连接器从不同网络进行连接的一致方法。实例查找 API 响应会提供建议的 DNS 名称,您可以使用该名称在相应 VPC 网络的专用 DNS 区域中创建 DNS 记录。

gcloud

  1. 如需查看有关 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 设置,请参阅创建实例

  2. 如需创建专用 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:包含区域的 Google Cloud 项目的 ID 或项目编号
    • DESCRIPTION:区域的说明(例如 Cloud SQL 实例的 DNS 区域)
    • DNS_NAME:区域的 DNS 后缀名称,例如 REGION_NAME.sql.goog.(其中 REGION_NAME 是区域的名称)
    • NETWORK_NAME:VPC 网络的名称
  3. 创建 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)。

REST

  1. 获取 Cloud SQL 实例的 DNS 名称。
  2. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:包含实例的 Google Cloud 项目的 ID 或项目编号
    • INSTANCE_NAME:实例的名称

    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 名称始终以英文句点 (.) 结尾。

  3. 创建专用 DNS 区域。此区域与用于通过 Private Service Connect 端点连接到 Cloud SQL 实例的 VPC 网络相关联。
  4. 在使用任何请求数据之前,请先进行以下替换:

    • PROJECT_ID:包含DNS 区域的 Google Cloud 项目的 ID 或编号
    • ZONE_NAME:区域的名称
    • DESCRIPTION:区域的说明(例如 Cloud SQL 实例的 DNS 区域)
    • DNS_NAME:区域的 DNS 后缀名称,例如 REGION_NAME.sql.goog.(其中 REGION_NAME 是区域的名称)
    • NETWORK_NAME:VPC 网络的名称

    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"
    }
    
  5. 创建 Private Service Connect 端点后,在区域中创建 DNS 记录。
  6. 在使用任何请求数据之前,请先进行以下替换:

    • 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 方法和网址:

    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"
    }