23 votes

En utilisant des variables d'environnement dans la spécification de déploiement de Kubernetes

Je utilise actuellement une spécification Kubernetes Deployment.yaml pour déployer un service. La spécification inclut une référence textuelle à une adresse IP spécifique (marquée comme ci-dessous) :

spec:
  type: LoadBalancer
  loadBalancerIP: 

Je suis préoccupé par le fait de pousser des informations telles que des mots de passe ou des adresses IP dans des dépôts Git distants. Puis-je éviter cela en utilisant par exemple des variables d'environnement, par exemple avec une spécification de déploiement et un déploiement réel approximativement comme suit :

spec:
   type: LoadBalancer
   loadBalancerIP: ${SERVICE_ADDRESS}

et

export SERVICE_ADDRESS=
kubectl create -f Deployment.yaml

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

Je préférerais ne pas dépendre d'un outil de provisioning séparé. Les Secrets et les ConfigMaps semblent prometteurs, mais apparemment ils ne peuvent pas être consommés de manière adaptée à cette fin. Si je pouvais référencer directement une adresse IP statique qui a été définie avec gcloud compute addresses create service-address, ce serait idéal.

34voto

Jan Grewe Points 457

Une solution beaucoup plus simple / plus propre: envsubst

Dans deploy.yml:

LoadbalancerIP: $LBIP

Ensuite, créez simplement votre variable d'environnement et exécutez kubectl de cette manière:

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

Il suffit d'insérer des variables Bash normales dans le fichier que vous souhaitez utiliser, dans ce cas le manifeste YAML, et de faire en sorte que envsubst lise ce fichier. Il produira en sortie le fichier avec les variables d'environnement remplacées par leurs valeurs. Vous pouvez également l'utiliser pour créer de nouveaux fichiers de cette manière:

envsubst < input.yml > output.yml

envsubst est disponible dans, par exemple, le paquet gettext d'Ubuntu / Debian.

3 votes

+1 pour envsubst. Je ne connaissais pas cela jusqu'à présent

1 votes

Ce n'est pas plus facile/propre, car cela nécessite un outil séparé, qui n'est pas installé par défaut sur tous les systèmes (par exemple, Mac)

1 votes

@Ivan Sa question était "Mais est-ce quelque chose de possible et si oui, comment ?", et c'est la réponse à sa question. La question n'était pas "Comment puis-je faire cela avec des outils disponibles sur chaque système d'exploitation par défaut ?". Et oui, c'est 1) plus facile ET 2) plus propre que d'utiliser sed. Selon votre définition, la solution proposée avec sed ne serait pas non plus plus facile/propre, car il n'y a pas sed installé par défaut sur les machines Windows.

2voto

Drux Points 626

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

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

OBSOLÈTE MAINTENANT : J'ai décidé d'utiliser un outil de provisionnement de types, à savoir le "builtin" sed, après tout.

Mon Deployment.yaml contient maintenant une "variable de modèle" par exemple dans

loadBalancerIP: $$EXTERNAL_IP

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

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

1 votes

L'approche de Jan Grewe est plus générique et peut être appliquée à un nombre quelconque de variables. Je vous suggérerais d'accepter sa réponse plutôt que d'accepter la vôtre qui est moins générique et doit être ajustée pour chaque variable supplémentaire.

1voto

Robert Bailey Points 589

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

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

0 votes

Oui, mais jsonnet est un outil de provisionnement comme indiqué dans la question.

1 votes

Si vous cherchez quelque chose d'intégré, alors suivre le problème que j'ai lié est votre meilleur choix pour l'instant.

0voto

aecolley Points 933

Jusqu'à ce que les modèles soient disponibles, la manière la plus simple de le faire est d'exécuter un travail qui utilise l'API Kubernetes pour mettre à jour le service. Un court script shell dans une image basée sur Alpine, couplé à un secret (contenant l'adresse IP) et un configmap (contenant le modèle), devrait être assez simple. La partie difficile consiste à utiliser 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. De toute évidence, vous voudrez faire un POST à /api/v1/namespaces/default/services au lieu du GET dans cet exemple.

0 votes

Ça semble intéressant, mais pourriez-vous élaborer un peu plus, s'il vous plaît ? Pourriez-vous donner ou pointer vers un exemple de script shell approprié ?

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X