Generazione automatica di segreti in Helm

Generazione automatica di segreti in Helm

Squadra Kubernetes aaS da Mail.ru tradotto una breve nota su come generare automaticamente i segreti Helm durante l'aggiornamento. Quello che segue è un testo dell'autore dell'articolo - direttore tecnico di Intoware, azienda che sviluppa soluzioni SaaS.

I contenitori sono fantastici. All'inizio ero anti-container (mi vergogno ad ammetterlo), ma ora sostengo pienamente l'utilizzo di questa tecnologia. Se stai leggendo questo articolo, si spera che tu abbia navigato con successo nei mari di Docker, realizzato i vantaggi di Kubernetes e reso la tua vita molto più semplice con Helm.

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

Come generare automaticamente i segreti durante l'aggiornamento?

Un segreto Kubernetes è una risorsa che contiene coppie chiave/valore che desideri utilizzare nel tuo codice. Potrebbero essere stringhe di connessione al database, password di posta elettronica e così via. Utilizzando i segreti, crei una chiara separazione tra codice e impostazioni, consentendoti di personalizzare facilmente diverse distribuzioni senza modificare la base di codice.

Una situazione comune è quando due moduli devono comunicare utilizzando una chiave comune. Nessuno al di fuori del cluster dovrebbe conoscere questa chiave, poiché è destinata alla comunicazione uno a uno all'interno del cluster.

Fare segreti

In genere, per creare un segreto in Helm, devi:

  • descrivere il segreto nel file dei valori;
  • ridefinirlo durante la distribuzione;
  • fare riferimento ad esso all'interno del deploy/pod;
  • ... profitto!

Di solito assomiglia a questo:

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

Un semplice segreto Kubernetes che utilizza i valori di value.yml

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

Sono disponibili molte opzioni quando la distribuzione richiede una chiave condivisa, che deve essere generata durante l'installazione.

Nell'esempio di comunicazione da modulo a modulo riportato sopra, non è consigliabile condividere il segreto all'esterno della distribuzione. Pertanto, è altamente auspicabile che Helm disponga di meccanismi per generare automaticamente un segreto senza doverlo specificare direttamente.

Ganci

Gli hook consentono di eseguire codice in posizioni specifiche durante il processo di installazione. Potrebbe essere necessario eseguire un lavoro di configurazione dopo la prima installazione o forse è necessario eseguire una pulizia prima di eseguire qualsiasi aggiornamento.

Per risolvere il nostro problema di aggiungere una chiave generata durante l'installazione, gli hook di preinstallazione sono l'ideale. Ma c'è un problema: non puoi generare automaticamente il segreto una volta durante un aggiornamento. Gli hook funzioneranno ad ogni aggiornamento.

Se hai generato il tuo segreto e la tua prima installazione non è ancora avvenuta, smetti di leggere, il gancio di preinstallazione funzionerà benissimo per te.

Ma se il segreto fa parte di un aggiornamento (magari una nuova funzionalità che non era presente durante l'installazione), allora è un peccato che non sia possibile creare un hook di preinstallazione che funzioni solo una volta.

funzioni

Le funzioni del timone ti consentono di aggiungere vari elementi di scripting agli script di distribuzione.

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

Questo esempio mostra che il valore del segreto apiKey sarà il nuovo UUID generato durante l'installazione.

Helm include una libreria di funzionalità davvero estesa che sfrutta le straordinarie funzionalità del modello GO e la libreria di funzionalità di Sprig per creare distribuzioni personalizzate.

Funzione di ricerca

Aggiunto in Helm 3.1 Funzione di ricerca, che consente di richiedere una distribuzione 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 una tantum generato dinamicamente!

# 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 viene applicato un nuovo aggiornamento al server, Helm genererà un nuovo valore segreto (se non è ancora presente alcun segreto) o riutilizzerà il valore esistente.

Buona fortuna!

Cos'altro leggere sull'argomento:

  1. Tre livelli di scalabilità automatica in Kubernetes e come utilizzarli in modo efficace.
  2. Kubernetes nello spirito della pirateria con un modello per l'implementazione.
  3. Il nostro canale Around Kubernetes in Telegram.

Fonte: habr.com

Aggiungi un commento