Enviar registros de Docker a Stackdriver usando gcplogs

Cuando se trata de soluciones de registro, puedes elegir una solución administrada o no administrada. Si decides utilizar este último y se encuentra en Google Cloud Platform, la opción que te recomiendo es Stackdriver Logging.

Google ofrece un paquete personalizado basado en fluentd para enviar registros a stackdriver (hablaremos de ello en una próxima publicación), pero si solo te preocupan los registros de Docker y si deseas evitar instalar software en las compute instances hay una opción más fácil: gcplogs .

Requisitos

Para poder enviar registros a Stackdriver, lo primero que debes hacer es crear una cuenta de servicio y asignarla a las compute instaces. Deben establecerse los siguientes permisos en la nueva cuenta de servicio:

  • role/metricWriter
  • role/loggingWriter

Es posible que también debas definir el siguiente scope en la compute instance o en el instance template que debería usar la cuenta de servicio:

  • scope: cloud-platform

No lo veremos paso a paso, suponemos que ya sabes cómo hacerlo 🙂

Indica a Docker que use el controlador gcplogs

WARNING: El uso del controlador gcplogs te impedirá inspeccionar los registros con el comando «docker logs», solo podrás acceder a ellos desde Stackdriver.

Este controlador ya viene con docker, por lo que no necesitarás instalar nada más que docker daemon. Dependiendo de cómo ejecutemos los contenedores, el uso del controlador puede diferir ligeramente.

Usando Docker Run

docker run --log-driver=gcplogs ...

Usando docker-compose

nginx:
    image: nginx
    container_name: nginx
    logging:
        driver: gcplogs
    ports:
        - 80:80

¿Puedo enviar registros desde fuentes externas?

¡Por supuesto! Si deseas enviar registros de Docker a Stackdriver desde fuera del entorno GCP (por ejemplo, desde una instancia de AWS), ¡aún puede hacerlo! Solo necesitas establecer las variables de entorno con las credenciales e iniciar Docker con algunos parámetros adicionales.

Primero, deberás configurar la variable GOOGLE_APPLICATION_CREDENTIALS (hay documentos oficiales sobre esto: https://docs.docker.com/machine/drivers/gce/). Deberías poder usar la misma cuenta de servicio que creamos anteriormente.

Ahora solo necesitas ejecutar docker con los siguientes parámetros:

docker run --log-driver=gcplogs 
--log-opt gcp-project=test-project
--log-opt gcp-meta-zone=west1 
--log-opt gcp-meta-name=`hostname` 
your/application

Visualizar registros

Por defecto, todos los registros están agrupados por instances. Si tienes un autoscaler y, por lo tanto, se están ejecutando múltiples réplicas del contenedor, es posible que desees filtrar los registros según el nombre del contenedor. Para hacerlo, solo necesita escribir la consulta deseada:

resource.type="gce_instance" "my_container_name"

Stackdriver te ofrece la opción de almacenar consultas para acceder a ellas en cualquier momento sin tener que volver a escribirlas. Para hacerlo, simplemente escriba la regla y haz clic en «Save Search». Luego, lo encontrarás en «Show library»

Y si deseas ver TODOS los registros enviados por Docker, puedes hacer clic en el menú desplegable «all logs» y seleccionar «docker-gcplogs-driver». Al configurar esta opción, podrás visualizar todos los registros enviados con este controlador.

Para resumir

Como puedes ver, ha sido bastante fácil configurarlo todo. Aunque generalmente se recomienda usar stackdriver logging agent, en mi opinión ésta es una solución válida y útil cuando no deseas o no tienes tiempo para empaquetar una imagen personalizada o instalar software adicional en las instances.

La parte más molesta es la creación de la cuenta de servicio y la configuración de los permisos y ámbitos correctos, pero también tendrás que lidiar con eso cuando use el agente de registro stackdriver.

Espero que esta publicación os haya sido de utilidad. No dudes en contactarnos si deseas que te ayudemos en tus proyectos. ¡Nos vemos en el próximo!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *