
Team 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 , 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:
- .
- .
- .
Fonte: habr.com
