Configurar Cloud Service Mesh para Cloud Run

En esta página se muestra cómo configurar Cloud Service Mesh para que se ejecute en una serie de infraestructuras informáticas para servicios de Cloud Run.

Cloud Service Mesh te permite habilitar funciones avanzadas de gestión del tráfico, como la división del tráfico ponderada y el balanceo de carga global, así como políticas de observabilidad y seguridad para el tráfico de un servicio de Cloud Run a otro. También te ofrece una solución de plano de datos totalmente gestionada que elimina la carga operativa de mantener tus propios sidecars de malla de servicios.

Antes de empezar

  1. Tener conocimientos sobre Cloud Service Mesh.

  2. Configura tu proyecto:

    gcloud config set core/project PROJECT_ID
  3. En la Google Cloud consola, habilita las siguientes APIs en tu proyecto:

    Si usas un conector de Acceso a VPC sin servidor y no una VPC directa para la salida de red.

  4. Actualiza los componentes de gcloud a la versión más reciente (488.0.0 o posterior):

    gcloud components update

Roles obligatorios

Para obtener los permisos que necesitas para configurar e implementar servicios de Cloud Run, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos:

La cuenta de servicio del cliente de Cloud Run también debe tener los siguientes roles:

Para ver una lista de los roles y permisos de gestión de identidades y accesos asociados a Cloud Run, consulta los artículos sobre roles de gestión de identidades y accesos de Cloud Run y permisos de gestión de identidades y accesos de Cloud Run. Si tu servicio de Cloud Run interactúa con APIs, como las bibliotecas de cliente de Cloud, consulta la guía de configuración de la identidad del servicio.Google Cloud Para obtener más información sobre cómo conceder roles, consulta los artículos sobre permisos de implementación y gestión del acceso.

Llamadas entre servicios de Cloud Run mediante Cloud Service Mesh

Cloud Run usa las APIs de enrutamiento de servicios de Cloud Service Mesh. Estas APIs permiten que un servicio de Cloud Run llame a otros servicios de Cloud Run mediante una URL personalizada en lugar de la URL run.app proporcionada. Además, Cloud Run se autentica automáticamente en el servicio de Cloud Run de destino para que no tengas que configurar tu propia autenticación para adjuntar credenciales de solicitud a otros servicios de Cloud Run.

Para llamar de un servicio de Cloud Run a otro mediante Cloud Service Mesh, sigue estos pasos:

  1. Configurar una malla de servicios de Cloud
  2. Configurar Cloud DNS
  3. Crea el servicio de Cloud Run de destino
  4. Crea el NEG sin servidor
  5. Crear el servicio de Cloud Run del cliente
  6. Llamar al servicio desde el cliente de la malla

Configurar un Cloud Service Mesh

  1. Para crear una ruta de servicio con la URL predeterminada, guarda la Mesh especificación en un archivo llamado mesh.yaml:

    name: MESH_NAME

    Sustituye MESH_NAME por el nombre del recurso de malla.

  2. Importa el recurso Mesh de la especificación ejecutando el siguiente comando:

    gcloud network-services meshes import MESH_NAME \
      --source=mesh.yaml \
      --location=global

    Sustituye MESH_NAME por el nombre del recurso de malla.

Configurar Cloud DNS

Puedes omitir la configuración de Cloud DNS y pasar a la siguiente sección si usas un endpoint de Private Service Connect con la dirección URL run.app completa como nombre de host, ya que solo se capturan direcciones IP privadas.

Cuando un cliente de malla llama al servicio de destino, el nombre de host usado en la solicitud debe poder resolverse a través del DNS. Se acepta cualquier dirección IP RFC 1918 válida, ya que el sidecar captura todo el tráfico IP a estos intervalos de direcciones IP y lo redirige correctamente.

En el siguiente ejemplo se muestra cómo crear una entrada * comodín en la zona de Cloud DNS que se resuelve en una sola dirección IP. Si no quieres usar una zona de Cloud DNS exclusiva, crea una entrada de Cloud DNS para cada nombre de host correspondiente a los servicios de Cloud Run a los que quieras poder acceder desde la malla.

  • Para crear un registro de Cloud DNS en una zona exclusiva, ejecuta los siguientes comandos:

    1. Crea una zona DNS gestionada privada en Cloud DNS para una malla de servicios.

      gcloud dns managed-zones create MESH_NAME \
      --description="Domain for DOMAIN_NAME service mesh routes" \
      --dns-name=DOMAIN_NAME. \
      --networks=VPC_NETWORK_NAME \
      --visibility=private
    2. Crea un registro DNS en la zona gestionada privada que acabas de crear. Asegúrate de que la dirección IP 10.0.0.1 no se esté utilizando.

      gcloud dns record-sets create "*.DOMAIN_NAME." \
      --type=A \
      --zone="MESH_NAME" \
      --rrdatas=10.0.0.1 \
      --ttl=3600

      Haz los cambios siguientes:

      • DOMAIN_NAME: nombre del dominio DNS.
      • MESH_NAME: el nombre del recurso de malla.
      • VPC_NETWORK_NAME: nombre de tu red VPC; por ejemplo, "default".

Acceder a servicios internos con Cloud Service Mesh

Cloud Run te permite restringir el tráfico de red entrante a "interno". Si tu servicio tiene habilitada esta restricción de entrada, el tráfico que se desplace desde tu malla a través de la red de nube privada virtual se puede definir como "interno" cuando habilites una ruta de acceso a Cloud Run.

Para acceder a servicios internos con Cloud Service Mesh, usa uno de los siguientes métodos:

Crear el servicio de Cloud Run de destino

Tenga en cuenta que el destino de Cloud Run no puede tener la URL predeterminada inhabilitada.

  1. Despliega un servicio de Cloud Run nuevo o ya creado:

    gcloud run deploy DESTINATION_SERVICE_NAME \
    --no-allow-unauthenticated \
    --region=REGION \
    --image=IMAGE_URL 

    Haz los cambios siguientes:

    • DESTINATION_SERVICE_NAME: nombre del servicio de Cloud Run de destino.
    • REGION: el nombre de la región.
    • IMAGE_URL: una referencia a la imagen del contenedor, como us-docker.pkg.dev/cloudrun/container/hello:latest.

Crea el grupo de endpoints de red (NEG) sin servidor

  1. Crea el NEG de destino ejecutando el siguiente comando:

    gcloud compute network-endpoint-groups create DESTINATION_SERVICE_NAME-neg \
    --region=REGION \
    --network-endpoint-type=serverless \
    --cloud-run-service=DESTINATION_SERVICE_NAME

    Haz los cambios siguientes:

    • REGION: el nombre de la región.
    • DESTINATION_SERVICE_NAME: nombre del servicio de Cloud Run de destino.
  2. Crea un servicio de backend interno autogestionado que haga referencia al NEG sin servidor.

    1. Crea el servicio de backend:

      gcloud compute backend-services create DESTINATION_SERVICE_NAME-REGION \
      --global \
      --load-balancing-scheme=INTERNAL_SELF_MANAGED

      Sustituye DESTINATION_SERVICE_NAME por el nombre del servicio de destino y REGION por el nombre de la región.

    2. Añade el backend sin servidor al servicio de backend:

      gcloud compute backend-services add-backend DESTINATION_SERVICE_NAME-REGION \
      --global \
      --network-endpoint-group=DESTINATION_SERVICE_NAME-neg \
      --network-endpoint-group-region=REGION

      Sustituye DESTINATION_SERVICE_NAME por el nombre del servicio de destino y REGION por el nombre de la región.

  3. Crea una ruta HTTP que haga referencia al servicio de backend.

    Se han configurado los Mesh recursos y servicios. Conéctalos con un recurso HTTPRoute que asocie un nombre de host a un servicio de backend.

    1. Crea la especificación HTTPRoute y guárdala en un archivo llamado http_route.yaml:

      name: "DESTINATION_SERVICE_NAME-route"
      hostnames:
      - "DESTINATION_SERVICE_NAME.DOMAIN_NAME"
      meshes:
      - "projects/PROJECT_ID/locations/global/meshes/MESH_NAME"
      rules:
      - action:
         destinations:
         - serviceName: "projects/PROJECT_ID/locations/global/backendServices/DESTINATION_SERVICE_NAME-REGION"
      

      Asigna a los nombres de host los nombres que quieras usar para dirigirte al servicio. Todos los clientes de la misma malla de servicios pueden llamar a este servicio mediante la URL http://<HOSTNAME>, independientemente de la región y el proyecto del llamante. Si has configurado Cloud DNS para que use una dirección IP privada, el nombre de host de la ruta también puede ser la dirección URL run.app completa. En ese caso, puedes omitir el paso de configuración de Cloud DNS.

      Haz los cambios siguientes:

      • DESTINATION_SERVICE_NAME: nombre del servicio de Cloud Run de destino.
      • DOMAIN_NAME: nombre del dominio DNS.
      • PROJECT_ID: el ID del proyecto.
      • MESH_NAME: el nombre de la malla.
      • REGION: el nombre de la región.
    2. Crea el recurso HTTPRoute con la especificación del archivo http_route.yaml:

      gcloud network-services http-routes import DESTINATION_SERVICE_NAME-route \
      --source=http_route.yaml \
      --location=global
      
    3. Concede el rol Invocador de Cloud Run (roles/iam.invoker) al servicio de destino de Cloud Run ejecutando el siguiente comando:

      gcloud run services add-iam-policy-binding DESTINATION_SERVICE_NAME \
      --region REGION \
      --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
      --role=roles/run.invoker

      Haz los cambios siguientes:

      • DESTINATION_SERVICE_NAME: nombre del servicio de Cloud Run de destino.
      • REGION: el nombre de la región.
      • PROJECT_NUMBER: el número del proyecto.

Crear el servicio de Cloud Run del cliente

Al crear un servicio de Cloud Run de cliente, se crea un sidecar de Envoy cuyos recursos están relacionados con las QPS y el tamaño total de la configuración. La mayoría de las veces, el uso de la CPU es inferior al 1 % de una vCPU y el uso de la memoria es inferior a 50 MB.

Debes tener acceso de salida de red a una red de nube privada virtual.

  • Para crear el servicio de cliente para las pruebas, despliega la aplicación fortio en Cloud Run para permitir el reenvío de tráfico a rutas HTTP:

    gcloud beta run deploy CLIENT_SERVICE_NAME \
    --region=REGION \
    --image=fortio/fortio \
    --network=VPC_NETWORK_NAME \
    --subnet=SUBNET_NAME \
    --mesh="projects/PROJECT_ID/locations/global/meshes/MESH_NAME"

    Haz los cambios siguientes:

    • CLIENT_SERVICE_NAME: nombre del servicio de Cloud Run del cliente.
    • REGION: el nombre de tu región.
    • VPC_NETWORK_NAME: nombre de tu red VPC; por ejemplo, "default".
    • SUBNET_NAME: el nombre de tu subred; por ejemplo, "default".
    • PROJECT_ID: el ID de tu proyecto.
    • MESH_NAME: el nombre del recurso de malla.

Llamar a un servicio desde un cliente de malla

Para reenviar una solicitud a la ruta de destino mediante la aplicación de prueba fortio de la sección Crear servicio de cliente anterior, haz lo siguiente:

  1. Para obtener la URL del servicio de cliente de Cloud Run que has creado, ejecuta el siguiente comando:

    TEST_SERVICE_URL=$(gcloud run services describe CLIENT_SERVICE_NAME \
    --region=REGION --format="value(status.url)" \
    --project=PROJECT_ID)

    Haz los cambios siguientes:

    • CLIENT_SERVICE_NAME: nombre del servicio de Cloud Run del cliente.
    • REGION: el nombre de tu región.
    • PROJECT_ID: el ID de tu proyecto.
  2. Usa el comando curl para enviar una solicitud a la ruta de destino del endpoint de fortio del paso anterior:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" "$TEST_SERVICE_URL/fortio/fetch/DESTINATION_SERVICE_NAME.DOMAIN_NAME"

    Haz los cambios siguientes:

    • DESTINATION_SERVICE_NAME: nombre del servicio de Cloud Run de destino.
    • DOMAIN_NAME: nombre del dominio DNS.

Llamar a un backend de Compute Engine desde Cloud Run

Para desplegar una ruta de servicio de Compute Engine y Cloud Service Mesh con grupos de instancias gestionados como backends, configura el servidor HTTP basado en Compute Engine en Cloud Service Mesh. De esta forma, los clientes de Cloud Run pueden usar esta ruta de servicio de backend para enviar solicitudes directamente a las instancias de Compute Engine.

Pasos siguientes