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.