
Comando sobre cómo generar automáticamente secretos de Helm al actualizar. A continuación, el texto del autor del artículo: el director técnico de Intoware, una empresa desarrolladora de soluciones SaaS.
Los contenedores son geniales. Al principio, era un opositor de los contenedores (me da vergüenza admitirlo), pero ahora apoyo completamente el uso de esta tecnología. Si lees esto, espero que hayas navegado exitosamente por los mares de Docker, reconocido las ventajas de Kubernetes y simplificado considerablemente tu vida con Helm.
Sin embargo, algunas cosas son claramente más complicadas de lo que deberían ser.
¿Cómo generar automáticamente secretos al actualizar?
Un secreto de Kubernetes es un recurso que contiene pares de clave/valor que deseas usar en tu código. Estos pueden ser cadenas de conexión a bases de datos, contraseñas de correo electrónico, etc. Al usar secretos, creas una clara separación entre el código y la configuración, lo que permite personalizar diferentes despliegues sin modificar la base de código.
Un escenario común es cuando dos módulos deben interactuar mediante una clave compartida. Nadie fuera del clúster debería conocer esta clave, ya que está destinada para la comunicación 'de uno a otro' dentro del clúster.
Creación de secretos
Normalmente, para crear un secreto en Helm, necesitas:
- describir el secreto en el archivo de valores;
- sobreeescribirlo durante el despliegue;
- referenciarlo dentro del despliegue/pod;
- … ¡ganancia!
Normalmente se ve algo así:
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ .Values.MyApiKeySecret | quote }}
Un secreto básico de Kubernetes, utilizando valores de values.yml
Pero, digamos que no quieres especificar tu secreto en el archivo de valores.
Hay muchas situaciones en las que se necesita una clave compartida durante el despliegue, que debe ser generada al instalar.
En el ejemplo anterior con la comunicación entre módulos, no es recomendable compartir el secreto fuera del despliegue. Por lo tanto, es muy deseable que Helm tenga mecanismos para crear automáticamente el secreto sin necesidad de especificarlo directamente.
Hooks
Los hooks permiten ejecutar código en ciertos puntos del proceso de instalación. Puede haber una tarea de configuración que necesite ejecutarse después de la primera instalación, o quizás se deba realizar una limpieza antes de llevar a cabo cualquier actualización.
Para resolver nuestro problema de adición de la clave generada durante la instalación, los hooks preinstalación son ideales. Pero hay una traba: no puedes generar automáticamente el secreto una sola vez durante una actualización. Los hooks funcionarán en cada actualización.
Si has generado tu secreto y tu primera instalación aún no se ha realizado, entonces deja de leer, el hook preinstalación es perfecto para ti.
Pero si el secreto forma parte de la actualización (tal vez una nueva función que no existía en el momento de la instalación), es lamentable que no se pueda crear un hook preinstalación que se ejecute solo una vez.
Funciones
Las funciones de Helm permiten añadir varios elementos de scripts a los guiones de despliegue.
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ uuidv4 | quote }} #Genera un nuevo UUID y cítalo
Este ejemplo muestra que el valor del secreto apiKey será un nuevo UUID, generado durante la instalación.
Helm incluye una extensa biblioteca de funciones que utiliza sorprendentes plantillas de GO y la biblioteca de funciones Sprig para crear despliegues personalizables.
Función Lookup
En Helm 3.1 se añadió , que permite consultar un despliegue existente y:
- verificar la existencia de recursos;
- devolver el valor de un recurso existente para usos posteriores.
Utilizando estas dos capacidades, podemos crear un secreto dinámicamente generado que sea de una sola vez.
# 1. Запросить существование секрета и вернуть в переменной $secret
{{- $secret := (lookup "v1" "Secret" .Release.Namespace "some-awesome-secret" -}}
apiVersion: v1
kind: Secret
metadata:
name: some-awesome-secret
type: Opaque
# 2. Если секрет существует, взять его значение как apiKey (секрет использует кодирование Base64, так что используйте ключ "data")
{{ if $secret -}}
data:
apiKey: {{ $secret.data.apiKey }}
# 3. Если секрет не существует — создать его (в этот раз используйте "stringData", так как будет обычное значение)!
{{ else -}}
stringData:
apiKey: {{ uuidv4 | quote }}
{{ end }}
Cada vez que se aplica una nueva actualización al servidor, Helm generará un nuevo valor para el secreto (si aún no se ha creado) o reutilizará el valor existente.
¡Éxitos!
Lecturas adicionales sobre el tema:
- .
- .
- .
Fuente: habr.com
