Using kubectl patch in continuous deployment

2019-10-23
Kubernetes

How to deploy new Docker images to your Kubernetes cluster? Of course, there are many ways and one of the most common ways is to use kubectl set image, for example:

kubectl set image deployment/nginx-deployment nginx=nginx:1.17.5-alpine

However, what happens if you have more containers in your deployment pod spec? And what if you also have initContainers? Fortunately, kubectl patch can help. Let’s assume we have two containers and one init container. Here is the patch file (patch.yaml) we can use:

spec:
  template:
    spec:
      initContainers:
        - name: foo
          image: mycompany/fooimage:1.0.1
      containers:
        - name: bar
          image: mycompany/barimage:8743b520
        - name: baz
          image: mycompany/bazimage:2.15.8

We can simply apply this by the following command:

kubectl patch deployment mydeployment -p "$(cat patch.yaml)"

And voilà, all images in the deployment are updated at once.

Of course, you may ask what happens when image tags are variable? Of course, this information may differ in each deployment. You can use git tags or maybe git hashes for this, but how to pass it to your patch file. We can simply replace tags with variables and then use sed to replace these dummy values with the real ones. Let’s consider this template:

spec:
  template:
    spec:
      initContainers:
        - name: foo
          image: mycompany/fooimage:FOOVER
      containers:
        - name: bar
          image: mycompany/barimage:BARVER
        - name: baz
          image: mycompany/bazimage:BAZVER

Now let’s use sed to replace these variables with the real values:

sed -i -e "s,FOOVER,1.0.1,g" patch.yaml
sed -i -e "s,BARVER,8743b520,g" patch.yaml
sed -i -e "s,BAZVER,2.15.8,g" patch.yaml

And we are done, now just apply kubectl patch the same way as above.

Automated MySQL MariaDB tables optimization in Kubernetes

Cronjob based automated optimization of MariaDB or MySQL tables on Kubernetes
Kubernetes MariaDB MySQL optimization schedule

A first impression of Rust from the perspective of a Go developer

Rust is very powerful, but let's see how it compares to Go
Go Rust Kubernetes controller secret replicator

Develop Kubernetes native applications in Golang with auto-recompile and auto-restart

Learn how to have automatic recompile and restart of your Go project running on Kubernetes
Kubernetes Go Golang development controller operator native application autorecompile autorestart