Update multiple lines in a YAML file with kubectl

Vidyasagar Machupalli
vmacwrites
Published in
2 min readMar 2, 2021

Whenever I need to update a YAML file, the first thing that comes to mind is to either use sed or awk or perl etc., But there's an in-house Kubectl patchoption that simplifies the experience.

For example, let’s update the number of replicas in the spec below and also the Nginx container image version. Remember, it's multiline and using any other option can be bit clumsy.

Source: https://kubernetes.io/docs/tasks/run-application/run-stateless-application-deployment/

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

Let’s apply the file

kubectl apply -f https://k8s.io/examples/application/deployment.yaml

Locally, let’s create a file called patch.yaml with the below content

spec:
selector:
matchLabels:
app: nginx
replicas: 3 # Update the number replicas from 2 to 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.16.1 # Update the version of nginx from 1.14.2 to 1.16.1
ports:
- containerPort: 80

and then patch the deployment with the below command

kubectl patch deployment/nginx-deployment --patch "$(cat patch.yaml)"

Once you see this message deployment.apps/nginx-deployment patched. Run the below commands

Kubectl get deployments 
# NAME READY UP-TO-DATE AVAILABLE AGE
#nginx-deployment 3/3 3 3 3h
kubectl get deployment nginx-deployment -o yaml

and look for to see the previous configuration that is replaced

kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"name":"nginx-deployment","namespace":"default"},"spec":{"replicas":2,"selector":{"matchLabels":{"app":"nginx"}},"template":{"metadata":{"labels":{"app":"nginx"}},"spec":{"containers":[{"image":"nginx:1.14.2","name":"nginx","ports":[{"containerPort":80}]}]}}}}

Originally published at https://dev.to on March 2, 2021.

--

--

Vidyasagar Machupalli
vmacwrites

Architect, Developer, IBMer, Speaker, Blogger, Teetotaller, Geek & many more…