Automatsko generiranje tajni u Helmu

Automatsko generiranje tajni u Helmu

Momčad Kubernetes aaS s Mail.ru preveo kratku bilješku o tome kako automatski generirati Helm tajne prilikom ažuriranja. Slijedi tekst autora članka - tehničkog direktora Intowarea, tvrtke koja razvija SaaS rješenja.

Kontejneri su cool. U početku sam bio protiv kontejnera (sram me to priznati), ali sada u potpunosti podržavam korištenje ove tehnologije. Ako ovo čitate, nadamo se da ste uspješno plovili morima Dockera, shvatili prednosti Kubernetesa i uvelike si olakšali život uz Helm.

Međutim, neke su stvari očito teže nego što bi trebale biti.

Kako automatski generirati tajne prilikom ažuriranja?

Kubernetes tajna je resurs koji sadrži parove ključ/vrijednost koje želite koristiti u svom kodu. To mogu biti nizovi veze s bazom podataka, lozinke e-pošte i tako dalje. Korištenjem tajni stvarate jasnu razliku između koda i postavki, što vam omogućuje jednostavnu prilagodbu različitih implementacija bez mijenjanja baze koda.

Uobičajena situacija je kada dva modula moraju komunicirati koristeći zajednički ključ. Nitko izvan klastera ne bi trebao znati ovaj ključ, jer je namijenjen za komunikaciju jedan na jedan unutar klastera.

Stvaranje tajni

U pravilu, za stvaranje tajne u Helmu trebate:

  • opišite tajnu u datoteci vrijednosti;
  • redefinirajte ga tijekom postavljanja;
  • odnosi se na to unutar implementacije/poda;
  • ... profit!

Obično izgleda ovako:

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

Jednostavna Kubernetes tajna koja koristi vrijednosti iz values.yml

Ali recimo da ne želite navesti svoju tajnu u datoteci vrijednosti.

Postoji mnogo opcija kada implementacija zahtijeva zajednički ključ, koji se mora generirati tijekom instalacije.

U gornjem primjeru komunikacije modul-modul, nije poželjno dijeliti tajnu izvan implementacije. Stoga je vrlo poželjno da Helm ima mehanizme za automatsko generiranje tajne bez potrebe za njezinim izravnim navođenjem.

Kuke

Kuke vam omogućuju pokretanje koda na određenim mjestima tijekom procesa instalacije. Možda postoji konfiguracijski posao koji treba pokrenuti nakon prve instalacije ili je možda potrebno izvršiti čišćenje prije izvođenja bilo kakvog ažuriranja.

Da bismo riješili naš problem dodavanja ključa generiranog tijekom instalacije, predinstalacijske kuke su idealne. Ali postoji kvaka: ne možete automatski generirati tajnu jednom prilikom ažuriranja. Udice će raditi na svakom ažuriranju.

Ako ste generirali svoju tajnu, a vaša prva instalacija još nije izvršena, tada prestanite čitati, kuka za predinstalaciju će vam dobro poslužiti.

Ali ako je tajna dio ažuriranja (možda nova značajka koja nije bila prisutna tijekom instalacije), onda je šteta što ne možete stvoriti predinstalacijsku kuku koja radi samo jednom.

Funkcije

Funkcije Helma omogućuju vam dodavanje različitih elemenata skriptiranja vašim skriptama za implementaciju.

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

Ovaj primjer pokazuje da će vrijednost apiKey tajne biti novi UUID generiran tijekom instalacije.

Helm uključuje doista opsežnu biblioteku značajki koja iskorištava nevjerojatne značajke GO predloška i Sprigovu biblioteku značajki za stvaranje prilagođenih implementacija.

Funkcija traženja

Dodano u Helm 3.1 Funkcija traženja, koji vam omogućuje da zatražite postojeću implementaciju i:

  • provjeriti postojanje resursa;
  • vratiti vrijednost postojećeg resursa za kasniju upotrebu.

Koristeći obje ove mogućnosti, možemo stvoriti jednokratnu, dinamički generiranu tajnu!

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

Kad god se novo ažuriranje primijeni na poslužitelj, Helm će ili generirati novu tajnu vrijednost (ako tajne još nema) ili ponovno upotrijebiti postojeću vrijednost.

Sretno!

Što još pročitati na temu:

  1. Tri razine automatskog skaliranja u Kubernetesu i kako ih učinkovito koristiti.
  2. Kubernetes u duhu piratstva s predloškom za implementaciju.
  3. Naš kanal Oko Kubernetesa u Telegramu.

Izvor: www.habr.com

Dodajte komentar