在 Private Service Connect 中設定 DNS

本頁面說明如何在 Private Service Connect 中設定 DNS。

總覽

建議您使用 DNS 連線至已啟用 Private Service Connect 的執行個體。不同網路可透過 DNS 名稱連線至同一個執行個體,但各網路中的 Private Service Connect 端點可能會有不同的 IP 位址。此外,Cloud SQL Auth Proxy 和語言連接器需要 DNS 名稱,才能連線至這些執行個體。

啟用 Private Service Connect 的 Cloud SQL 執行個體可以有兩種 DNS 名稱:

  • 每個執行個體 DNS 名稱。這項功能適用於所有版本的 Cloud SQL 執行個體。主要執行個體和每個副本執行個體都有不同的個別執行個體 DNS 名稱。

  • 全域寫入端點 DNS 名稱。這項功能適用於 Cloud SQL Enterprise Plus 版本的執行個體,可協助進階災難復原 (ADR)。寫入端點是全域 DNS 名稱,會自動解析為目前主要執行個體的 IP 位址。如果副本進行容錯移轉或切換作業,這個寫入端點會自動將連線重新導向至新的主要執行個體。使用寫入端點時,您執行副本容錯移轉或切換作業,以從區域性中斷或災害復原演練中復原時,就不必變更應用程式連線。

Private Service Connect 中的 DNS 自動化

如要建立每個執行個體的 DNS 名稱,可以使用 Cloud SQL DNS 自動化功能,為您設定 DNS 記錄和名稱。啟用 DNS 自動化後,Cloud SQL 會在授權的消費者 VPC 網路中,自動為每個執行個體 DNS 名稱佈建及管理 DNS 記錄。

在 Cloud SQL Enterprise 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 自動連線時,才能啟用 DNS 自動化功能 (使用 --psc-auto-connections=network)。
  • 只有啟用 DNS 自動化的 Cloud SQL Enterprise 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

回應的 dnsNames 欄位會傳回每個執行個體的 DNS 名稱和全域寫入端點 DNS 名稱,如下所示:

{
  "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 記錄:

名稱 類型 存留時間 價值
sample-db.mycompany.example.com CNAME 600 abcdef123456.987654321fedcb.us-central1.sql-psc.goog

手動設定 DNS

建議使用 DNS 自動化功能,因為手動設定 DNS 是舊版選項。您也可以選擇為執行個體手動設定每個執行個體的 DNS 記錄。DNS 名稱提供一致的方式,可使用 Auth Proxy 或語言連接器從不同網路連線。執行個體查詢 API 回應會提供建議的 DNS 名稱,您可以在對應虛擬私有雲網路的私人 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 名稱連線至 Cloud SQL 執行個體,而非使用本節中預先定義的 DNS 名稱,請在建立執行個體時設定自訂主體別名 (SAN)。您插入自訂 SAN 設定的自訂 DNS 名稱,會新增至執行個體伺服器憑證的 SAN 欄位。這樣一來,您就能安全地使用自訂 DNS 名稱進行主機名稱驗證。

    如要進一步瞭解如何設定自訂 SAN 設定,請參閱「建立執行個體」。

  2. 如要建立私人 DNS 區域,請使用 gcloud dns managed-zones create 指令。這個區域與用來透過 Private Service Connect 端點連線至 Cloud SQL 執行個體的虛擬私有雲網路相關聯。

      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:虛擬私有雲網路的名稱
  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 執行個體的虛擬私有雲網路相關聯。
  4. 使用任何要求資料之前,請先修改下列項目的值:

    • PROJECT_ID:包含 DNS 區域的 Google Cloud 專案 ID 或專案編號
    • ZONE_NAME:區域名稱
    • DESCRIPTION:區域說明 (例如 Cloud SQL 執行個體的 DNS 區域)
    • DNS_NAME:區域的 DNS 尾碼名稱,例如 REGION_NAME.sql.goog. (其中 REGION_NAME 是區域的區域名稱)
    • NETWORK_NAME:虛擬私有雲網路的名稱

    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 區域的專案 ID 或專案編號。 Google Cloud
    • 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"
    }