DEV Community

Google Cloud Run 101

Conoce Cloud Run y despliega una aplicación en la nueva plataforma de Google para contenedores.

¿Qué es Google Cloud Run?

Es una plataforma para ejecutar contenedores de forma totalmente administrada (aka serverless) que se ejecuta en Google Cloud, basada en knative y kubernetes.

Características de Cloud Run

Algunas de las características que hacen a Cloud Run una alternativa interesante son:

  • Puedes usar cualquier lenguaje de programación, librería o programas del sistema operativo, siempre y cuando esté empaquetado en un contenedor

  • Sólo pagas por el tiempo en que los contenedores atienden tu petición, si tu servicio no atiende peticiones, ¡Simplemente no pagas nada!

  • Puedes configurar el auto escalamiento de tus contenedores, para atender más peticiones on-demand

  • Provee auto-balanceamiento, redundancia, seguridad HTTPs por default, administración de logs y monitoreo

  • Tiene una couta gratis de 50 vCPU-horas al mes

¿Porqué elegir Cloud Run en lugar de Cloud Functions?

La otra solución de aplicaciones serverless de Google Cloud es Cloud Functions, la cuál permite ejecutar aplicaciones sin administración de servidores, pero sólo están disponibles para PHP, Python, Javascript y Go con el entorno de desarrollo de Google (SDK), así que el uso de librerías, versiones de lenguaje y dependencias está restringida por el entorno que Google mantiene.

¿Qué necesito para ejecutar contenedores sobre Google Cloud Run?

El punto clave de Cloud Run es que tu servicio web (HTTP o gRPC) funcionaría sin modificaciones, siempre y cuando respete las condiciones de ejecución:

  • El CPU está activo mientras procesa una petición HTTP, es decir mientras el contenedor esté en ejecución pasiva (sin atender peticiones), prácticamente no tendrá acceso al CPU.

  • El acceso al sistema de archivos local es limitado, todo archivo que se escriba por tu aplicación se cargará en memoria RAM del contenedor.

  • Está diseñado para ejecutar contenedores stateless

Para conocer todas las características podemos ver los detalles en la siguiente liga

¡Ahora vamos a hacer nuestro primer despliegue en Cloud Run!

¡Manos a la obra!

Para desplegar nuestro servicio en Cloud Run, vamos a desplegar una aplicación disponible en este repositorio de Github

Para este tutorial vamos a usar una cuenta de Google Cloud (no te preocupes, está dentro de la cuota gratuita), Docker y algún cliente para consumir servicios HTTP

Como podemos ver en el archivo Dockerfile del proyecto, construye una aplicación en Go que comprime imágenes jpg, levantando un servidor HTTP escuchando en el puerto especificado de la variable de entorno $PORT.

FROM golang:1.14-alpine as builder
WORKDIR /opt
COPY . /opt
RUN go build .

FROM alpine:3.11
RUN addgroup -S webgroup && adduser -S appgroup -G webgroup
USER appgroup
WORKDIR /opt
COPY --from=builder /opt/cloud-run-example .
ENV PORT
ENTRYPOINT [ "/opt/cloud-run-example" ]
Enter fullscreen mode Exit fullscreen mode

Para desplegar el servicio vamos a acceder a Google Cloud, y usar un proyecto existente o crear uno nuevo.

Una vez tengamos un proyecto, vamos a abrir Cloud Run y configurar un nuevo servicio:

Ubicamos la sección de Cloud Run

Ubicamos la sección de Cloud Run

Y creamos un nuevo servicio

Y creamos un nuevo servicio

Ahora llenaremos el siguiente formulario

Ahora llenaremos el siguiente formulario

En el formulario ingresaremos el nombre cloud-run-101, y la región en la que se ejecutará el servicio.

En la sección de autenticación eligiremos que el servicio permita peticiones sin autenticar. Al montar el servicio en producción deberíamos usar algún método de autenticación, ya sea integrado en el servicio o usando Cloud IAM.

El ayudante de Cloud Run nos solicita una imagen de Docker, la cual subiremos a continuación

El ayudante de Cloud Run nos solicita una imagen de Docker, la cual subiremos a continuación

Para desplegar la imagen que usaremos en nuestro repositorio privado de imágenes, abriremos una sesión de Cloud Shell y escribiremos el siguiente comando:

docker pull wraven/cloud-run-example:latest
Enter fullscreen mode Exit fullscreen mode

Con el fin de descargar la imagen a nuestro repositorio de docker local. Lo que haremos después será re-etiquetar la imagen para subirla a nuestro repositorio privado. Por ello usaremos el id del proyecto, el cual obtendremos revisando el apartado de proyectos.

En esta sección encontraremos el id del proyecto

En esta sección encontraremos el id del proyecto

Pondremos el id del proyecto como una variable en nuestra terminal, etiquetaremos de nuevo la imagen para subirla a nuestro repositorio privado.

export PROJECT_ID=<tu-proyect-id>
docker tag wraven/cloud-run-example gcr.io/$PROJECT_ID/cloud-run-example:1.0
docker push gcr.io/$PROJECT_ID/cloud-run-example:1.0
Enter fullscreen mode Exit fullscreen mode

¡La imagen ya se puede utilizar en Cloud Run!

¡La imagen ya se puede utilizar en Cloud Run!

Vamos a ingresar el tag de la imagen en el asistente y después pulsaremos Crear

Este es el último paso y habremos creado el servicio de Cloud Run

Este es el último paso y habremos creado el servicio de Cloud Run

Después de esto, veremos una pantalla donde se estará desplegando el servicio y nos dará una URL donde podremos consultarlo cuando esté disponible.

Esta es la pantalla de información para nuestro servicio de Cloud Run

Esta es la pantalla de información para nuestro servicio de Cloud Run

Estas son algunas propiedades relevantes sobre nuestro despliegue:

Propiedad Valor Descripción
CPU asignada 1 vCPUs asignados al contenedor
Memoria asignada 256 MB Memoria RAM asignada
Simultaneidad 80 Peticiones concurrentes que puede atender cada contenedor
Tiempo de espera de solicitud 900 second Tiempo máximo de respuesta

También podremos ver la URL del servicio desplegado, donde ya podemos procesar peticiones, similar a esta:

URL: https://cloud-run-example-bcexihr6qaff.a.run.app

Si consultamos el servicio en un navegador, obtendremos una respuesta en JSON:

Nuestro servicio ya está disponible y listo para usarse

Nuestro servicio ya está disponible y listo para usarse

Ahora vamos a probar su funcionalidad. Para este servicio requerimos enviar una imagen JPEG y un parametro en
la url calidad con el valor (0-100) de la calidad en la que queremos obtener la respuesta.

Probaremos usando Postman adjuntando una imagen a la petición POST.

Probaremos usando Postman adjuntando una imagen a la petición POST

Se especifica el párametro URL calidad con el porcentaje de calidad que se desea obtener. Al enviar la petición obtenemos una imagen con menor tamaño

Se especifica el párametro URL calidad

Podemos probar con distintas imágenes y calidad para probar el funcionamiento del contenedor. Ahora, en la
pestaña de registros podemos ver los logs del servicio.

Los logs del servicio que se imprimen en la salida estándar se verán en este apartado

Los logs del servicio que se imprimen en la salida estándar se verán en este apartado

Vamos a desplegar otra versión del servicio para ajustar la configuración. Seleccionemos la opción
Editar y desplegar una nueva revisión.

Ajustaremos el tiempo de respuesta a 300s, la memoria RAM a 128 MB y el máximo de 4 instancias

Ajustaremos el tiempo de respuesta a 300s, la memoria RAM a 128 MB y el máximo de 4 instancias

Marcaremos Servir esta revisión de inmediato y pulsamos desplegar

Marcaremos Servir esta revisión de inmediato y pulsamos desplegar

Después de unos segundos que inicie el contenedor, podremos ver la información de la nueva revisión.

Los detalles muestran la información de nuestra segunda revisión

Los detalles muestran la información de nuestra segunda revisión

Despliegues instantáneos con un sólo click

Después de hacer el proceso de despliegue manual, vamos a probar desplegando el mismo servicio usando un Cloud Run Button.

Vamos al repositorio de ejemplo y pulsemos sobre el botón Run on Google Cloud

Usaremos Run on Google Cloud para desplegar el servicio de manera más sencilla

Usaremos Run on Google Cloud para desplegar el servicio de manera más sencilla

Nos mostrará un mensaje informativo sobre lo que sigue a continuación: Clonará el repositorio, construirá la imagen de Docker con la información del Dockerfile

Nos mostrará un mensaje informativo sobre lo que sigue a continuación: Clonará el repositorio, construirá la imagen de Docker con la información del *Dockerfile*

Ahora en una ventana de Cloud Shell, se mostrará el detalle del despliegue con algunas preguntas

Primero se revisa el proyecto de Google Cloud donde se construirá el servicio

Primero se revisa el proyecto de Google Cloud donde se construirá el servicio

Se construye la imagen de Docker dentro de Cloud Shell

Se construye la imagen de Docker dentro de Cloud Shell

La sube al registro de Docker privado e inicia el despliegue. Veremos el detalle del servicio, la URL desde la cual es accesible y el panel de administración para revisar los detalles

Se inicia el despliegue

Si ejecutamos el servicio a esta nueva URL veremos que también funciona

Gracias a Cloud Run Button en el repositorio de Github y el Dockerfile configurado en él, fue más rápido desplegar el mismo servicio

Gracias a Cloud Run Button fue más rápido desplegar el mismo servicio

Limpiando todo

Volvamos a la sección de Cloud Run para eliminar el servicio que creamos,
después abriremos una terminal de Cloud Shell para borrar las imágenes construidas de nuestro registro privado.

Eliminamos el servicio desde Cloud Run, nos pedirá una confirmación, y Aceptamos pulsando Eliminar

Eliminamos el servicio desde Cloud Run, nos pedirá una confirmación, y Aceptamos pulsando Eliminar

Vamos al Shell para eliminar las imágenes que existen en el repositorio privado

Vamos al Shell para eliminar las imágenes que existen en el repositorio privado

El comando para eliminar las imágenes es el siguiente:

gcloud container images delete gcr.io/$PROJECT_ID/cloud-run-example
Enter fullscreen mode Exit fullscreen mode

¡Espero te haya gustado la publicación! Comparte tus dudas o comentarios aquí :)

Para más información

Consulta las ligas oficiales de Cloud Run y algunos ejemplos prácticos:

Discussion (0)