web-dev-qa-db-fra.com

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 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?

8
online

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.

3
Jakub

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 -
11
whites11

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}}
  ...
3
CelinHC

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
0
nyet