Versionsbefreite Kubernetes Deploymentfiles

Wer des Öfteren mit Kubernetes arbeitet, kennt sehr wahrscheinlich das folgende Problem:

Man hat initial an einer bestimmten Stelle, z.B. in einem Git-Repository Kubernetes Deploymentfiles in folgender Form erstellt:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80

Im Laufe des Lebenszyklus eines Deployments ändert sich aber immer mal wieder die Version des Docker-Images. Diese wird dann z.B. folgendermaßen gesetzt:

kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.91 --record=true

Danach wird dann von Hand im besten Fall das Deploymentfile angepasst. Das Problem hierbei ist, wird vergessen das Deploymentfile anzupassen und ein Kollege (oder man selbst) verlässt sich darauf, das die Deploymentfiles immer aktuell sind, führt ein naives kubectl apply -f in machen Fällen dazu, dass eine unerwünschte Version deployed wird. Um dies zu verhindern habe ich folgenden BASH-Alias eingerichtet:

alias kubectla='f() { [ $# -eq 2 ] && for i in $(find ${2}); do sed s/=VERSION=/$1/g $i | kubectl apply -f -; done || echo -e "Wrong argument count!\ndo: kubectla  "; unset -f f; }; f'

Hinter dem Alias steckt eine Funktion, welche den Platzhalter =VERSION= in einer Datei ersetzt, bevor sie mit kubectl apply -f deployed wird. Die Deploymentfiles enthalten also in Zukunft keine explizite Version mehr, sondern lediglich unseren Platzhalter:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:=VERSION=
        ports:
        - containerPort: 80

Deployed wird dann mittels des Aliases kubectla

kubectla 1.91 nginx.yaml

Schon wird die entsprechende Version deployed und wir müssen uns in Zukunft keine Sorgen mehr machen, ob alle Versionen in unseren Deploymentfiles aktuell sind.

Schreibe eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Bitte akzeptieren sie die Datenschutzbestimmungen.