2 min read | by Jordi Prats
To be able to modify a Kubernetes object we can use kubectl edit to do it interactively. It can come handy if we need to test values but it makes it harder to automate it. If we need a way to change a Kubernetes object using a non-interactive command, kubectl patch is the best option for us.
To be able to modify a Kubernetes object in batch mode we need to tell kubectl which fields we want to set. For example, if we want to add a top-level entry such as allowVolumeExpansion to be able to resize EBS-backed PVCs:
$ kubectl get sc gp2 -o yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
(...)
name: gp2
parameters:
fsType: ext4
type: gp2
provisioner: kubernetes.io/aws-ebs
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
It's the most trivial case, we just need to define the object that will be merged into the existing one using the -p option:
$ kubectl patch sc gp2 -p '{"allowVolumeExpansion": true}'
storageclass.storage.k8s.io/gp2 patched
If we need to modify a value that has more levels, we will have to include all of them to the patch. For example, for the following definition to se a different spec.resources.requests.storage value:
$ kubectl get pvc demopvc -o yaml
(...)
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
(...)
We will have to define the entire path to reach the value we want to change:
$ kubectl patch pvc demopvc -p '{"spec": {"resources": {"requests": {"storage": "20Gi"}}}}'
persistentvolumeclaim/demopvc patched
Checking again the object with kubectl get pvc we will be able to see how it has been successfully patched:
$ kubectl get pvc demopvc -o yaml
(...)
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
(...)
Posted on 18/08/2021