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

18

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

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 exemple 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érerais ne pas compter sur un outil de provisioning distinct . Les secrets et les secretsConfigMap 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-addressce serait le mieux.

Drux
la source

Réponses:

27

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

envsubstest disponible par exemple dans le gettextpaquet Ubuntu / Debian .

Jan Grewe
la source
2
+1 pour envsubst. ne le savait pas jusqu'à présent
user1129682
1
Ce n'est pas plus facile / plus 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)
Ivan
@Ivan Sa question était "Mais est-ce que quelque chose comme ça est possible et si oui comment?", Et c'est la réponse à sa question. La question n'était pas "Comment puis-je faire cela avec les outils disponibles sur chaque OS par défaut?". Et oui, c'est 1) plus facile ET 2) plus propre que l'utilisation sed. Selon votre définition, la solution proposée avec sedne serait pas plus facile / plus propre, car il n'y a pas d' sedinstallation sur les machines Windows par défaut.
Jan Grewe
Il n'est pas du tout clair que vous compariez à l'option "sed".
Ivan
2

Il y avait une autre solution agréablement simple: j'ai une adresse Google Compute my-addressdé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 les 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).

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

Mon Deployment.yamlcontient maintenant 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 -
Drux
la source
1
L'approche de Jan Grewe est plus générique et peut être appliquée à n'importe quel nombre de variables. Je suggère d'accepter sa réponse au lieu d'accepter la vôtre qui est moins générique et doit être ajustée pour chaque variable supplémentaire.
TekTimmy
0

Vous pouvez écrire un simple pré-processeur pour effectuer la substitution de variables 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 sur l' ajout de modèles directement dans la configuration de Kubernetes mais il n'est pas encore implémenté ou disponible.

Robert Bailey
la source
Oui, mais jsonnet est un outil de mise à disposition comme mentionné dans la question.
Drux
1
Si vous recherchez quelque chose d'intégré, suivre le problème auquel je suis lié est votre meilleur pari à ce stade.
Robert Bailey
0

Jusqu'à ce que des modèles soient disponibles, la façon 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 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.

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

aecolley
la source
Cela semble intéressant, mais pouvez-vous nous en dire un peu plus. Pourriez-vous donner ou pointer vers un exemple de script shell approprié.
Drux