Csapat Kubernetes aaS a Mail.ru webhelyrőllefordított egy rövid jegyzetet arról, hogyan lehet automatikusan létrehozni Helm-titkokat frissítéskor. Az alábbi szöveg a cikk szerzőjétől - az Intoware, egy SaaS megoldásokat fejlesztő cég műszaki igazgatójától származik.
A konténerek menők. Eleinte konténerellenes voltam (szégyellem bevallani), de most már teljes mértékben támogatom ennek a technológiának a használatát. Ha ezt olvassa, remélhetőleg sikeresen navigált a Docker tengerein, felismerte a Kubernetes előnyeit, és sokkal könnyebbé tette az életét a Helmmel.
Néhány dolog azonban egyértelműen nehezebb a kelleténél.
Hogyan lehet automatikusan titkokat generálni frissítéskor?
A Kubernetes-titok egy olyan erőforrás, amely a kódjában használni kívánt kulcs/érték párokat tartalmaz. Ezek lehetnek adatbázis-kapcsolati karakterláncok, e-mail jelszavak és így tovább. A titkok használatával világosan elválasztja egymástól a kódot és a beállításokat, így könnyen testreszabhatja a különböző telepítéseket a kódbázis megváltoztatása nélkül.
Gyakori helyzet az, amikor két modulnak közös kulccsal kell kommunikálnia. A fürtön kívül senki sem ismerheti ezt a kulcsot, mivel a fürtön belüli egy-egy kommunikációra szolgál.
Titkok készítése
Általában egy titok létrehozásához a Helmben a következőkre van szüksége:
Egy egyszerű Kubernetes-titok a Values.yml-ből származó értékek használatával
De tegyük fel, hogy nem szeretné megadni a titkát az értékek fájlban.
Számos lehetőség kínálkozik arra az esetre, ha a központi telepítés megosztott kulcsot igényel, amelyet a telepítés során kell előállítani.
A fenti, modulok közötti kommunikációs példában nem kívánatos a titok megosztása a telepítésen kívül. Ezért nagyon kívánatos, hogy a Helm rendelkezzen olyan mechanizmusokkal, amelyek automatikusan generálnak egy titkot anélkül, hogy azt közvetlenül meg kellene adni.
Horgok
A horgok lehetővé teszik a kód futtatását meghatározott helyeken a telepítési folyamat során. Előfordulhat, hogy egy konfigurációs feladatot le kell futtatni az első telepítés után, vagy esetleg egy tisztítást kell végezni a frissítés végrehajtása előtt.
A telepítés során generált kulcs hozzáadásával kapcsolatos problémánk megoldására a telepítés előtti horgok ideálisak. De van egy bökkenő: nem tudod automatikusan generálni a titkot egy frissítéskor. A horgok minden frissítésnél működni fognak.
Ha létrehozta a titkát, és az első telepítés még nem történt meg, akkor hagyja abba az olvasást, az előtelepítési horog nagyszerűen fog működni.
De ha a titok egy frissítés része (esetleg egy új funkció, ami nem volt ott a telepítés során), akkor kár, hogy nem lehet olyan előtelepítési horgot létrehozni, ami csak egyszer működik.
függvények
A Helm funkciók lehetővé teszik, hogy különféle szkriptelemeket adjon hozzá a telepítési szkriptekhez.
apiVersion: v1
kind: Secret
metadata:
name: my-super-awesome-api-key
type: Opaque
stringData:
apiKey: {{ uuidv4 | quote }} #Generate a new UUID and quote it
Ez a példa azt mutatja, hogy az apiKey titkos értéke a telepítés során generált új UUID lesz.
A Helm egy igazán kiterjedt szolgáltatáskönyvtárat tartalmaz, amely a lenyűgöző GO-sablon-funkciókat és a Sprig szolgáltatáskönyvtárát használja az egyéni telepítések létrehozásához.
Keresés funkció
Hozzáadva a Helm 3.1-hez Keresés funkció, amely lehetővé teszi, hogy kérjen egy meglévő telepítést, és:
ellenőrizze a források meglétét;
visszaadja egy meglévő erőforrás értékét későbbi felhasználásra.
Mindkét képességet kihasználva létrehozhatunk egy egyszeri, dinamikusan generált titkot!
# 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 }}
Amikor új frissítés kerül alkalmazásra a kiszolgálón, a Helm vagy létrehoz egy új titkos értéket (ha még nincs titok), vagy újra felhasználja a meglévő értéket.