DNS in Private Service Connect konfigurieren

Auf dieser Seite wird beschrieben, wie Sie DNS in Private Service Connect konfigurieren.

Übersicht

DNS ist die empfohlene Methode, um eine Verbindung zu Instanzen mit aktiviertem Private Service Connect herzustellen. Über einen DNS-Namen können verschiedene Netzwerke eine Verbindung zur selben Instanz herstellen, wobei Private Service Connect-Endpunkte in jedem Netzwerk unterschiedliche IP-Adressen haben können. Außerdem benötigen der Cloud SQL Auth-Proxy und die Language Connectors DNS-Namen, um eine Verbindung zu diesen Instanzen herzustellen.

Cloud SQL-Instanzen mit aktiviertem Private Service Connect können zwei Arten von DNS-Namen haben:

  • DNS-Name pro Instanz Diese Funktion ist für Instanzen in allen Cloud SQL-Editionen verfügbar. Die primäre Instanz und jede Replikatinstanz haben unterschiedliche instanzspezifische DNS-Namen.

  • Ein globaler DNS-Name des Schreibendpunkts. Diese Option ist für Instanzen in der Cloud SQL Enterprise Plus-Version verfügbar, um die erweiterte Notfallwiederherstellung zu unterstützen. Ein Schreibendpunkt ist ein globaler DNS-Name, der automatisch in die IP-Adresse der aktuellen primären Instanz aufgelöst wird. Bei einem Replikat-Failover oder ‑Switchover leitet dieser Schreibendpunkt eingehende Verbindungen automatisch an die neue primäre Instanz weiter. Wenn Sie einen Schreibendpunkt verwenden, müssen Sie keine Änderungen an der Anwendungsverbindung vornehmen, wenn Sie einen Replikat-Failover- oder Switchover-Vorgang zur Wiederherstellung nach einem regionalen Ausfall oder eine Notfallwiederherstellungsübung durchführen.

DNS-Automatisierung in Private Service Connect

Wenn Sie einen DNS-Namen pro Instanz erstellen möchten, können Sie die Cloud SQL-DNS-Automatisierungsfunktion verwenden, um die DNS-Einträge und den Namen für Sie einzurichten. Wenn Sie die DNS-Automatisierung aktivieren, werden DNS-Einträge für den DNS-Namen pro Instanz in Ihren autorisierten VPC-Netzwerken automatisch von Cloud SQL bereitgestellt und verwaltet.

Wenn die DNS-Automatisierung für eine Cloud SQL Enterprise Plus-Instanz aktiviert ist, können Sie auch einen globalen DNS-Namen für den Schreibendpunkt aktivieren, der immer automatisch in die IP-Adresse der aktuellen primären Instanz aufgelöst wird.

Optional können Sie einen instanzspezifischen DNS-Eintrag für die Instanz manuell konfigurieren (siehe DNS manuell konfigurieren). Wir empfehlen jedoch, die DNS-Automatisierung zu verwenden. Die manuelle DNS-Konfiguration ist eine Legacy-Option.

Voraussetzungen für die Aktivierung der DNS-Automatisierung

  • Wenn Sie die DNS-Automatisierung oder einen globalen DNS-Namen für den Schreibendpunkt verwenden möchten, müssen Sie die Cloud DNS API aktivieren.
  • Die DNS-Automatisierung kann nur aktiviert werden, wenn Private Service Connect aktiviert ist (verwenden Sie den Parameter --enable-private-service-connect).
  • Die DNS-Automatisierung kann nur aktiviert werden, wenn mindestens eine automatische Private Service Connect-Verbindung angegeben ist (verwenden Sie --psc-auto-connections=network).
  • Ein globaler DNS-Name des Schreibendpunkts kann nur für eine Cloud SQL Enterprise Plus-Instanz aktiviert werden, für die die DNS-Automatisierung aktiviert ist.

DNS-Automatisierung konfigurieren

Sie können die DNS-Automatisierung und den globalen DNS-Namen des Schreibendpunkts aktivieren, wenn Sie eine neue Instanz mit aktiviertem Private Service Connect erstellen, wie unter Cloud SQL-Instanz erstellen beschrieben.

Sie können die DNS-Automatisierung auch für vorhandene Instanzen aktivieren oder deaktivieren. In diesem Fall stellt Cloud SQL die zugehörigen DNS-Einträge in den jeweiligen Netzwerken automatisch bereit oder bereinigt sie.

gcloud

gcloud sql instances patch INSTANCE_NAME \
  --enable-psc-auto-dns=DNS_ENABLEMENT \
  --enable-psc-write-endpoint-dns=GLOBAL_DNS_ENABLEMENT \

REST

Die HTTP-Methode und URL sehen so aus:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

Der JSON-Anfragetext würde so aussehen:

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

Ersetzen Sie die folgenden Werte:

  • DNS_ENABLEMENT: true oder false, je nachdem, ob Sie die DNS-Automatisierung aktivieren oder deaktivieren möchten.
  • GLOBAL_DNS_ENABLEMENT: true oder false, je nachdem, ob Sie einen globalen DNS-Namen für den Schreibendpunkt aktivieren oder deaktivieren möchten. Falls true, muss enable-psc-auto-dns ebenfalls true sein.

DNS-Namen ansehen

Sie können sowohl den DNS-Namen pro Instanz für eine Instanz als auch den globalen DNS-Namen des Schreibendpunkts für das Projekt mit dem Befehl describe abrufen.

gcloud

DNS-Name pro Instanz

So finden Sie den DNS-Namen pro Instanz, der mit der DNS-Automatisierung erstellt wurde: Verwenden Sie den Befehl 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"
  

Die Ausgabe sieht so aus (wobei DNS_NAME der DNS-Name der Instanz ist):

INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME

Der DNS-Name endet mit dem Namen der Region der Instanz, gefolgt von .sql-psc-goog, z. B.
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog.
Wenn Sie nur den unformatierten DNS-Namen zurückgeben möchten, fügen Sie | cut -d, -f3 am Ende des Befehls hinzu.

Der globale DNS-Name des Schreibendpunkts

Ebenso können Sie den Befehl describe verwenden, um den globalen DNS-Namen des Schreibendpunkts für Ihren Replikationscluster zu finden:

    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"
  

Die Ausgabe sieht so aus (wobei GLOBAL_DNS_NAME der globale DNS-Name des Schreibendpunkts für Ihren Replikationscluster ist):

CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME

Der DNS-Name des globalen Schreibendpunkts endet mit .global.sql-psc-goog, z. B.
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog. Wenn Sie nur den nicht dekorierten DNS-Namen zurückgeben möchten, fügen Sie | cut -d, -f3 am Ende des Befehls hinzu.

REST

Die HTTP-Methode und URL sehen so aus:

GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances

Der DNS-Name der einzelnen Instanzen und der globale DNS-Name des Schreibendpunkts werden im Feld dnsNames der Antwort zurückgegeben, wie hier:

{
  "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"
    }
  ],
}

Sie können den globalen DNS-Namen des Schreibendpunkts oder den DNS-Namen der Instanz verwenden, um eine Verbindung zur Instanz herzustellen. Weitere Informationen finden Sie unter Verbindung über einen DNS-Eintrag herstellen.

DNS-Automatisierungsstatusfelder

In diesen beiden Ausgabefeldern können Sie den Status von DNS für Ihre Instanz und Ihren Replikationscluster ermitteln:

  • instanceAutoDnsStatus: Zeigt den Status von DNS pro Instanz an.
  • writeEndpointAutoDnsStatus: Zeigt den Status des globalen DNS des Schreibendpunkts an.

Beide Felder können die folgenden Werte haben:

  • AUTO_DNS_STATUS_UNSPECIFIED
  • AUTO_DNS_OK
  • AUTO_DNS_FAILED
  • AUTO_DNS_UNKNOWN

Diese Felder werden im Ausgabefeld pscAutoConnections angezeigt:

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

Fehlerbehebung bei der DNS-Automatisierung

Wenn die Cloud DNS API nicht aktiviert ist, die Private Service Connect-Verbindungsrichtlinie fehlt oder Backend-Fehler beim Erstellen von DNS-Einträgen auftreten, kann die DNS-Automatisierung möglicherweise keinen DNS-Eintrag pro Instanz oder einen globalen DNS-Namen für den Schreibendpunkt erstellen.

Wenn Sie auf eine Situation stoßen, in der die DNS-Automatisierung nicht richtig bereitgestellt wurde, können Sie zwei Flags mit der update/patch API oder der gcloud CLI verwenden:

  • --reconcile-psc-networking (boolean): Wenn diese Option festgelegt ist, versucht Cloud SQL, alle Teile der DNS-Automatisierung wiederherzustellen, die nicht funktionieren. Dieses Flag führt nicht zu Ausfallzeiten.
  • --reconcile-psc-networking-force (boolean): Ähnlich wie reconcile-psc-networking, aber wenn diese Option festgelegt ist, versucht Cloud SQL, die gesamte DNS-Automatisierung wiederherzustellen. Dies kann zu kurzen Ausfallzeiten bei vorhandenen PSC-DNS-Automatisierungsteilen führen, die funktionieren. Das kann in einigen Fällen helfen, in denen reconcile-psc-networking nicht weiterhilft.

Benutzerdefinierte DNS-Namen zuweisen

Sie können benutzerdefinierte DNS-Namen für Ihre Private Service Connect-Cloud SQL-Instanzen konfigurieren. Erstellen Sie einfach einen CNAME-Eintrag mit dem DNS-Namen der Private Service Connect-Instanz als Wert. Wenn Sie beispielsweise Ihre Anwendungen mit dem Datenbank-DNS-Namen sample-db.mycompany.example.com konfigurieren möchten, um auf die Datenbankinstanz mit dem Private Service Connect-DNS-Namen abcdef123456.987654321fedcb.us-central1.sql-psc.goog zu verweisen, müssen Sie zuerst die Instanz mit einem benutzerdefinierten DNS-Namen konfigurieren und dann einen DNS-CNAME-Eintrag mit dem DNS-Anbieter erstellen:

NAME TYP TTL WERT
sample-db.mycompany.example.com CNAME 600 abcdef123456.987654321fedcb.us-central1.sql-psc.goog

DNS manuell konfigurieren

Wir empfehlen die DNS-Automatisierung, da die manuelle DNS-Konfiguration eine Legacy-Option ist. Optional können Sie einen instanzspezifischen DNS-Eintrag für die Instanz manuell konfigurieren. Ein DNS-Name bietet eine konsistente Methode zur Verwendung des Auth-Proxys oder der Sprachconnectors, um eine Verbindung aus verschiedenen Netzwerken herzustellen. Die API-Antwort für die Instanzsuche enthält einen vorgeschlagenen DNS-Namen, den Sie zum Erstellen des DNS-Eintrags in einer privaten DNS-Zone im entsprechenden VPC-Netzwerk verwenden können.

gcloud

  1. Verwenden Sie den Befehl gcloud sql instances describe, um zusammenfassende Informationen zu einer Cloud SQL-Instanz einschließlich des DNS-Namens der Instanz aufzurufen:

            gcloud sql instances describe INSTANCE_NAME \
              --project=PROJECT_ID
          

    Ersetzen Sie die folgenden Werte:

    • INSTANCE_NAME: der Name der Cloud SQL-Instanz
    • PROJECT_ID: die ID oder Projektnummer des Google Cloud -Projekts, das die Instanz enthält

    Prüfen Sie in der Antwort, ob der DNS-Name angezeigt wird. Dieser Name hat das folgende Muster: INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.. Beispiel: 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.

    Wenn Sie zum Herstellen einer Verbindung zu einer Cloud SQL-Instanz einen benutzerdefinierten DNS-Namen anstelle des vordefinierten DNS-Namens in diesem Abschnitt verwenden möchten, konfigurieren Sie beim Erstellen der Instanz die benutzerdefinierte Einstellung für den alternativen Betreffnamen (Subject Alternative Name, SAN). Der benutzerdefinierte DNS-Name, den Sie in die benutzerdefinierte SAN-Einstellung einfügen, wird dem SAN-Feld des Serverzertifikats der Instanz hinzugefügt. So können Sie den benutzerdefinierten DNS-Namen sicher mit der Hostnamenvalidierung verwenden.

    Weitere Informationen zum Konfigurieren der benutzerdefinierten SAN-Einstellung finden Sie unter Instanzen erstellen.

  2. Verwenden Sie zum Erstellen einer privaten DNS-Zone den Befehl gcloud dns managed-zones create. Diese Zone ist dem VPC-Netzwerk zugeordnet, das für die Verbindung mit der Cloud SQL-Instanz über den Private Service Connect-Endpunkt verwendet wird.

      gcloud dns managed-zones create ZONE_NAME \
        --project=PROJECT_ID \
        --description="DESCRIPTION" \
        --dns-name=DNS_NAME \
        --networks=NETWORK_NAME \
        --visibility=private
          

    Ersetzen Sie die folgenden Werte:

    • ZONE_NAME: der Name der DNS-Zone
    • PROJECT_ID: die ID oder Projektnummer des Google Cloud -Projekts, das die Zone enthält
    • DESCRIPTION durch eine Beschreibung der Zone (z. B. eine DNS-Zone für die Cloud SQL-Instanz)
    • DNS_NAME: der Name des DNS-Suffixs für die Zone, z. B. REGION_NAME.sql.goog. (wobei REGION_NAME der Name der Region für die Zone ist)
    • NETWORK_NAME: Der Name des VPC-Netzwerks
  3. Nachdem Sie den Private Service Connect-Endpunkt erstellt haben, verwenden Sie den Befehl gcloud dns record-sets create, um einen DNS-Eintrag in der Zone zu erstellen:

       gcloud dns record-sets create DNS_RECORD \
         --project=PROJECT_ID \
         --type=RRSET_TYPE \
         --rrdatas=RR_DATA \
         --zone=ZONE_NAME
          

    Ersetzen Sie die folgenden Werte:

    • DNS_RECORD: der Name des DNS-Eintrags. Dieser Eintrag wird auf den DNS-Namen festgelegt,den Sie zuvor von der Cloud SQL-Instanz abgerufen haben (z. B.
      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE: der Ressourceneintragstyp des DNS-Eintragssatzes. Wenn die interne IP-Adresse, die Sie für den Private Service Connect-Endpunkt reserviert haben, eine IPv4-Adresse ist, geben Sie für diesen Parameter A an. Andernfalls geben Sie AAAA an, wenn die IP-Adresse für den Endpunkt eine IPv6-Adresse ist.
    • RR_DATA: die IP-Adresse, die dem Private Service Connect-Endpunkt zugewiesen ist (z. B. 198.51.100.5). Sie können auch mehrere Werte eingeben,z. B. rrdata1 rrdata2 rrdata3 (z. B.
      10.1.2.3 10.2.3.4 10.3. 4.5).

REST

  1. Rufen Sie den DNS-Namen einer Cloud SQL-Instanz ab.
  2. Ersetzen Sie diese Werte in den folgenden Anfragedaten:

    • PROJECT_ID: die ID oder Projektnummer des Google Cloud -Projekts, das die Instanz enthält
    • INSTANCE_NAME den Namen der Instanz

    HTTP-Methode und URL:

    GET https://sqladmin.googleapis.com/sql/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

    Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

    Sie sollten in etwa folgende JSON-Antwort erhalten:

    {
      ...
      "dnsName": "INSTANCE_ID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog."
    }
    

    Im Feld dnsName wird der DNS-Name der Cloud SQL-Instanz angezeigt. DNS-Namen enden immer mit einem Punkt (.).

  3. Erstellen Sie eine private DNS-Zone: Diese Zone ist dem VPC-Netzwerk zugeordnet, das für die Verbindung mit der Cloud SQL-Instanz über den Private Service Connect-Endpunkt verwendet wird.
  4. Ersetzen Sie diese Werte in den folgenden Anfragedaten:

    • PROJECT_ID: die ID oder Projektnummer des Google Cloud -Projekts, das die DNS-Zone enthält
    • ZONE_NAME: der Name der Zone.
    • DESCRIPTION durch eine Beschreibung der Zone (z. B. eine DNS-Zone für die Cloud SQL-Instanz)
    • DNS_NAME: der Name des DNS-Suffixs für die Zone, z. B. REGION_NAME.sql.goog. (wobei REGION_NAME der Name der Region für die Zone ist)
    • NETWORK_NAME: Der Name des VPC-Netzwerks

    HTTP-Methode und URL:

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones

    JSON-Text anfordern:

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

    Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

    Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

    {
      "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. Nachdem Sie den Private Service Connect-Endpunkt erstellt haben, erstellen Sie in der Zone einen DNS-Eintrag.
  6. Ersetzen Sie diese Werte in den folgenden Anfragedaten:

    • PROJECT_ID: die ID oder Projektnummer des Google Cloud -Projekts, das die DNS-Zone enthält.
    • ZONE_NAME: der Name der Zone.
    • DNS_RECORD: der Name des DNS-Eintrags. Dieser Eintrag wird auf den DNS-Namen festgelegt, den Sie zuvor von der Cloud SQL-Instanz abgerufen haben (z. B. 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE: der Ressourceneintragstyp des DNS-Eintragssatzes. Wenn die interne IP-Adresse, die Sie für den Private Service Connect-Endpunkt reserviert haben, IPv4 ist, geben Sie für diesen Parameter A an. Andernfalls, wenn die IP-Adresse für den Endpunkt IPv6 ist, geben Sie AAAA an.
    • TTL ist die Gültigkeitsdauer (TTL) für den Datensatz in Sekunden, z. B. 300
    • RR_DATAdie IP-Adresse, die dem Private Service Connect-Endpunkt zugewiesen ist (z. B.198.51.100.5 ) Sie können auch mehrere Werte eingeben, z. B.rrdata1 rrdata2 rrdata3 (Beispiel: 10.1.2.3 10.2.3.4 10.3.4.5 )

    HTTP-Methode und URL:

    POST https://dns.googleapis.com/dns/v1/projects/PROJECT_ID/managedZones/ZONE_NAME

    JSON-Text anfordern:

    {
      "deletions": []
      "additions": [
        {
          "name": "DNS_RECORD",
          "type": "RRSET_TYPE",
          "ttl": TTL,
          "rrdatas": [
            "RR_DATA"
          ]
        }
      ]
    }
    

    Wenn Sie die Anfrage senden möchten, maximieren Sie eine der folgenden Optionen:

    Sie sollten eine JSON-Antwort ähnlich wie diese erhalten:

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