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 acerca de 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 la malla de servicios de Cloud APIs de Service Enrutamiento. Estas APIs permiten que un servicio de Cloud Run llame a otros servicios de Cloud Run con una URL personalizada en lugar del proporcionó la URL de run.app. Además, Cloud Run automáticamente se autentica en el servicio de destino de Cloud Run no tienes que configurar tu propia autenticación para adjuntar credenciales de solicitud a otros servicios de Cloud Run.

Para llamar desde 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 destino de Cloud Run
  4. Crea el NEG sin servidores
  5. Crea el servicio cliente de Cloud Run
  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 Mesh la especificación en un archivo llamado mesh.yaml:

    name: MESH_NAME

    Reemplaza MESH_NAME por el recurso de malla de la fuente de datos.

  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. Cualquier RFC 1918 válido La dirección IP es aceptable porque el archivo adicional captura todo el tráfico IP a estas direcciones IP. de direcciones IP y lo redirecciona de manera adecuada.

En el siguiente ejemplo, se muestra cómo crear una entrada comodín * en 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. Crear una zona de DNS administrada y privada en Cloud DNS para un servicio de la red de VPC.

      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 dentro de la zona privada administrada que acabas de crear. Marca 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 la malla.
      • VPC_NETWORK_NAME: Es el nombre de tu VPC. network; por ejemplo, “predeterminado”.

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 se puede configurar como “interno” cuando habilitas una ruta de acceso a Cloud Run.

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

Crea el servicio de Cloud Run de destino

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

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

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

    Reemplaza lo siguiente:

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

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

  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 interno de backend autoadministrado que haga referencia al NEG sin servidores.

    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 asocia 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 que deseas usar para abordar la servicio. Todos los clientes de la misma malla de servicios pueden llamar a este servicio. usando la URL http://<HOSTNAME>, sin importar la región y el proyecto de el 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: Es el nombre de la servicio de destino de Cloud Run.
      • 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 cliente de Cloud Run, se crea un archivo adicional de Envoy. cuyos recursos se relacionan con las 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 de la cliente de Cloud Run.
    • 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.

Llama 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. Recupera la URL del servicio cliente de Cloud Run que con la ejecución del siguiente comando:

    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 cliente. servicio de Cloud Run.
    • 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 fortio endpoint 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

Implementa una ruta de servicio de Compute Engine y Cloud Service Mesh 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 instancias de Compute Engine.

Próximos pasos