Configura Cloud Service Mesh para Cloud Run

En esta página, se muestra cómo configurar Cloud Service Mesh para que se ejecute en una variedad de infraestructuras de procesamiento para los servicios de Cloud Run.

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

Antes de comenzar

  1. Tener conocimientos sobre Cloud Service Mesh

  2. Configura tu proyecto:

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

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

    gcloud components update

Roles obligatorios

Para obtener los permisos que necesitas para configurar y, luego, implementar los servicios de Cloud Run, pide a tu administrador que te otorgue los siguientes roles de IAM:

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

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

Cómo realizar llamadas entre servicios de Cloud Run con 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 con 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 con Cloud Service Mesh, sigue estos pasos:

  1. Configura una malla de servicios en la nube
  2. Configura Cloud DNS
  3. Crea el servicio de Cloud Run de destino
  4. Crea el NEG sin servidores
  5. Crea el servicio de Cloud Run del cliente
  6. Llama al servicio desde el cliente de malla

Configura una malla de servicios de Cloud

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

    name: MESH_NAME

    Reemplaza MESH_NAME por el nombre del recurso de malla.

  2. Ejecuta el siguiente comando para importar el recurso Mesh de la especificación:

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

    Reemplaza MESH_NAME por el nombre del recurso de malla.

Configura Cloud DNS

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

Cuando un cliente de malla llama al servicio de destino, el nombre de host que se usa en la solicitud se debe poder resolver a través de DNS. Se acepta cualquier dirección IP válida de RFC 1918 porque el contenedor secundario captura todo el tráfico de IP a estos rangos de direcciones IP y lo redirecciona de forma adecuada.

En el siguiente ejemplo, se muestra cómo crear una entrada * con 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 que corresponda a los servicios de Cloud Run a los que deseas que se pueda dirigir desde la malla.

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

    1. Crea una zona de DNS privada administrada 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. \
      --network=VPC_NETWORK_NAME \
      --visibility=private
    2. Crea un registro DNS en la zona privada administrada que acabas de crear. Asegúrate de que la dirección IP 10.0.0.1 no esté en uso.

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

      Reemplaza lo siguiente:

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

Accede 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 envía desde tu malla a través de la red de nube privada virtual se puede establecer como "interno" cuando habilitas una ruta de acceso a Cloud Run.

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

Crea el servicio de Cloud Run de destino

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

  1. Implementa un servicio de Cloud Run nuevo o existente:

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

    Reemplaza lo siguiente:

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

Crea el grupo de extremos de red sin servidores (NEG)

  1. Ejecuta el siguiente comando para crear el NEG de destino:

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

    Reemplaza lo siguiente:

    • REGION: es el nombre de la región.
    • DESTINATION_SERVICE_NAME: El nombre del servicio de Cloud Run de destino.
  2. Crea un servicio de backend interno autoadministrado 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

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

    2. Agrega el backend sin servidores al servicio de backend:

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

      Reemplaza 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.

    Los servicios y el recurso Mesh están configurados. Conéctalos con un recurso HTTPRoute que asocie un nombre de host con 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"
      

      Establece los nombres de host en los nombres que deseas usar para dirigir el servicio. Todos los clientes de la misma malla de servicios pueden llamar a este servicio con la URL http://<HOSTNAME>, independientemente de la región y el proyecto del llamador. Si configuraste Cloud DNS para usar 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.

      Reemplaza lo siguiente:

      • DESTINATION_SERVICE_NAME: El nombre del servicio de Cloud Run de destino.
      • DOMAIN_NAME: Es el nombre del dominio DNS.
      • PROJECT_ID: el ID del proyecto.
      • MESH_NAME: Es el nombre de la malla.
      • REGION: es 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. Ejecuta el siguiente comando para otorgar el rol de invocador de Cloud Run (roles/iam.invoker) en el servicio de destino de Cloud Run:

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

      Reemplaza lo siguiente:

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

Crea el servicio de Cloud Run del cliente

Cuando creas un servicio de Cloud Run cliente, se crea un sidecar de Envoy cuyos recursos se relacionan con tu QPS y el tamaño total de la configuración. La mayor parte del tiempo, el uso de la CPU es inferior al 1% de una CPU virtual 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 pruebas, implementa la app de fortio en Cloud Run para permitir el reenvío de tráfico a las 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"

    Reemplaza lo siguiente:

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

Cómo llamar al servicio desde un cliente de malla

Para reenviar una solicitud a la ruta de destino con la app de prueba de fortio de la sección anterior Crea un servicio de cliente, haz lo siguiente:

  1. Ejecuta el siguiente comando para recuperar la URL del servicio cliente de Cloud Run que creaste:

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

    Reemplaza lo siguiente:

    • CLIENT_SERVICE_NAME: Es el 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 extremo de fortio del paso anterior:

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

    Reemplaza lo siguiente:

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

Llama al backend de Compute Engine desde Cloud Run

Para implementar una ruta de servicio de Compute Engine y Cloud Service Mesh con grupos de instancias administrados como backends, configura el servidor HTTP basado en Compute Engine en Cloud Service Mesh. Esto permite que los clientes de Cloud Run usen esta ruta de servicio de backend para enviar solicitudes directamente a las instancias de Compute Engine.

Próximos pasos