Autogenerazione di segreti in Helm

Autogenerazione di segreti in Helm

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

I contenitori sono fantastici. Inizialmente ero un oppositore dei contenitori (mi vergogno a dirlo), ma ora supporto completamente l'uso di questa tecnologia. Se stai leggendo questo, spero tu abbia navigato con successo nei mari di Docker, riconosciuto i vantaggi di Kubernetes e semplificato notevolmente la tua vita con Helm.

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

Come generare automaticamente segreti durante l'aggiornamento?

Un segreto di Kubernetes è una risorsa che contiene coppie chiave/valore che desideri utilizzare nel tuo codice. Queste possono essere stringhe di connessione al database, password email e così via. Utilizzando i segreti, crei una netta divisione tra codice e impostazioni, il che consente di configurare facilmente diverse distribuzioni senza modificare la base di codice.

È una situazione comune quella in cui due moduli devono interagire tramite una chiave comune. Nessuno al di fuori del cluster dovrebbe conoscere questa chiave, poiché è destinata alla comunicazione 'da uno all'altro' all'interno del cluster.

Creazione di segreti

Di solito, per creare un segreto in Helm, bisogna:

  • descrivere il segreto nel file valori;
  • ridefinirlo durante il processo di deploy;
  • fare riferimento ad esso all'interno del deploy/pod;
  • … guadagno!

Di solito appare più o meno così:

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

Un semplice segreto di Kubernetes, che utilizza valori da values.yml

Ma, supponiamo che tu non voglia specificare il tuo segreto nel file valori.

Ci sono molte situazioni in cui è necessaria una chiave condivisa, che deve essere generata durante l'installazione.

Nell'esempio sopra, con la connessione tra i moduli, è indesiderabile condividere il segreto al di fuori del dispiegamento. Pertanto, è molto auspicabile che Helm abbia meccanismi per creare automaticamente il segreto senza la necessità di specificarlo direttamente.

Hook

Gli hook consentono di eseguire codice in determinati punti nel processo di installazione. Potrebbe esserci un'attività di configurazione da eseguire dopo la prima installazione, oppure potrebbe essere necessario eseguire una pulizia prima di qualsiasi aggiornamento.

Per risolvere il nostro problema di aggiungere una chiave generata durante l'installazione, gli hook pre-installazione sono la soluzione ideale. Ma c'è un problema: non puoi generare automaticamente un segreto una sola volta durante un aggiornamento. Gli hook verranno eseguiti ad ogni aggiornamento.

Se hai generato il tuo segreto e la tua prima installazione non è ancora avvenuta, allora smetti di leggere, l'hook pre-installazione è perfetto per te.

Ma se il segreto fa parte di un aggiornamento (forse una nuova funzionalità che non era presente durante l'installazione), è sfortunato che non sia possibile creare un hook pre-installazione che venga eseguito soltanto una volta.

Funzioni

Le funzioni di Helm consentono di aggiungere vari elementi di script agli script di dispiegamento.

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

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

Helm include una libreria di funzioni davvero ampia, che sfrutta fantastiche funzionalità dei template GO e la libreria di funzioni Sprig per creare dispiegamenti personalizzati.

Funzione Lookup

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

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

Utilizzando entrambe queste funzionalità, possiamo creare un segreto dinamicamente generato una tantum!

# 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 segreto (se non esiste ancora) o riutilizzerà il valore esistente.

Buona fortuna!

Cosa leggere ancora sull'argomento:

  1. Tre livelli di autoscaling in Kubernetes e come utilizzarli efficacemente.
  2. Kubernetes nello spirito della pirateria con un modello di implementazione.
  3. Il nostro canale Intorno 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