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 existe une fonctionnalité ConfigMap
avec Kubernetes, mais cela permet également d'écrire la clé/valeur dans le fichier yaml. Est-il possible de définir la clé pour les variables d'environnement?
Je ne pense pas qu'il soit possible de définir une image via variable ou Config Map dans Kubernetes. Mais vous pouvez par exemple utiliser Helm pour rendre vos déploiements beaucoup plus flexibles et configurables.
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é, éventuellement intégré à votre pipeline CI.
Avec un fichier modèle yml 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 -
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}}
...
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")
Faites la règle:
_GENFILES = $(basename $(TEMPLATES))
GENFILES = $(_GENFILES:templates/%=%)
$(GENFILES): %: templates/%.in $(MKFILES) tools/jinja2-cli.py .env
env $$(cat .env | xargs) tools/jinja2-cli.py < $< > $@ || (rm -f $@; false)
Dans le fichier, vous pouvez utiliser n’importe quelle construction de syntaxe jinja, par exemple. {{env.IMAGE}}
sera remplacé par la valeur de IMAGE
définie dans .env
Une autre approche 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: ${IMAGE}
EOF