Auto-generazione di segreti in Helm

Auto-generazione di segreti in Helm

Team Kubernetes aaS di Mail.ru ho tradotto una breve nota su come generare automaticamente i segreti di Helm durante l'aggiornamento. Di seguito il testo dell'autore dell'articolo, il direttore tecnico di Intoware, una società sviluppatrice di soluzioni SaaS.

I container sono fantastici. All'inizio ero scettico riguardo ai container (è imbarazzante dirlo), ma ora supporto completamente l'uso di questa tecnologia. Se stai leggendo questo, spero che tu abbia navigato con successo nei mari di Docker, realizzato i vantaggi di Kubernetes e semplificato notevolmente la tua vita con Helm.

Tuttavia, alcune cose sono chiaramente più complicate di quanto dovrebbero essere.

Come generare automaticamente i segreti durante l'aggiornamento?

Un segreto di Kubernetes è una risorsa che contiene coppie chiave/valore che desideri utilizzare nel tuo codice. Possono essere stringhe di connessione al database, password email e così via. Utilizzando i segreti, crei una chiara separazione tra codice e configurazioni, consentendo una facile configurazione di diversi deployment senza modificare il codice sorgente.

Situazione comune in cui due moduli devono interagire utilizzando una chiave comune. Nessuno al di fuori del cluster dovrebbe conoscere questa chiave, poiché è destinata a comunicazioni "da uno all'altro" all'interno del cluster.

Creazione di segreti

Di solito, per creare un segreto in Helm, è necessario:

  • descrivere il segreto in un file di valori;
  • sovrascriverlo durante il processo di deployment;
  • farvi riferimento all'interno del deployment/pod;
  • … profitto!

Di solito appare così:

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

Un semplice segreto Kubernetes che utilizza valori da values.yml

Ma, supponiamo che non si desideri specificare il segreto nel file di valori.

Ci sono molte opzioni quando per il deployment è necessaria una chiave comune che deve essere generata durante l'installazione.

Nell'esempio sopra della comunicazione tra moduli, è indesiderabile condividere il segreto al di fuori del deployment. Quindi è molto auspicabile che Helm abbia meccanismi per creare automaticamente il segreto senza doverlo specificare direttamente.

Hook

Gli hook consentono di eseguire codice in determinati punti durante il processo di installazione. Potrebbe esserci un'attività di configurazione da eseguire dopo la prima installazione o forse è necessario eseguire una pulizia prima di qualsiasi aggiornamento.

Per risolvere il nostro problema di aggiunta della chiave, generata durante l'installazione, gli hook di pre-installazione sono perfetti. Ma c'è un problema: non puoi generare automaticamente il segreto una sola volta durante l'aggiornamento. Gli hook funzioneranno ad ogni aggiornamento.

Se hai generato il tuo segreto e la tua prima installazione non è ancora avvenuta, allora interrompi la lettura; l'hook di pre-installazione farà per te.

Ma se il segreto fa parte dell'aggiornamento (forse una nuova funzionalità che non era presente al momento dell'installazione), è frustrante non poter creare un hook di pre-installazione che funzioni solo una volta.

Le funzioni

Le funzionalità di Helm consentono di aggiungere vari elementi di script agli scenari di distribuzione.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Genera un nuovo UUID e citalo

In questo esempio si mostra che il valore del segreto apiKey sarà un nuovo UUID, generato durante l'installazione.

Helm include una vasta libreria di funzioni che sfrutta le sorprendenti funzionalità dei template GO e la libreria di funzioni Sprig per creare distribuzioni personalizzate.

Funzione Lookup

In Helm 3.1 è stata aggiunta la funzione Lookup, che consente di richiedere un deployment esistente e:

  • verificare l'esistenza delle risorse;
  • restituire il valore di una risorsa esistente per un uso successivo.

Utilizzando entrambe queste funzionalità, possiamo creare un segreto dinamicamente generato e usa-e-getta!

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

Ogni volta che un nuovo aggiornamento viene applicato al server, Helm genererà un nuovo valore del segreto (se il segreto non esiste ancora) o riutilizzerà il valore esistente.

Buona fortuna!

Ulteriori letture sull'argomento:

  1. Tre livelli di autoscaling in Kubernetes e come utilizzarli in modo efficace.
  2. Kubernetes nello spirito della pirateria con un modello di implementazione.
  3. Il nostro canale Attorno a Kubernetes su Telegram.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster