Levantando Containers en Ambientes Serverless en GCP

grunportada

Intro

Vamos a explorar dos servicios para gestionar y levantar contenedores en la plataforma de Google Cloud, el primero de ellos es la container registry que nos ofrece este proveedor, llamado simplemente GCR (Google Container Registry), vamos a construir nuestra imagen Docker y vamos a etiquetarla para luego subirla y almacenarla en este servicio, lo vamos a hacer desde la cloudshell (herramienta de línea de comandos en el navegador que nos ofrece la plataforma). Luego vamos a levantar una aplicación de prueba utilizando Cloud Run, que básicamente es un servicio totalmente administrado de GCP para levantar contenedores en ambientes serverless, dicho servicio utiliza en su backend otra herramienta muy interesante llamada Knative. Lo más importante: solamente debemos indicar que imagen queremos utilizar, setear un par de cositas, y tenemos nuestro container UP and RUNNING !! MAGIA PURA de la mano de GCP

Paso 0: Seleccionar o Crear un Proyecto

Lo primero que tenemos que hacer es elegir en qué proyecto vamos a trabajar, GCP organiza todos los recursos en proyectos, podemos trabajar sobre el proyecto default que nos ofrece la plataforma, o podemos crear uno de pruebas y luego eliminarlo cuando no lo necesitamos más etc.

proyecto

Google Container Registry

Vamos a buscar container registry en el buscador de servicios y como es común en GCP, antes de comenzar a utilizar un determinado servicio, debemos habilitar la API del mismo, lo hacemos dándole clic a habilitar y luego vamos a poder comenzar a utilizar GCR.

apigcr

Una vez habilitada la API de GCR vamos a hacer clic en el botón activar cloudshell en la esquina superior derecha de nuestro panel de GCP y se nos va a abrir una sesión de linea de comandos en nuestro browser

Algo no menor para mencionar sobre la cloudshell de GCP que marca una diferencia con respecto a las cloudshell de Ms Azure o AWS es que en la cloudshell de GCP ademas de tener la CLI del proveedor preinstalada (en este caso llamada gcloud) tenemos tambien Docker completamente instalado, hago énfasis en lo de “completamente” porque tenemos disponible no solo el componente CLI sino también el componente Daemon, algo que es imposible hacerlo desde la cloudshell de Azure o AWS porque no está soportado, es decir las otras dos cloudshells tienen solamente el cliente de Docker, podemos hacer un “docker pull” pero no podemos levantar containers en el storage de la cloudshell (a menos que levantemos recursos adicionales, pero nativamente en la cloudshell no podemos hacerlo) punto para la cloudshell de GCP…

Una vez que abrimos la cloudshell vamos a ejecutar el siguiente comando:

$ gcloud auth configure-docker

Esto nos va a loguear contra GCR lo cual a su vez nos va a habilitar a poder taguear y comenzar a subir imágenes a nuestra registry

auth

Ahora vamos a construir y taguear una imagen para subirla a GCR, pueden utilizar el Dockerfile que prefieran, pueden escribirlo en un editor dentro de la cloudshell, o subirlo desde sus laptops a la cloudshell, o clonarlo desde un repositorio etc. yo voy a usar el viejo y confiable Dockerfile de flask

FROM python:3.7.3-slim

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip install -r requirements.txt

COPY . .

CMD [ "python3", "-m" , "flask", "run", "--host=0.0.0.0"]

No se pongan críticos con la escritura del Dockerfile porque soy consciente de que le faltan buenas prácticas, pero es muy útil para ejemplos xD, lo mas importante en este punto es como taguear la imagen, nuestro comando de build debería tener esta facha:

$ docker build -t gcr.io/PROJECT_ID/flaskapp:v1 .

El valor de PROJECT_ID lo encuentran en el dashboard inicial de GCP

Luego… PUSH:

$ docker push gcr.io/PROJECT_ID/flaskapp:v1

Eso es todo, si vamos a la consola de GCR veremos nuestra imagen correctamente tagueada y almacenada en la registry

gcrfin

Cloud Run

Ahora vamos con la parte más divertida, en nuestro cuadro de búsqueda del dashboard de GCP escribimos run y seleccionamos el servicio Cloud Run, en esta ocasión no hace falta habilitar la API del servicio por separado, simplemente lanzamos el wizard de servicio de Cloud Run y el mismo botón activa la API e inicia el asistente.

grun005

En tres simples pasos tendremos todo funcionando, en primer lugar vamos a elegir un nombre y una region para nuestro servicio de Cloud Run

grun006

Luego debemos indicarle a Cloud Run donde se encuentra la imagen de contenedor que deseamos utilizar, podemos pegar la URL de un repo directamente, o podemos darle clic al botón seleccionar, veremos que gcp nos ofrece la posibilidad de utilizar la imagen de nuestra flaskapp que acabamos de subir a GCR, o también podemos seleccionar una app demo llamada hello, vamos a ir por esa opción.

grun007

Por último podemos configurar nuestro ingress model, es decir, cómo queremos acceder a nuestro servicio, a modo de ejemplo vamos a dejarlo expuesto directamente a internet (no hagan eso en produccion) y luego tambien marcamos la configuracion sobre authn en nuestro servicio, como es un sitio web sencillo, vamos a dejar marcada la primer opción, ahora le damos con todo al botón CREAR y listo, el proceso de creación va a demorar unos pocos segundos ya que la imagen HELLO es un sitio web sencillo.

grun008

Una vez en verde nuestro servicio, podemos hacer clic en la URL que nos provee el dashboard de Cloud Run para ver el resultado.

grun009

Veremos nuestro sitio web de prueba, y lo mas importante, sin preocuparnos por el escalamiento de la infra hacia arriba o hacia abajo, la infra de GCP y el servicio Cloud Run tomaran esas tareas por nosotros.

grun010

Que clase de magia negra se encuentra detrás de un servicio tan copado??

bart

Cloud Run lo dice abiertamente, y la magia de este servicio ocurre gracias a una herramienta más que interesante llamada Knative la cual básicamente permite correr cargas de tipo Serverless en un cluster de Kubernetes (si… una hermosa locura) en la pestaña de YAML de nuestro servicio Cloud Run podemos ver el manifest de definición de nuestro servicio como un objeto de la api de Knative, sin dudas una herramienta que merece su propio curso completo.

grun011

Fuente

Material Extra: Curso “Devops en 5 Pasos” Disponible en Udemy

Temas:

  • Docker
  • Kubernetes
  • MultiCloud (AWS - Azure - GCP)
  • IaC (Terraform, Cloud Formation, ARM Templates, Cloud Resource Manager)
  • CI/CD Pipelines (GitlabCI, Azure Devops, CircleCI)

Descripción completa: Detalle y enlaces del curso

Invitame un CaféInvitame un Café