Gestión de configuraciones y secretos con la plantilla Consul en Kubernetes

Onur Yilmaz

Sigue

Mar 23, 2020 – 6 min read

Como equipo de plataforma en Trendyol Tech, uno de nuestros objetivos era hacer que la configuración de aplicaciones y la gestión de secretos fueran dinámicas, fiables, seguras y se abstrajeran de las aplicaciones. Hemos estado usando Kubernetes ConfigMaps y Secretos durante mucho tiempo y no satisfacen nuestros requisitos completamente. Por ejemplo, cuando cambiamos una configuración en un ConfigMap, tenemos que reiniciar nuestros pods de aplicación para que este cambio tenga efecto. A veces se necesitan varios minutos para que el cambio se refleje en todas las instancias de la aplicación. Otro problema es que los secretos de Kubernetes no son lo suficientemente seguros. Necesitamos que nuestros secretos sean seguros y auditables.

Nuestros principales requisitos eran;

  • Deberíamos ser capaces de cambiar las configuraciones de las aplicaciones dinámicamente sin reiniciar los procesos de la aplicación. Cuando cambiamos una configuración, debe afectar a todas las instancias de la aplicación al instante.
  • Nuestros secretos de aplicación deben ser seguros y auditables. También queremos proporcionar un control de acceso a los secretos basado en roles.
  • Necesitamos abstraer la gestión de la configuración de las aplicaciones. En otras palabras, las aplicaciones no deben saber dónde y cómo se guardan los secretos y las configuraciones y se les proporciona.
  • Nuestro sistema de gestión de configuraciones y secretos debe tener una alta disponibilidad y ser escalable.

Después de algunas investigaciones, se nos ocurrieron 2 aplicaciones; envconsul y consul-template.

Ya sabíamos que Vault es la herramienta estándar de la industria para almacenar secretos. Satisface todos nuestros requisitos y tiene características como los secretos dinámicos, que podrían ser útiles para nosotros en el futuro. También puedes utilizar Consul como backend de almacenamiento para Vault.

Consul es una herramienta distribuida, altamente disponible y escalable para el descubrimiento y configuración de servicios. En nuestro caso, sólo utilizaremos la función de almacén de valores clave de Consul para mantener las configuraciones no secretas.

Podríamos utilizar envconsul o consul-template principalmente para el tercer requisito: abstraer la gestión de la configuración de las aplicaciones.

Envconsul proporciona una forma de lanzar un subproceso con variables de entorno pobladas desde Consul y Vault.

Consul-template rellena los valores de Consul y Vault en el sistema de archivos y mantiene los valores sincronizados mientras se trabaja en modo demonio.

Una regla de la App de Doce Factores es, almacenar las configuraciones en el entorno. Pero el problema con Envconsul (o variables de entorno) es que no puedes cambiar las variables de entorno de un proceso sin reiniciarlo. Esto va en contra de nuestro primer requisito. Queremos ser capaces de cambiar las configuraciones sin reiniciar los procesos de la aplicación. Por eso nos decidimos por consul-template.

Arquitectura básica del proceso de aplicación y del demonio consul-template que se ejecutan juntos

En consul-template, se puede utilizar un archivo de plantilla para renderizar los archivos de configuración. Esto nos da una gran flexibilidad. Aquí hay un ejemplo de archivo de plantilla;

Consul-template lee esta plantilla, reemplaza los marcadores de posición con valores de Consul si utiliza la palabra clave «key» y de Vault si utiliza la palabra clave «with secret». Puede encontrar más información sobre el lenguaje de plantillas aquí. El archivo de salida renderizado se vería así;

server:
port: "8080"
toggles:
fooEnabled: true
database:
username: "username"
password: "password"

Deja una respuesta

Tu dirección de correo electrónico no será publicada.