128 votes

Comment définir des valeurs dynamiques avec le fichier Kubernetes yaml?

Par exemple, un fichier yaml de déploiement:

 apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: guestbook
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: guestbook
      spec:
        container:
          - name: guestbook
            image: {{Here want to read value from config file outside}}
 

Il y a une fonctionnalité ConfigMap avec Kubernetes, mais c'est aussi écrire la clé / valeur dans le fichier yaml. Existe-t-il un moyen de définir la clé des variables d'environnement?

113voto

M U Points 3634

Vous pouvez également utiliser envsubst lors du déploiement.

par exemple

 cat $app/deployment.yaml | envsubst | kubectl apply ...
 

Il remplacera toutes les variables du fichier par leurs valeurs. Nous utilisons avec succès cette approche sur notre CI lors du déploiement dans plusieurs environnements, également pour injecter le CI_TAG, etc. dans les déploiements.

78voto

whites11 Points 4901

Vous ne pouvez pas le faire automatiquement, vous devez utiliser un script externe pour "compiler" votre modèle, ou utiliser helm comme suggéré par @Jakub.

Vous voudrez peut-être utiliser un script bash personnalisé, peut-être intégré à votre pipeline CI.

Étant donné un fichier yml de modèle appelé deploy.yml.template très similaire à celui que vous avez fourni, vous pouvez utiliser quelque chose comme ceci:

 #!/bin/bash

# sample value for your variables
MYVARVALUE="nginx:latest"

# read the yml template from a file and substitute the string 
# {{MYVARNAME}} with the value of the MYVARVALUE variable
template=`cat "deploy.yml.template" | sed "s/{{MYVARNAME}}/$MYVARVALUE/g"`

# apply the yml with the substituted value
echo "$template" | kubectl apply -f -
 

40voto

Jakub Points 1172

Je ne pense pas qu'il soit possible de définir l'image via une variable ou une carte de configuration dans Kubernetes. Mais vous pouvez utiliser par exemple Helm pour rendre vos déploiements beaucoup plus flexibles et configurables.

36voto

CelinHC Points 517

Une ligne:

 cat app-deployment.yaml | sed "s/{{BITBUCKET_COMMIT}}/$BITBUCKET_COMMIT/g" | kubectl apply -f -
 

En yaml:

   ...
  containers:
  - name: ulisses
    image: niceuser/niceimage:{{BITBUCKET_COMMIT}}
  ...
 

3voto

nyet Points 103

Mon approche:

tools/jinja2-cli.py:

#!/usr/bin/env python3
import os
import sys
from jinja2 import Environment, FileSystemLoader

sys.stdout.write(Environment(loader=FileSystemLoader('templates/')).from_string(sys.stdin.read()).render(env=os.environ) + "\n")

Faire de la règle:

_GENFILES = $(basename $(TEMPLATES))
GENFILES = $(_GENFILES:templates/%=%)

$(GENFILES): %: templates/%.j2 $(MKFILES) tools/jinja2-cli.py .env
        env $$(cat .env | xargs) tools/jinja2-cli.py < $< > $@ || (rm -f $@; false)

À l'intérieur de l' .j2 fichier de modèle vous pouvez utiliser n'importe quel jinja syntaxe de construire, par exemple, {{env.GUEST}} sera remplacé par la valeur de GUEST définie en .env

Si votre templates/deploy.yaml.j2 ressemblerait à:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: guestbook
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: guestbook
      spec:
        container:
          - name: guestbook
            image: {{env.GUEST}}

Une autre approche (en utilisant seulement bash objets internes et xargs) pourrait être

env $(cat .env | xargs) cat <<EOF | kubectl create -f -
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: guestbook
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: guestbook
      spec:
        container:
          - name: guestbook
            image: ${GUEST}
EOF

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X