Patching a kubernetes object with kubectl patch and a patch file

2 min read | by Jordi Prats

We can use the kubectl patch command with the -p option to update an existing kubernetes object:

$ kubectl patch sc gp2 -p '{"allowVolumeExpansion": true}'
storageclass.storage.k8s.io/gp2 patched

When the patch is small is a very convenient way of patching it but as the patch grows it becomes less convenient

We can use the --patch-file option to specify a file containing what we want to add to the kubernetes object, for example:

metadata:
  labels:
    patch: demo

This is going to add the specified label to the existing ones. For example, the following object has the following labels:

$ kubectl describe pod testvault-vaultcli
Name:             testvault-vaultcli
Namespace:        testvault
Priority:         0
Service Account:  default
Node:             minikube/192.168.49.2
Start Time:       Fri, 16 Sep 2022 21:08:38 +0200
Labels:           app.kubernetes.io/instance=testvault
                  app.kubernetes.io/managed-by=Helm
                  app.kubernetes.io/name=testvault
                  app.kubernetes.io/version=1.16.0
                  component=cli
                  helm.sh/chart=testvault-1.0.0
Annotations:      meta.helm.sh/release-name: testvault
                  meta.helm.sh/release-namespace: testvault
(...)

If we apply the patch file like follows:

$ kubectl patch pod testvault-vaultcli --patch-file patch_demo.yaml
pod/testvault-vaultcli patched

We can see both objects gets merged:

$ kubectl describe pod testvault-vaultcli
Name:             testvault-vaultcli
Namespace:        testvault
Priority:         0
Service Account:  default
Node:             minikube/192.168.49.2
Start Time:       Fri, 16 Sep 2022 21:08:38 +0200
Labels:           app.kubernetes.io/instance=testvault
                  app.kubernetes.io/managed-by=Helm
                  app.kubernetes.io/name=testvault
                  app.kubernetes.io/version=1.16.0
                  component=cli
                  helm.sh/chart=testvault-1.0.0
                  patch=demo
Annotations:      meta.helm.sh/release-name: testvault
                  meta.helm.sh/release-namespace: testvault
Status:           Running
(...)

Posted on 19/09/2022