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
Tener conocimientos sobre Cloud Service Mesh.
Configura tu proyecto:
gcloud config set core/project
PROJECT_ID
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.
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:
- Desarrollador de Cloud Run
(
roles/run.developer
) en el servicio Cloud Run - Usuario de cuenta de servicio
(
roles/iam.serviceAccountUser
) en la identidad de servicio
La cuenta de servicio del cliente de Cloud Run también debe tener los siguientes roles:
- Cliente de Traffic Director
(
roles/trafficdirector.client
) para acceder a las APIs de enrutamiento de servicios - Agente de Cloud Trace (
roles/cloudtrace.agent
) para habilitar el rastreo
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:
- Configurar una malla de servicios de Cloud
- Configurar Cloud DNS
- Crea el servicio de Cloud Run de destino
- Crea el NEG sin servidor
- Crear el servicio de Cloud Run del cliente
- Llamar al servicio desde el cliente de la malla
Configurar un Cloud Service Mesh
Para crear una ruta de servicio con la URL predeterminada, guarda la
Mesh
especificación en un archivo llamadomesh.yaml
:name:
MESH_NAME
Sustituye
MESH_NAME
por el nombre del recurso de malla.Importa el recurso
Mesh
de la especificación ejecutando el siguiente comando:gcloud network-services meshes import
MESH_NAME
\ --source=mesh.yaml \ --location=globalSustituye
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:
Crea una zona DNS gestionada privada en Cloud DNS para una malla de servicios.
gcloud dns managed-zones create
MESH_NAME
\ --description="Domain forDOMAIN_NAME
service mesh routes" \ --dns-name=DOMAIN_NAME
. \ --networks=VPC_NETWORK_NAME
\ --visibility=privateCrea 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=3600Haz 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:
- Configura Acceso privado de Google para tu red de VPC. No es necesario que configure un registro DNS personalizado.
- Adjunta un endpoint de Private Service Connect a Cloud Service Mesh.
Para ello, es necesario configurar un registro DNS personalizado para la URL
*.run.app
predeterminada de forma que se use la dirección del endpoint de Private Service Connect.
Crear el servicio de Cloud Run de destino
Tenga en cuenta que el destino de Cloud Run no puede tener la URL predeterminada inhabilitada.
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, comous-docker.pkg.dev/cloudrun/container/hello:latest
.
Crea el grupo de endpoints de red (NEG) sin servidor
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.
Crea un servicio de backend interno autogestionado que haga referencia al NEG sin servidor.
Crea el servicio de backend:
gcloud compute backend-services create
DESTINATION_SERVICE_NAME
-REGION
\ --global \ --load-balancing-scheme=INTERNAL_SELF_MANAGEDSustituye
DESTINATION_SERVICE_NAME
por el nombre del servicio de destino yREGION
por el nombre de la región.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 yREGION
por el nombre de la región.
Crea una ruta HTTP que haga referencia al servicio de backend.
Se han configurado los
Mesh
recursos y servicios. Conéctalos con un recursoHTTPRoute
que asocie un nombre de host a un servicio de backend.Crea la especificación
HTTPRoute
y guárdala en un archivo llamadohttp_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 URLrun.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.
Crea el recurso
HTTPRoute
con la especificación del archivohttp_route.yaml
:gcloud network-services http-routes import
DESTINATION_SERVICE_NAME
-route \ --source=http_route.yaml \ --location=globalConcede 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
\ --regionREGION
\ --member=serviceAccount:PROJECT_NUMBER
-compute@developer.gserviceaccount.com \ --role=roles/run.invokerHaz 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:
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.
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
- Descubre las configuraciones de red habituales de Cloud Run para redes públicas y privadas.
- Configurar redes privadas para Cloud Run
- Configurar proxies Envoy con servicios HTTP
- Dirigir el tráfico de los servicios de Cloud Run a las cargas de trabajo de Cloud Service Mesh en GKE
- Dirigir el tráfico de las cargas de trabajo de Cloud Service Mesh a los servicios de Cloud Run