web-dev-qa-db-fra.com

Utilisation de variables d'environnement dans les spécifications de déploiement de Kubernetes

J'utilise actuellement une spécification Kubernetes Deployment.yaml pour déployer un service. La spécification comprend une référence textuelle à une adresse IP spécifique (marquée comme <static-ip-address> au dessous de):

spec:
  type: LoadBalancer
  loadBalancerIP: <static-ip-address>

Je souhaite transférer des informations telles que des mots de passe ou des adresses IP dans des référentiels Git distants. Puis-je éviter cela, par exemple en utilisant des variables d'environnement, par ex. avec une spécification de déploiement et un déploiement réel à peu près comme suit:

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

et

export SERVICE_ADDRESS=<static-ip-address>
kubectl create -f Deployment.yaml

Évidemment, cette syntaxe spécifique ne fonctionne pas encore. Mais quelque chose comme cela est-il possible et si oui, comment?

Je préfère ne pas compter sur un outil de provisioning distinct . Les secrets et ConfigMap s semblent prometteurs, mais apparemment, ils ne peuvent pas être consommés d'une manière qui convient à cet effet. Si je pouvais référencer directement une adresse IP statique définie avec gcloud compute addresses create service-address ce serait mieux.

18
Drux

Il y avait une autre solution agréablement simple: j'ai une adresse Google Compute my-address défini, et je peux apparemment l'utiliser dans la spécification de service comme ceci: loadBalancerIP: my-address.

Avec ceci comme source "externe" pour les adresses IP et secrets pour les mots de passe, il n'y a plus besoin d'un outil de provisioning (ou de modèles) pour mon cas d'utilisation simple (dans un environnement GKE).

OBSOLETE NOW: J'ai décidé d'utiliser un outil de provisioning en quelque sorte, à savoir "intégré" sed, après tout.

Ma Deployment.yaml contient désormais une "variable de modèle", par exemple dans

loadBalancerIP: $$EXTERNAL_IP

et je déploie le service avec, par exemple, 1.2.3.4 comme adresse IP externe avec

cat Deployment.yaml | sed s/\$\$EXTERNAL_IP/1.2.3.4/ | kubectl create -f -
2
Drux

Une solution beaucoup plus simple/plus propre: envsubst

Dans deploy.yml:

LoadbalancerIP: $LBIP

Ensuite, créez simplement votre var env et exécutez kubectl comme ceci:

export LBIP="1.2.3.4"
envsubst < deploy.yml | kubectl apply -f -

Vous venez de mettre des variables Bash régulières dans le fichier que vous souhaitez utiliser, dans ce cas le manifeste YAML, et vous avez lu ce fichier. Il affichera le fichier avec les vars env remplacés par leurs valeurs. Vous pouvez également l'utiliser pour créer de nouveaux fichiers comme celui-ci:

envsubst < input.yml > output.yml

envsubst est disponible dans par exemple Paquet Ubuntu/Debian gettext.

29
Jan Grewe

Jusqu'à ce que modèles soient disponibles, la façon la plus simple de le faire est d'exécuter un travail qui tilise l'API Kubernetes pour mettre à jour le service. Un court script Shell dans une image alpine, couplé à un secret (contenant l'adresse IP) et une configmap (contenant le modèle), devrait être assez simple. Le bit difficile utilise correctement les fonctionnalités d'authentification et d'autorisation de l'apiserver.

https://stackoverflow.com/questions/30690186/how-do-i-access-the-kubernetes-api-from-within-a-pod-container donne un exemple d'accès à l'API. Évidemment, vous voudrez POST to / api/v1/namespaces/default/services au lieu de GET dans cet exemple.

0
aecolley

Vous pouvez écrire un simple pré-processeur pour effectuer une substitution de variable sur vos fichiers yaml (ou vous pouvez utiliser jsonnet pour accomplir la même chose sur les fichiers de configuration json).

Il y a une discussion autour de ajout de modèles directement dans la configuration de Kubernetes mais il n'est pas encore implémenté ou disponible.

0
Robert Bailey