Génération automatique de secrets dans Helm

Génération automatique de secrets dans Helm

Commande Kubernetes aaS de Mail.ru j'ai traduit une brève note sur la façon de générer automatiquement des secrets Helm lors de la mise à jour. Voici un texte de l'auteur de l'article - le directeur technique d'Intoware, une société spécialisée dans le développement de solutions SaaS.

Les conteneurs, c'est génial. Au début, j'étais un adversaire des conteneurs (je dois l'avouer), mais maintenant, je soutiens pleinement l'utilisation de cette technologie. Si vous lisez cela, j'espère que vous avez déjà navigué avec succès sur les mers de Docker, que vous avez compris les avantages de Kubernetes et que vous avez simplifié votre vie grâce à Helm.

Cependant, certaines choses sont clairement plus complexes qu'elles ne devraient l'être.

Comment générer automatiquement des secrets lors d'une mise à jour ?

Un secret Kubernetes est une ressource qui contient des paires clé/valeur que vous souhaitez utiliser dans votre code. Il peut s'agir de chaînes de connexion à une base de données, de mots de passe d'e-mails, etc. En utilisant des secrets, vous créez une séparation claire entre le code et les configurations, ce qui facilite l'ajustement de différents déploiements sans modifier la base de code.

Il est fréquent que deux modules doivent interagir à l'aide d'une clé commune. Personne en dehors du cluster ne doit connaître cette clé, car elle est destinée à communiquer "d'un à l'autre" à l'intérieur du cluster.

Création de secrets

En général, pour créer un secret dans Helm, vous devez :

  • décrire le secret dans le fichier de valeurs;
  • le redéfinir lors du déploiement;
  • y faire référence dans le déploiement/pod;
  • … bénéfice !

En général, cela ressemble à ceci :

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

Un simple secret Kubernetes utilisant des valeurs de values.yml

Mais supposons que vous ne souhaitiez pas spécifier votre secret dans le fichier de valeurs.

Il existe de nombreuses situations où un clé commune est nécessaire pour le déploiement, et elle devrait être générée au moment de l'installation.

Dans l'exemple précédent avec l'interaction entre les modules, il est indésirable de partager le secret en dehors du déploiement. Il est donc fortement souhaitable que Helm dispose de mécanismes pour créer automatiquement le secret sans avoir besoin de le spécifier directement.

Hooks

Les hooks permettent d'exécuter du code à des endroits précis du processus d'installation. Il peut y avoir une tâche de configuration à exécuter après la première installation, ou il peut être nécessaire de réaliser un nettoyage avant d'appliquer toute mise à jour.

Pour résoudre notre problème d'ajout de clé, générée lors de l'installation, les hooks pré-installation sont idéaux. Mais il y a un hic : vous ne pouvez pas générer automatiquement un secret une seule fois lors d'une mise à jour. Les hooks fonctionneront à chaque mise à jour.

Si vous avez généré votre secret et que votre première installation n'a pas encore eu lieu, alors cessez de lire, le hook pré-installation est parfaitement adapté pour vous.

Mais si le secret fait partie de la mise à jour (peut-être une nouvelle fonctionnalité qui n'était pas présente lors de l'installation), il est frustrant qu'il soit impossible de créer un hook pré-installation qui fonctionne une seule fois.

Fonctions

Les fonctions Helm permettent d'ajouter divers éléments de script dans les scripts de déploiement.

apiVersion: v1
kind: Secret
metadata:
  name: my-super-awesome-api-key
type: Opaque
stringData:
  apiKey: {{ uuidv4 | quote }} #Générer un nouvel UUID et le mettre entre guillemets

Cet exemple montre que la valeur du secret apiKey sera un nouvel UUID, généré lors de l'installation.

Helm comprend une bibliothèque de fonctions vraiment vaste, qui utilise des fonctionnalités impressionnantes de modèles GO et la bibliothèque de fonctions Sprig pour créer des déploiements personnalisés.

Fonction Lookup

Dans Helm 3.1 a été ajoutée la fonction Lookup, qui permet de requêter un déploiement existant et :

  • vérifier l'existence des ressources ;
  • retourner la valeur d'une ressource existante pour une utilisation ultérieure.

En utilisant ces deux capacités, nous pouvons créer un secret dynamique et généré une seule fois !

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

Chaque fois qu'une nouvelle mise à jour est appliquée au serveur, Helm générera soit une nouvelle valeur de secret (si le secret n'existe pas encore), soit réutilisera la valeur existante.

Bonne chance !

Suggestions de lecture supplémentaires:

  1. Trois niveaux d'auto-scaling dans Kubernetes et comment les utiliser efficacement.
  2. Kubernetes à la manière des pirates avec un modèle de mise en œuvre.
  3. Notre chaîne Autour de Kubernetes sur Telegram.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster