Xeración automática de segredos en Helm

Xeración automática de segredos en Helm

Equipo Kubernetes aaS de Mail.ru traduciu unha breve nota sobre como xerar automaticamente segredos Helm ao actualizar. O seguinte é un texto do autor do artigo - director técnico de Intoware, unha empresa que desenvolve solucións SaaS.

Os recipientes son xeniais. Ao principio era anti-contedor (dáme vergoña de admitilo), pero agora apoio totalmente o uso desta tecnoloxía. Se estás a ler isto, é de esperar que navegases con éxito polos mares de Docker, que te decataras das vantaxes de Kubernetes e che facilitaches moito a vida con Helm.

Non obstante, algunhas cousas son claramente máis difíciles do que deben ser.

Como xerar automaticamente segredos ao actualizar?

Un segredo de Kubernetes é un recurso que contén pares clave/valor que queres usar no teu código. Poden ser cadeas de conexión de bases de datos, contrasinais de correo electrónico, etc. Ao usar segredos, creas unha separación clara entre o código e a configuración, o que che permite personalizar facilmente diferentes implementacións sen cambiar a base de código.

Unha situación habitual é cando dous módulos deben comunicarse mediante unha clave común. Ninguén fóra do clúster debería coñecer esta chave, xa que está pensada para a comunicación un a un dentro do clúster.

Facendo segredos

Normalmente, para crear un segredo en Helm cómpre:

  • describir o segredo no ficheiro de valores;
  • redefinilo durante o despregamento;
  • referirse a el dentro do despregue/pod;
  • ... beneficio!

Normalmente parece algo así:

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ .Values.MyApiKeySecret | quote }}

Un simple segredo de Kubernetes usando valores de values.yml

Pero digamos que non queres especificar o teu segredo no ficheiro de valores.

Hai moitas opcións cando a implantación require unha chave compartida, que debe xerarse durante a instalación.

No exemplo de comunicación de módulo a módulo anterior, non é desexable compartir o segredo fóra da implantación. Polo tanto, é moi desexable que Helm teña mecanismos para xerar automaticamente un segredo sen ter que especificalo directamente.

Ganchos

Os ganchos permítenche executar código en lugares específicos durante o proceso de instalación. É posible que haxa un traballo de configuración que deba executarse despois da primeira instalación, ou quizais teña que facer unha limpeza antes de realizar calquera actualización.

Para resolver o noso problema de engadir unha chave xerada durante a instalación, os ganchos de preinstalación son ideais. Pero hai un problema: non pode xerar automaticamente o segredo unha vez nunha actualización. Os ganchos funcionarán en cada actualización.

Se xeraches o teu segredo e aínda non se produciu a túa primeira instalación, deixa de ler, o gancho de preinstalación funcionará moi ben para ti.

Pero se o segredo forma parte dunha actualización (quizais unha nova función que non estaba alí durante a instalación), é unha mágoa que non poidas crear un gancho de preinstalación que só funcione unha vez.

Funcións

As funcións Helm permítenche engadir varios elementos de scripts aos teus scripts de implementación.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it

Este exemplo mostra que o valor do segredo apiKey será o novo UUID xerado durante a instalación.

Helm inclúe unha biblioteca de funcións verdadeiramente extensa que aproveita as sorprendentes funcións de modelos GO e a biblioteca de funcións de Sprig para crear despregamentos personalizados.

Función de busca

Engadido en Helm 3.1 Función de busca, que lle permite solicitar unha implantación existente e:

  • comprobar a existencia de recursos;
  • devolver o valor dun recurso existente para o seu uso posterior.

Usando estas dúas capacidades, podemos crear un segredo único e xerado de forma dinámica.

# 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 }}

Sempre que se aplique unha nova actualización ao servidor, Helm xerará un novo valor secreto (se aínda non hai ningún segredo) ou reutilizará o valor existente.

Boa sorte!

Que máis ler sobre o tema:

  1. Tres niveis de escalado automático en Kubernetes e como usalos de forma eficaz.
  2. Kubernetes no espírito da piratería cun modelo para a súa implementación.
  3. A nosa canle En torno a Kubernetes en Telegram.

Fonte: www.habr.com

Engadir un comentario