En esta entrada voy a detallar cómo limpiar un cluster de DC/OS. Lo podemos conseguir mediante una serie de actuaciones para mantenerlo «limpio» y funcional mientras lo usamos para realizar pruebas en fases de desarrollo.
Cuando se implementan nuevos frameworks para DC/OS con las librerías de DC/OS commons o directamente sobre Apache Mesos, es muy común acumular en el clúster reservas de recursos que no se eliminan correctamente, componentes de sistemas distribuidos sin un estado de terminación correcto o tareas aisladas de algún scheduler o framework como Marathon.
Escribo esta entrada como referencia personal a la que consultar en estas ocasiones. Y como creo que puede ser de utilidad a otras personas ¡allá va!
Contenidos
No desinstalar frameworks de DC/OS a través del botón de la interfaz
El botón DELETE de la interfaz gráfica de DC/OS puede dejar recursos sin liberar sobre nuestro clúster si se trata de un framework registrado directamente en Mesos.
Por lo tanto, no está recomendado desinstalar de esta forma los servicios que estemos probando en la fase de desarrollo. A continuación se detallan formas para desinstalarlo correctamente y realizar una limpieza de los recursos reservados.
Desinstalar el framework desde CLI
El procedimiento más adecuado para desinstalar un framework que estemos desarrollando es con el siguiente comando de DC/OS CLI:
dcos uninstall --app-id=<service-name> <service>
Por ejemplo, en el caso de querer desinstalar una instancia del servicio hdfs con nombre hdfs-test el comando sería el siguiente:
dcos uninstall --app-id=hdfs-test hdfs
Limpiar el framework mediante Janitor
Existe una utilidad proporcionada por D2iQ llamada Janitor Script que se encarga de limpiar un cluster DC/OS, en concreto, las instalaciones de frameworks. Este script elimina las reservas de recursos asociados al framework, así como la instancia del servicio y los datos asociados en el Zookeeper.
Podemos ejecutarlo en un contenedor Docker. Para ello necesitamos tener el clúster configurado previamente con el comando dcos:
docker run mesosphere/janitor /janitor.py -m $(dcos config show core.dcos_url)/mesos/master/ -r <service_name>-role -a $(dcos config show core.dcos_acs_token)
Teardown del framework en Mesos
Este mecanismo hace uso de la API de Apache Mesos. Para ello necesitamos conocer el id del framework que queramos eliminar del clúster. El primer paso es acceder a la interfaz gráfica de Apache Mesos a través de:
https://<master-url>/mesos/
En esta página, accedemos a la pestaña de frameworks e identificamos el que deseamos eliminar copiando su id. El framework también se puede encontrar en la lista de inactivos, lo que indica que se ha eliminado de forma incompleta y será necesario el comando teardown:
curl -v -X POST http://hostname:5050/teardown -d 'frameworkId=<frameworkId>'
Limpieza de Zookeeper (Exhibitor)
Para limpiar un cluster DC/OS, también hay que tener en cuenta los datos de Zookeeper. Si necesitamos eliminar manualmente los datos asociados a un framework en Zookeeper (Exhibitor) de DC/OS podemos hacerlo a través de su interfaz gráfica. Para acceder usamos la siguiente dirección:
http://<master-url>/exhibitor/
Navegamos a la pestaña Explorer. Aquí nos aparecerán las entradas con el nombre de la instancia de cada servicio registrado. Podemos eliminar la que nos interese escribiendo un comentario.
Forzar desinstalación
En ocasiones, el framework se puede quedar atascado en el despliegue o en la desinstalación. Si este framework tiene una herramienta por línea de comandos (CLI), podemos usar el parámetro que fuerza la terminación del plan de despliegue:
dcos <package-name> plan force-complete deploy $phase $step --name=<instance-name>
Eliminar volúmenes persistentes
Para eliminar la reserva de este tipo de recursos hay que destruir el volumen creado previamente. Podemos ver los agentes del clúster y las reservas de recursos que tienen asociadas en el siguiente endpoint:
http://<master-url>/mesos/slaves
En el JSON que nos muestra debemos buscar el identificador reserved_resources y el detalle de los recursos en reserved_resources_full. Cada reserva tiene asociada un nombre y un rol, nos deberemos quedar con el JSON completo de cada reserva en este apartado para usar contra el endpoint unreserve de la API de Mesos. Además de las reservas, tenemos que identificar los recursos, en concreto los de tipo disk que nos interese eliminar.
Para eliminar un disco debemos usar el siguiente comando, en el que volume.json contiene los discos que queramos eliminar como aparecen en el JSON original:
curl -L -v -i \
-d slaveId=<slave-id> \
-d @volume.json \
<master-url>:5050/destroy-volumes
Después, para eliminar las reservas usamos el siguiente comando, en el que unreserve.json contiene el JSON con la reserva asociada.
curl -L -v -i \
-d slaveId=<slave-id> \
-d @unreserve.json \
<master-url>:5050/unreserve
Notas adicionales
Es importante analizar la causa de cada uno de estos errores en la desinstalación de nuestro framework, ya que podrían indicar errores en el código, en su definición de healthchecks, o en los planes de despliegue y de recuperación.
Un endpoint realmente útil para hacer debug de nuestras pruebas es el que muestra los logs de las ofertas al framework:
http://<master-url>/service/<service-name>/v1/debug/offers
En el siguiente enlace podéis encontrar más información acerca de la limpieza de recursos en un cluster DC/OS escrito por D2IQ (Mesosphere):
https://mesosphere.github.io/field-notes/faqs/cleanup.html