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
Tener conocimientos sobre Cloud Service Mesh
Configura tu proyecto:
gcloud config set core/project
PROJECT_ID
En la consola de Google Cloud, habilita las siguientes APIs para tu proyecto:
API de Acceso a VPC sin servidores si usas un conector de Acceso a VPC sin servidores y no la VPC directa para la salida de red
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:
- Desarrollador de Cloud Run (
roles/run.developer
) en el servicio de Cloud Run - Usuario de la cuenta de servicio (
roles/iam.serviceAccountUser
) en la identidad del 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 seguimiento
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:
- Configura una malla de servicios en la nube
- Configura Cloud DNS
- Crea el servicio de Cloud Run de destino
- Crea el NEG sin servidores
- Crea el servicio de Cloud Run del cliente
- Llama al servicio desde el cliente de malla
Configura una malla de servicios de Cloud
Para crear una ruta de servicio con la URL predeterminada, guarda la especificación
Mesh
en un archivo llamadomesh.yaml
:name:
MESH_NAME
Reemplaza
MESH_NAME
por el nombre del recurso de malla.Ejecuta el siguiente comando para importar el recurso
Mesh
de la especificación:gcloud network-services meshes import
MESH_NAME
\ --source=mesh.yaml \ --location=globalReemplaza
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:
Crea una zona de DNS privada administrada 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
. \ --network=VPC_NETWORK_NAME
\ --visibility=privateCrea 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=3600Reemplaza 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:
- Configura el Acceso privado a Google para tu red de VPC. No es necesario configurar un registro DNS personalizado.
- Adjunta un extremo de Private Service Connect a Cloud Service Mesh.
Esto requiere la configuración de un registro DNS personalizado para que la URL predeterminada de
*.run.app
use la dirección del extremo de Private Service Connect.
Crea el servicio de Cloud Run de destino
Ten en cuenta que el destino de Cloud Run no puede tener la URL predeterminada inhabilitada.
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, comous-docker.pkg.dev/cloudrun/container/hello:latest
.
Crea el grupo de extremos de red sin servidores (NEG)
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.
Crea un servicio de backend interno autoadministrado 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_MANAGEDReemplaza
DESTINATION_SERVICE_NAME
por el nombre del servicio de destino yREGION
por el nombre de la región.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 yREGION
por el nombre de la región.
Crea una ruta HTTP que haga referencia al servicio de backend.
Los servicios y el recurso
Mesh
están configurados. Conéctalos con un recursoHTTPRoute
que asocie un nombre de host con 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
"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 URLrun.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.
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=globalEjecuta 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
\ --regionREGION
\ --member=serviceAccount:PROJECT_NUMBER
-compute@developer.gserviceaccount.com \ --role=roles/run.invokerReemplaza 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:
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.
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
- Explora las configuraciones de redes comunes de Cloud Run para redes públicas y privadas
- Configura redes privadas para Cloud Run
- Configura proxies de Envoy con servicios HTTP