Generare automată a secretelor în Helm

Generare automată a secretelor în Helm

Comanda Kubernetes aaS de la Mail.ru a tradus o notă scurtă despre cum să generați automat secrete Helm la actualizare. Mai departe, textul autorului articolului — directorul tehnic la Intoware, compania dezvoltatoare de soluții SaaS.

Containerele sunt grozave. La început am fost împotriva containerelor (tragic de recunoscut), dar acum sprijin pe deplin utilizarea acestei tehnologii. Dacă citiți asta, sper că ați navigat cu succes pe mările Docker, ați realizat avantajele Kubernetes și v-ați simplificat semnificativ viața cu Helm.

Cu toate acestea, unele lucruri sunt evident mai complicate decât ar trebui să fie.

Cum să generați automat secrete la actualizare?

Secretul Kubernetes este un resurs care conține perechi cheie/valoare pe care doriți să le utilizați în codul dumneavoastră. Acestea pot fi stringuri de conexiune la baza de date, parole de email și așa mai departe. Folosind secrete, creați o separare clară între cod și configurații, ceea ce permite configurarea ușoară a diferitelor desfășurări fără a modifica baza de cod.

O situație frecvent întâlnită este când două module trebuie să interacționeze printr-o cheie comună. Nimeni din afara clusterului nu ar trebui să știe această cheie, deoarece este destinată comunicării «de la unul la altul» în interiorul clusterului.

Crearea de secrete

De obicei, pentru a crea un secret în Helm, trebuie să:

  • descrieți secretul în fișierul de valori;
  • să-l suprascrieți în procesul de desfășurare;
  • să faceți referire la el în cadrul desfășurării/podului;
  • … profit!

De obicei, arată cam așa:

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

Un secret simplu Kubernetes, folosind valori din values.yml

Dar, să zicem că nu doriți să specificați secretul în fișierul de valori.

Există multe situații în care desfășurarea necesită o cheie comună, care trebuie generată în timpul instalării.

În exemplul de mai sus cu comunicarea între module, nu este recomandabil să împărtășiți secretul dincolo de desfășurare. Așadar, este foarte dorit ca Helm să aibă mecanisme pentru generarea automată a secretului fără a necesita specificarea directă a acestuia.

Hook-uri

Hooks allow you to execute code at specific points during the installation process. There may be a setup task that needs to run after the initial installation, or perhaps some cleanup is required before any updates are performed.

To solve our problem of adding a key generated during installation, pre-installation hooks are ideal. But there's one catch: you cannot automatically generate the secret once upon updating. Hooks will run on every update.

If you have generated your secret and your first installation has not yet taken place, then stop reading; the pre-installation hook is perfect for you.

But if the secret is part of an update (perhaps a new feature that was not available during installation), it's unfortunate that you cannot create a pre-installation hook that would run just once.

Functions

Helm functions allow you to add various script elements to deployment scripts.

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

This example shows that the value of the secret apiKey will be a new UUID generated during installation.

Helm includes a really extensive library of functions that utilizes amazing features of the GO templating and the Sprig function library to create customizable deployments.

Lookup Function

In Helm 3.1, the Lookup function, which allows querying existing deployments to:

  • check for the existence of resources;
  • return the value of an existing resource for future use.

By using both of these capabilities, we can create a one-time dynamically generated secret!

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

Whenever a new update is applied to the server, Helm will either generate a new secret value (if the secret does not yet exist) or reuse the existing value.

Good luck!

What else to read on the topic:

  1. Three levels of autoscaling in Kubernetes and how to use them effectively.
  2. Kubernetes in the spirit of piracy with an implementation template.
  3. Our Around Kubernetes channel on Telegram.

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster