Configura il DNS in Private Service Connect

Questa pagina descrive come configurare il DNS in Private Service Connect.

Panoramica

Il DNS è il modo consigliato per connettersi alle istanze in cui è abilitato Private Service Connect. Un nome DNS consente a reti diverse di connettersi alla stessa istanza, in cui gli endpoint Private Service Connect in ogni rete potrebbero avere indirizzi IP diversi. Inoltre, il proxy di autenticazione Cloud SQL e i connettori di linguaggio richiedono nomi DNS per connettersi a queste istanze.

Le istanze Cloud SQL con Private Service Connect abilitato possono avere due tipi di nomi DNS:

  • Un nome DNS per istanza. Questa opzione è disponibile per le istanze in tutte le versioni di Cloud SQL. L'istanza principale e ogni istanza di replica hanno nomi DNS per istanza diversi.

  • Un nome DNS dell'endpoint di scrittura globale. Questa opzione è disponibile per le istanze nella versione Cloud SQL Enterprise Plus, per facilitare il recupero di ripristino di emergenza (ADR). Un endpoint di scrittura è un nome DNS globale che si risolve automaticamente nell'indirizzo IP dell'istanza principale attuale. In caso di operazione di failover o switchover della replica, questo endpoint di scrittura reindirizza automaticamente le connessioni in entrata alla nuova istanza principale. Utilizzando un endpoint di scrittura, puoi evitare di dover apportare modifiche alla connessione dell'applicazione quando esegui un failover o uno switchover della replica per il ripristino di un'interruzione a livello di regione o un test di ripristino di emergenza.

Automazione DNS in Private Service Connect

Per creare un nome DNS per istanza, puoi utilizzare la funzionalità di automazione DNS di Cloud SQL per configurare i record DNS e il nome. Quando abiliti l'automazione DNS, Cloud SQL esegue il provisioning e la gestione automatici dei record DNS per il nome DNS per istanza nelle reti VPC consumer autorizzate.

Se l'automazione DNS è abilitata su un'istanza Cloud SQL Enterprise Plus, puoi anche abilitare un nome DNS dell'endpoint di scrittura globale che si risolve sempre automaticamente nell'indirizzo IP dell'istanza principale attuale.

Facoltativamente, puoi configurare manualmente un record DNS per istanza per l'istanza (vedi Configurare DNS manualmente), ma ti consigliamo di utilizzare l'automazione DNS. La configurazione DNS manuale è un'opzione legacy.

Prerequisiti per abilitare l'automazione DNS

  • Per utilizzare l'automazione DNS o un nome DNS dell'endpoint di scrittura globale, devi abilitare l'API Cloud DNS.
  • L'automazione DNS può essere abilitata solo quando è abilitato Private Service Connect (utilizza il parametro --enable-private-service-connect).
  • L'automazione DNS può essere abilitata solo quando è specificata almeno una connessione automatica Private Service Connect (utilizza --psc-auto-connections=network).
  • Un nome DNS dell'endpoint di scrittura globale può essere abilitato solo per un'istanza Cloud SQL Enterprise Plus con l'automazione DNS abilitata.

Configurazione dell'automazione DNS

Puoi abilitare l'automazione DNS e il nome DNS dell'endpoint di scrittura globale quando crei una nuova istanza, con Private Service Connect abilitato, come mostrato in Creare un'istanza Cloud SQL.

Puoi anche attivare o disattivare l'automazione DNS per le istanze esistenti. In questo caso, Cloud SQL esegue automaticamente il provisioning o la pulizia dei record DNS associati nelle rispettive reti.

gcloud

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

REST

Il metodo HTTP e l'URL avranno un aspetto simile a questo:

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

Il corpo della richiesta JSON avrà un formato simile a questo:

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

Effettua le seguenti sostituzioni:

  • DNS_ENABLEMENT: true o false a seconda che tu voglia attivare o disattivare l'automazione DNS.
  • GLOBAL_DNS_ENABLEMENT: true o false a seconda che tu voglia attivare o disattivare un nome DNS endpoint di scrittura globale. Se true, anche enable-psc-auto-dns deve essere true.

Visualizza i nomi DNS

Puoi trovare sia il nome DNS per istanza di un'istanza sia il nome DNS dell'endpoint di scrittura globale per il progetto utilizzando il comando describe.

gcloud

Nome DNS per istanza

Per trovare il nome DNS per istanza creato utilizzando l'automazione DNS, utilizza il comando gcloud sql instances describe nel seguente modo:

    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"
  

L'output sarà simile al seguente (dove DNS_NAME sarà il nome DNS per istanza per l'istanza):

INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME

Il nome DNS terminerà con il nome della regione dell'istanza seguito da .sql-psc-goog, ad esempio:
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog.
Per restituire solo il nome DNS non decorato, aggiungi | cut -d, -f3 alla fine del comando.

Il nome DNS dell'endpoint di scrittura globale

Allo stesso modo, puoi utilizzare il comando describe per trovare il nome DNS dell'endpoint di scrittura globale per il cluster di replica:

    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"
  

L'output sarà simile al seguente (dove GLOBAL_DNS_NAME sarà il nome DNS dell'endpoint di scrittura globale per il cluster di replica):

CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME

Il nome DNS dell'endpoint di scrittura globale termina con .global.sql-psc-goog, ad esempio:
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog. Per restituire solo il nome DNS non decorato, aggiungi | cut -d, -f3 alla fine del comando.

REST

Il metodo HTTP e l'URL avranno un aspetto simile a questo:

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

Il nome DNS per istanza e il nome DNS dell'endpoint di scrittura globale verranno restituiti nel campo dnsNames della risposta, come segue:

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

Puoi utilizzare il nome DNS dell'endpoint di scrittura globale o il nome DNS per istanza per connetterti all'istanza. Vedi Connettersi utilizzando un record DNS.

Campi di stato dell'automazione DNS

Puoi determinare lo stato del DNS per l'istanza e il cluster di replica in questi due campi di output:

  • instanceAutoDnsStatus: mostra lo stato del DNS per istanza.
  • writeEndpointAutoDnsStatus: mostra lo stato del DNS dell'endpoint di scrittura globale.

Entrambi i campi possono avere i seguenti valori:

  • AUTO_DNS_STATUS_UNSPECIFIED
  • AUTO_DNS_OK
  • AUTO_DNS_FAILED
  • AUTO_DNS_UNKNOWN

Questi campi vengono visualizzati nel campo di output 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"
      }
    ]

Risoluzione dei problemi relativi all'automazione DNS

Se l'API Cloud DNS non è abilitata, se la policy di connessione Private Service Connect non è presente o se si verificano errori di backend durante la creazione del record DNS, l'automazione DNS potrebbe non riuscire a creare un record DNS per istanza o un nome DNS dell'endpoint di scrittura globale.

Esistono due flag che puoi utilizzare con l'API update/patch o gcloud CLI se si verifica una situazione in cui l'automazione DNS non è stata provisionata correttamente:

  • --reconcile-psc-networking (boolean): se impostato, Cloud SQL tenta di ripristinare le parti dell'automazione DNS che non funzionano. Questo flag non causa tempi di inattività.
  • --reconcile-psc-networking-force (boolean): simile a reconcile-psc-networking, ma se impostato, Cloud SQL tenta di ripristinare completamente tutta l'automazione DNS a costo di un breve periodo di inattività delle parti di automazione DNS PSC esistenti che funzionano. Questa opzione può essere utile in alcuni casi in cui reconcile-psc-networking non lo è.

Assegnare nomi DNS personalizzati

Puoi configurare nomi DNS personalizzati per le tue istanze Cloud SQL Private Service Connect. Basta creare un record CNAME con il nome DNS dell'istanza Private Service Connect come valore. Ad esempio, se vuoi configurare le tue applicazioni utilizzando il nome DNS del database sample-db.mycompany.example.com per fare riferimento all'istanza del database con il nome DNS Private Service Connect abcdef123456.987654321fedcb.us-central1.sql-psc.goog, devi prima configurare l'istanza con un nome DNS personalizzato e poi creare un record DNS CNAME utilizzando il provider DNS:

NOME TIPO TTL VALORE
sample-db.mycompany.example.com CNAME 600 abcdef123456.987654321fedcb.us-central1.sql-psc.goog

Configurare manualmente il DNS

Ti consigliamo di utilizzare l'automazione DNS, perché la configurazione DNS manuale è un'opzione legacy. Se vuoi, puoi configurare manualmente un record DNS per istanza per l'istanza. Un nome DNS fornisce un modo coerente di utilizzare il proxy di autenticazione o i connettori di lingua per connettersi da reti diverse. La risposta dell'API di ricerca delle istanze fornisce un nome DNS suggerito che puoi utilizzare per creare il record DNS in una zona DNS privata nella rete VPC corrispondente.

gcloud

  1. Per visualizzare le informazioni di riepilogo su un'istanza Cloud SQL, incluso il nome DNS dell'istanza, utilizza il comando gcloud sql instances describe:

            gcloud sql instances describe INSTANCE_NAME \
              --project=PROJECT_ID
          

    Esegui queste sostituzioni:

    • INSTANCE_NAME: il nome dell'istanza Cloud SQL
    • PROJECT_ID: l'ID o il numero di progetto del progetto Google Cloud che contiene l'istanza

    Nella risposta, verifica che venga visualizzato il nome DNS. Questo nome ha il seguente pattern: INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.. Ad esempio: 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog..

    Se vuoi utilizzare un nome DNS personalizzato per connetterti a un'istanza Cloud SQL anziché utilizzare il nome DNS predefinito in questa sezione, configura l'impostazione del nome alternativo del soggetto (SAN) personalizzato durante la creazione dell'istanza. Il nome DNS personalizzato che inserisci nell'impostazione SAN personalizzata viene aggiunto al campo SAN del certificato del server dell'istanza. In questo modo puoi utilizzare il nome DNS personalizzato con la convalida del nome host in modo sicuro.

    Per ulteriori informazioni sulla configurazione dell'impostazione SAN personalizzata, vedi Crea istanze.

  2. Per creare una zona DNS privata, utilizza il comando gcloud dns managed-zones create. Questa zona è associata alla rete VPC utilizzata per connettersi all'istanza Cloud SQL tramite l'endpoint Private Service Connect.

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

    Effettua le seguenti sostituzioni:

    • ZONE_NAME: il nome della zona DNS
    • PROJECT_ID: l'ID o il numero di progetto del progetto Google Cloud che contiene la zona
    • DESCRIPTION: una descrizione della zona (ad esempio, una zona DNS per l'istanza Cloud SQL)
    • DNS_NAME: il nome del suffisso DNS per la zona, ad esempio REGION_NAME.sql.goog. (dove REGION_NAME è il nome della regione per la zona)
    • NETWORK_NAME: il nome della rete VPC
  3. Dopo aver creato l'endpoint Private Service Connect, per creare un record DNS nella zona, utilizza il comando gcloud dns record-sets create:

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

    Effettua le seguenti sostituzioni:

    • DNS_RECORD: il nome del record DNS. Questo record è impostato sul nome DNS recuperato dall'istanza Cloud SQL in precedenza in questa procedura (ad esempio,
      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE: il tipo di record di risorse del set di record DNS. Se l'indirizzo IP interno che hai prenotato per l'endpoint Private Service Connect è un indirizzo IPv4, specifica A per questo parametro. Altrimenti, se l'indirizzo IP per l'endpoint è un indirizzo IPv6, specifica AAAA.
    • RR_DATA: l'indirizzo IP allocato per l'endpoint Private Service Connect (ad esempio, 198.51.100.5). Puoi anche inserire più valori, ad esempio rrdata1 rrdata2 rrdata3 (ad esempio,
      10.1.2.3 10.2.3.4 10.3. 4.5).

REST

  1. Recupera il nome DNS di un'istanza Cloud SQL.
  2. Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

    • PROJECT_ID: l'ID o il numero di progetto del progetto Google Cloud che contiene l'istanza
    • INSTANCE_NAME: il nome dell'istanza

    Metodo HTTP e URL:

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

    Per inviare la richiesta, espandi una di queste opzioni:

    Dovresti ricevere una risposta JSON simile alla seguente:

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

    Il campo dnsName mostra il nome DNS dell'istanza Cloud SQL. I nomi DNS terminano sempre con un punto (.).

  3. Crea una zona DNS privata. Questa zona è associata alla rete VPC utilizzata per connettersi all'istanza Cloud SQL tramite l'endpoint Private Service Connect.
  4. Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

    • PROJECT_ID: l'ID o il numero di progetto del progetto Google Cloud che contiene la zona DNS
    • ZONE_NAME: il nome della zona
    • DESCRIPTION: una descrizione della zona (ad esempio, una zona DNS per l'istanza Cloud SQL)
    • DNS_NAME: il nome del suffisso DNS per la zona, ad esempio REGION_NAME.sql.goog. (dove REGION_NAME è il nome della regione per la zona)
    • NETWORK_NAME: il nome della rete VPC

    Metodo HTTP e URL:

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

    Corpo JSON della richiesta:

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

    Per inviare la richiesta, espandi una di queste opzioni:

    Dovresti ricevere una risposta JSON simile alla seguente:

    {
      "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. Dopo aver creato l'endpoint Private Service Connect, crea un record DNS nella zona.
  6. Prima di utilizzare i dati della richiesta, apporta le sostituzioni seguenti:

    • PROJECT_ID: l'ID o il numero di progetto del progetto Google Cloud che contiene la zona DNS.
    • ZONE_NAME: il nome della zona
    • DNS_RECORD: il nome del record DNS. Questo record è impostato sul nome DNS recuperato dall'istanza Cloud SQL in precedenza in questa procedura (ad esempio, 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE: il tipo di record di risorse del set di record DNS. Se l'indirizzo IP interno che hai riservato per l'endpoint Private Service Connect è IPv4, specifica A per questo parametro. Altrimenti, se l'indirizzo IP per l'endpoint è IPv6, specifica AAAA.
    • TTL: la durata (TTL) del set di record in secondi (ad esempio, 300).
    • RR_DATA: l'indirizzo IP allocato per l'endpoint Private Service Connect (ad esempio, 198.51.100.5). Puoi anche inserire più valori, ad esempio rrdata1 rrdata2 rrdata3 (ad esempio, 10.1.2.3 10.2.3.4 10.3.4.5).

    Metodo HTTP e URL:

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

    Corpo JSON della richiesta:

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

    Per inviare la richiesta, espandi una di queste opzioni:

    Dovresti ricevere una risposta JSON simile alla seguente:

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