Using kubectl to edit the status of an object

kubernetes kubectl subresource status

3 min read | by Jordi Prats

As of kubectl v1.24, it is possible to patch subresources using the --subresource flag. This is useful for updating the status of an object, for example.

The --subresource flag is used to specify the subresource to be patched, so if we want to update the status of an object, we can use --subresource=status as follows:

kubectl edit pods demo --subresource=status 

We can test it out by trying to delete the .status.conditions field of a pod. If we try to edit the status with kubectl edit pod test-pod:

(...) status:  conditions:  - lastProbeTime: null  lastTransitionTime: "2024-02-12T08:52:15Z"  status: "True"  type: Initialized  - lastProbeTime: null  lastTransitionTime: "2024-03-15T14:30:14Z"  status: "True"  type: Ready  - lastProbeTime: null  lastTransitionTime: "2024-03-15T14:30:14Z"  status: "True"  type: ContainersReady  - lastProbeTime: null  lastTransitionTime: "2024-02-12T08:52:15Z"  status: "True"  type: PodScheduled  containerStatuses: (...) 

And try to retrieve the pod's status we'll see that we haven't actually deleted the .status.conditions field:

$ kubectl get pod test-pod -o jsonpath='{.status.conditions}' [{"lastProbeTime":null,"lastTransitionTime":"2024-02-12T08:52:15Z","status":"True","type":"Initialized"},{"lastProbeTime":null,"lastTransitionTime":"2024-03-15T14:30:14Z","status":"True","type":"Ready"},{"lastProbeTime":null,"lastTransitionTime":"2024-03-15T14:30:14Z","status":"True","type":"ContainersReady"},{"lastProbeTime":null,"lastTransitionTime":"2024-02-12T08:52:15Z","status":"True","type":"PodScheduled"}] 

We can use the subresource flag to tell kubectl that we are updating the status:

k edit pod test-pod --subresource=status 

If we delete the .status.conditions field and then retrieve the pod's status we'll see that we have actually deleted the .status.conditions field:

$ kubectl get pod test-pod -o yaml (...) status:  containerStatuses:  - containerID: containerd://43d42bd367d09698ba189a171da61f6c7e0f36fdfe1a35c312f65d9dfc4ad89f  image: docker.io/library/alpine:latest  imageID: docker.io/library/alpine@sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b  lastState:  terminated:  containerID: containerd://61fcc725f6b2b7f93effffa0e0b9fc58b5b5e2f41b0e707fa32b002bb8208f55  exitCode: 255  finishedAt: "2024-03-15T14:28:46Z"  reason: Unknown  startedAt: "2024-03-15T12:04:00Z"  name: test-pod  ready: true  restartCount: 33  started: true  state:  running:  startedAt: "2024-03-15T14:30:21Z"  hostIP: 172.18.0.3  phase: Running  podIP: 10.244.0.24  podIPs:  - ip: 10.244.0.24  qosClass: BestEffort  startTime: "2024-01-30T15:50:17Z" 

We'll need to be quick, as the status will be updated by the controller manager. If we wait even just a few seconds and then retrieve the pod's status we'll see that the .status.conditions field has been added back.

Some controllers might use the .status for keeping track of the state of the object, so be careful when updating it as it might cause unexpected behavior.


Posted on 18/03/2024

Categories