Titkok automatikus generálása Helmben

Titkok automatikus generálása Helmben

A parancs Kubernetes aaS a Mail.ru-tól fordítottam egy rövid megjegyzést arról, hogyan generálhatunk automatikusan titkokat a Helm frissítésekor. Ezután következik a cikk szerzőjének, az Intoware SaaS-megoldások fejlesztőcégének műszaki igazgatójának szövege.

A konténerek nagyszerűek. Eleinte ellenálltam a konténereknek (szégyellem bevallani), de most már teljes mértékben támogatom ennek a technológiának a használatát. Ha ezt olvasod, remélem, sikeresen úszkáltál a Docker tengerein, felismerve a Kubernetes előnyeit, és sokkal egyszerűbbé tetted az életed a Helm segítségével.

Mindazonáltal egyes dolgok nyilvánvalóan bonyolultabbak, mint kellene.

Hogyan generálhatunk automatikusan titkokat a frissítések során?

A Kubernetes titok egy olyan erőforrás, amely kulcs/érték párokat tartalmaz, amelyeket a kódodban szeretnél használni. Ezek lehetnek adatbázis-kapcsolati karakterláncok, e-mail jelszók stb. A titkok használatával tiszta elkülönítést hozol létre a kód és a beállítások között, ami lehetővé teszi a különböző telepítések egyszerű beállítását a kód alapjának módosítása nélkül.

Gyakran előforduló helyzet, amikor két modulnak közös kulcs segítségével kell kommunikálnia. Senki sem tudhat erről a kulcsról a klaszter határain kívül, mivel az kivételesen az 'egyikből a másikba' történő kapcsolatra van fenntartva a klaszteren belül.

Titkok létrehozása

Általában a Helmban titok létrehozásához szükséges:

  • a titkot leírni egy értékfájlban;
  • felülbírálni annak értékét a telepítés során;
  • hivatkozni rá a telepítésben/kontextusban;
  • … nyereség!

Ez általában így néz ki:

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

Egyszerű Kubernetes titok, amely a values.yml-ből származó értékeket használ

De mondjuk, nem szeretnéd a titkodat az értékfájlban megadni.

Sok helyzet létezik, amikor a telepítéshez szükséges egy közös kulcs, amelyet a telepítés során kell generálni.

A fenti példában a modulok közötti kapcsolathoz nem szeretnénk megosztani a titkot a telepítés határain kívül. Ezért nagyon kívánatos, hogy a Helm rendelkezzen automatizált titokgeneráló mechanizmusokkal, anélkül, hogy közvetlenül meg kellene adni.

Hookok

A hook allows you to run code at specific points during the installation process. There may be a setup task that needs to be run after the initial installation, or perhaps a cleanup that must be performed before applying any updates.

Pre-installation hooks are perfect for solving our key generation problem upon installation. However, there's a catch: you cannot automatically generate the secret just once during an update. Hooks will work at every update.

If you have generated your secret and your initial installation has not yet occurred, then stop reading; the pre-installation hook is ideal for you.

But if the secret is part of an update (possibly a new feature that was not present during the installation), it is unfortunate that you cannot create a pre-installation hook that would only trigger once.

Funkciók

Helm functions allow you to add various script elements to deployment scripts.

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

In this example, the value of the apiKey secret will be a new UUID, generated during installation.

Helm comes with a really extensive library of functions that utilizes amazing GO template functions and the Sprig function library for creating customized deployments.

Lookup function

In Helm 3.1, the Lookup function, which allows you to query an existing deployment and:

  • check for resource existence;
  • return the value of an existing resource for subsequent use.

By using both of these capabilities, we can create a one-time dynamically generated secret!

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

Whenever a new update is applied to the server, Helm will either generate a new secret value (if the secret does not yet exist) or reuse the existing value.

Sok sikert!

Mit érdemes még olvasni a témában:

  1. Három automatikus skálázási szint a Kubernetesben és hogyan használjuk őket hatékonyan.
  2. Kubernetes kalózstílusban bevezetési sablonnal.
  3. Telegram csatornánk a Kubernetes körül.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster