Configura el DNS en Private Service Connect

En esta página, se describe cómo configurar el DNS en Private Service Connect.

Descripción general

Se recomienda usar DNS para conectarse a instancias que tienen habilitado Private Service Connect. Un nombre de DNS permite que diferentes redes se conecten a la misma instancia, en la que los extremos de Private Service Connect en cada red pueden tener direcciones IP diferentes. Además, el proxy de autenticación de Cloud SQL y los conectores de lenguaje requieren nombres de DNS para conectarse a estas instancias.

Las instancias de Cloud SQL con Private Service Connect habilitado pueden tener dos tipos de nombres de DNS:

  • Un nombre de DNS por instancia Esta opción está disponible para las instancias en todas las ediciones de Cloud SQL. La instancia principal y cada instancia de réplica tienen nombres de DNS por instancia diferentes.

  • Un nombre de DNS de extremo de escritura global. Esta opción está disponible para las instancias de la edición Cloud SQL Enterprise Plus, lo que ayuda con la recuperación ante desastres avanzada (ADR). Un extremo de escritura es un nombre de DNS global que se resuelve automáticamente en la dirección IP de la instancia principal actual. En el caso de una operación de conmutación por error o cambio de réplica, este extremo de escritura redirecciona automáticamente las conexiones entrantes a la nueva instancia principal. Cuando usas un extremo de escritura, puedes evitar tener que realizar cambios en la conexión de la aplicación cuando realizas una operación de conmutación por error o cambio de réplica para la recuperación de una interrupción regional o un simulacro de recuperación ante desastres.

Automatización de DNS en Private Service Connect

Para crear un nombre de DNS por instancia, puedes usar la función de automatización de DNS de Cloud SQL para configurar los registros y el nombre de DNS por ti. Cuando habilitas la automatización de DNS, Cloud SQL aprovisiona y administra automáticamente los registros DNS para el nombre de DNS por instancia en tus redes de VPC del consumidor autorizadas.

Con la automatización de DNS habilitada en una instancia de la edición de Cloud SQL Enterprise Plus, también puedes habilitar un nombre de DNS de extremo de escritura global que siempre se resuelva automáticamente en la dirección IP de la instancia principal actual.

De manera opcional, puedes configurar manualmente un registro DNS por instancia para la instancia (consulta Configura DNS de forma manual), pero te recomendamos que uses la automatización de DNS. La configuración manual de DNS es una opción heredada.

Requisitos previos para habilitar la automatización del DNS

  • Para usar la automatización de DNS o un nombre de DNS de extremo de escritura global, debes habilitar la API de Cloud DNS.
  • La automatización de DNS solo se puede habilitar cuando Private Service Connect está habilitado (usa el parámetro --enable-private-service-connect).
  • La automatización de DNS solo se puede habilitar cuando se especifica al menos una conexión automática de Private Service Connect (usa --psc-auto-connections=network).
  • Solo se puede habilitar un nombre de DNS de endpoint de escritura global para una instancia de la edición Cloud SQL Enterprise Plus que tenga habilitada la automatización de DNS.

Configuración de la automatización de DNS

Puedes habilitar la automatización de DNS y el nombre de DNS del extremo de escritura global cuando creas una instancia nueva con Private Service Connect habilitado, como se muestra en Crea una instancia de Cloud SQL.

También puedes habilitar o inhabilitar la automatización de DNS para instancias existentes. Cuando lo haces, Cloud SQL aprovisiona o limpia automáticamente los registros DNS asociados en las redes respectivas.

gcloud

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

REST

El método HTTP y la URL se verían de la siguiente manera:

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

El cuerpo de la solicitud JSON tendría un formato como el siguiente:

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

Realiza los siguientes reemplazos:

  • DNS_ENABLEMENT: true o false, según si quieres habilitar o inhabilitar la automatización de DNS.
  • GLOBAL_DNS_ENABLEMENT: true o false, según si deseas habilitar o inhabilitar un nombre de DNS de extremo de escritura global. Si es true, enable-psc-auto-dns también debe ser true.

Cómo ver los nombres de DNS

Puedes encontrar el nombre de DNS por instancia y el nombre de DNS del endpoint de escritura global para el proyecto con el comando describe.

gcloud

Nombre de DNS por instancia

Para encontrar el nombre de DNS por instancia creado con la automatización de DNS, usa el comando gcloud sql instances describe de la siguiente manera:

    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"
  

El resultado se verá de la siguiente manera (en el que DNS_NAME será el nombre de DNS por instancia de la instancia):

INSTANCE,CLOUD_SQL_AUTOMATION,DNS_NAME

El nombre de DNS terminará con el nombre de la región de la instancia seguido de .sql-psc-goog, de la siguiente manera:
INSTANCE,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.us-central1.sql-psc.goog.
Para devolver solo el nombre de DNS sin decorar, agrega | cut -d, -f3 al final del comando.

Nombre de DNS del extremo de escritura global

Del mismo modo, puedes usar el comando describe para encontrar el nombre de DNS del extremo de escritura global de tu clúster de replicación:

    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"
  

El resultado se verá de la siguiente manera (en el que GLOBAL_DNS_NAME será el nombre de DNS del extremo de escritura global para tu clúster de replicación):

CLUSTER,CLOUD_SQL_AUTOMATION,GLOBAL_DNS_NAME

El nombre de DNS del extremo de escritura global termina con .global.sql-psc-goog, como se muestra a continuación:
CLUSTER,CLOUD_SQL_AUTOMATION,d73a167a8c3a.2naantchj3tsc.global.sql-psc.goog. Para devolver solo el nombre de DNS sin decorar, agrega | cut -d, -f3 al final del comando.

REST

El método HTTP y la URL se verían de la siguiente manera:

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

El nombre de DNS por instancia y el nombre de DNS del extremo de escritura global se devolverían en el campo dnsNames de la respuesta, de la siguiente manera:

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

Puedes usar el nombre de DNS del endpoint de escritura global o el nombre de DNS por instancia para conectarte a la instancia. Consulta Conéctate con un registro DNS.

Campos de estado de automatización de DNS

Puedes determinar el estado del DNS de tu instancia y clúster de replicación en estos dos campos de salida:

  • instanceAutoDnsStatus: Muestra el estado del DNS por instancia.
  • writeEndpointAutoDnsStatus: Muestra el estado del DNS del extremo de escritura global.

Ambos campos pueden tener los siguientes valores:

  • AUTO_DNS_STATUS_UNSPECIFIED
  • AUTO_DNS_OK
  • AUTO_DNS_FAILED
  • AUTO_DNS_UNKNOWN

Estos campos aparecen en el campo de salida 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"
      }
    ]

Soluciona problemas de automatización de DNS

Si la API de Cloud DNS no está habilitada, falta la política de conexión de Private Service Connect o hay errores de backend durante la creación del registro DNS, es posible que la automatización de DNS no pueda crear un registro DNS por instancia o un nombre DNS de extremo de escritura global.

Hay dos marcas que puedes usar con la API de update/patch o la CLI de gcloud si te encuentras en una situación en la que la automatización de DNS no se aprovisionó correctamente:

  • --reconcile-psc-networking (boolean): Cuando se configura, Cloud SQL intenta restablecer cualquier parte de la automatización de DNS que no funcione. Esta marca no causa tiempo de inactividad.
  • --reconcile-psc-networking-force (boolean): Similar a reconcile-psc-networking, pero, si se configura, Cloud SQL intenta restablecer por completo toda la automatización del DNS a costa de un breve tiempo de inactividad en las partes existentes de la automatización del DNS del PSC que funcionan. Esto puede ayudar en algunos casos en los que reconcile-psc-networking no lo hace.

Asigna nombres de DNS personalizados

Puedes configurar nombres de DNS personalizados para tus instancias de Cloud SQL de Private Service Connect. Simplemente crea un registro CNAME con el nombre de DNS de la instancia de Private Service Connect como su valor. Por ejemplo, si deseas configurar tus aplicaciones con el nombre de DNS de la base de datos sample-db.mycompany.example.com para hacer referencia a la instancia de la base de datos con el nombre de DNS de Private Service Connect abcdef123456.987654321fedcb.us-central1.sql-psc.goog, primero deberás configurar la instancia con un nombre de DNS personalizado y, luego, crear un registro CNAME de DNS con el proveedor de DNS:

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

Configura DNS de forma manual

Te recomendamos que uses la automatización de DNS, ya que la configuración manual de DNS es una opción heredada. De manera opcional, puedes configurar manualmente un registro DNS por instancia. Un nombre de DNS proporciona una forma coherente de usar el proxy de autenticación o los conectores de lenguaje para conectarse desde diferentes redes. La respuesta de la API de búsqueda de instancias proporciona un nombre de DNS sugerido que puedes usar para crear el registro DNS en una zona del DNS privado en la red de VPC correspondiente.

gcloud

  1. Para ver información resumida sobre una instancia de Cloud SQL, incluido el nombre de DNS de la instancia, usa el comando gcloud sql instances describe:

            gcloud sql instances describe INSTANCE_NAME \
              --project=PROJECT_ID
          

    Realiza los siguientes reemplazos:

    • INSTANCE_NAME: El nombre de la instancia de Cloud SQL
    • PROJECT_ID: El ID o el número del proyecto del proyecto Google Cloud que contiene la instancia

    En la respuesta, verifica que aparezca el nombre de DNS. Este nombre tiene el siguiente patrón: INSTANCE_UID.PROJECT_DNS_LABEL.REGION_NAME.sql.goog.. Por ejemplo: 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog..

    Si deseas usar un nombre de DNS personalizado para conectarte a una instancia de Cloud SQL en lugar del nombre de DNS predefinido en esta sección, configura el parámetro de configuración del nombre alternativo del sujeto (SAN) personalizado mientras creas la instancia. El nombre de DNS personalizado que insertas en el parámetro de configuración de SAN personalizado se agrega al campo SAN del certificado de servidor de la instancia. Esto te permite usar el nombre de DNS personalizado con la validación del nombre de host de forma segura.

    Para obtener más información sobre cómo configurar el parámetro de configuración de SAN personalizado, consulta Crea instancias.

  2. Para crear una zona del DNS privada, usa el comando gcloud dns managed-zones create. Esta zona está asociada con la red de VPC que se usa para conectarse a la instancia de Cloud SQL a través del extremo de Private Service Connect.

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

    Realiza los siguientes reemplazos:

    • ZONE_NAME: el nombre de la zona del DNS
    • PROJECT_ID: Es el ID o el número del proyecto del proyecto Google Cloud que contiene la zona.
    • DESCRIPTION: una descripción de la zona (por ejemplo, una zona de DNS para la instancia de Cloud SQL)
    • DNS_NAME: el nombre del sufijo de DNS para la zona, como REGION_NAME.sql.goog. (en el que REGION_NAME es el nombre de la región de la zona)
    • NETWORK_NAME es el nombre de la red de VPC.
  3. Después de crear el extremo de Private Service Connect, para crear un registro DNS en la zona, usa el 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
          

    Realiza los siguientes reemplazos:

    • DNS_RECORD: el nombre del registro DNS. Este registro se establece en el nombre de DNS que recuperaste de la instancia de Cloud SQL anteriormente en este procedimiento (por ejemplo,
      1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE: Es el tipo de registro de recursos del conjunto de registros DNS. Si la dirección IP interna que reservaste para el extremo de Private Service Connect es una dirección IPv4, especifica A para este parámetro. De lo contrario, si la dirección IP del extremo es una dirección IPv6, especifica AAAA.
    • RR_DATA: Es la dirección IP asignada para el extremo de Private Service Connect (por ejemplo, 198.51.100.5). También puedes ingresar varios valores, como rrdata1 rrdata2 rrdata3 (por ejemplo,
      10.1.2.3 10.2.3.4 10.3. 4.5).

REST

  1. Obtén el nombre de DNS de una instancia de Cloud SQL.
  2. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • PROJECT_ID: El ID o el número del proyecto del proyecto Google Cloud que contiene la instancia
    • INSTANCE_NAME: Es el nombre de la instancia.

    HTTP method and URL:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

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

    El campo dnsName muestra el nombre de DNS de la instancia de Cloud SQL. Los nombres de DNS siempre terminan con un punto (.).

  3. Crea una zona del DNS privado. Esta zona está asociada con la red de VPC que se usa para conectarse a la instancia de Cloud SQL a través del extremo de Private Service Connect.
  4. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • PROJECT_ID: el ID o el número del proyecto del proyecto Google Cloud que contiene la zona del DNS
    • ZONE_NAME: el nombre de la zona
    • DESCRIPTION: una descripción de la zona (por ejemplo, una zona del DNS para la instancia de Cloud SQL)
    • DNS_NAME: el nombre del sufijo DNS para la zona, como REGION_NAME.sql.goog. (en el que REGION_NAME es el nombre de la región de la zona)
    • NETWORK_NAME es el nombre de la red de VPC.

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

    {
      "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. Después de crear el extremo de Private Service Connect, crea un registro DNS en la zona.
  6. Antes de usar cualquiera de los datos de solicitud a continuación, realiza los siguientes reemplazos:

    • PROJECT_ID: Es el ID o el número del proyecto de Google Cloud que contiene la zona del DNS.
    • ZONE_NAME: el nombre de la zona
    • DNS_RECORD: el nombre del registro DNS. Este registro se establece en el nombre de DNS que recuperaste de la instancia de Cloud SQL anteriormente en este procedimiento (por ejemplo, 1a23b4cd5e67.1a2b345c6d27.us-central1.sql.goog.).
    • RRSET_TYPE: Es el tipo de registro de recursos del conjunto de registros DNS. Si la dirección IP interna que reservaste para el extremo de Private Service Connect es IPv4, especifica A para este parámetro. De lo contrario, si la dirección IP del extremo es IPv6, especifica AAAA.
    • TTL: el tiempo de actividad (TTL) para el conjunto de registros en cantidad de segundos (por ejemplo, 300).
    • RR_DATA: la dirección IP asignada para el extremo de Private Service Connect (por ejemplo, 198.51.100.5). También puedes ingresar varios valores, como rrdata1 rrdata2 rrdata3 (por ejemplo, 10.1.2.3 10.2.3.4 10.3.4.5).

    Método HTTP y URL:

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

    Cuerpo JSON de la solicitud:

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

    Para enviar tu solicitud, expande una de estas opciones:

    Deberías recibir una respuesta JSON similar a la que se muestra a continuación:

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