Kubernetes is an open source container orchestration system for automating the deployment, scaling, and management of computer applications. This software was originally designed by Google and is now maintained by the Cloud Native Computing Foundation.
Prerequisite
- kubernetes manifest
- jq installed
- yq installed
Kubernetes is a portable platform, meaning it can run on various infrastructures like on-premises servers, hybrid environments, and cloud platforms.
Because kubernetes is portable, we possible to migrate the yaml manifest like from GKE to onprem, from GKE to EKS, etc.
But if we export manifest directly, there will be several things that need to be deleted.
example if we export yaml manifest
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
branch: refs/heads/development
commit: fae2707c3aed43ed527f50d8d911u5g9b113b13d
createdBy: tkjpedia
deployTimestamp: "1706096688902"
deployment.kubernetes.io/revision: "159"
jobName: deploy_development
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"name":"test-deployment"},"name":"test-deployment","namespace":"tkjpedia-dev"},"spec":{"replicas":1,"selector":{"matchLabels":{"name":"test-deployment"}},"template":{"metadata":{"labels":{"name":"test-deployment"}},"spec":{"containers":[{"image":"ghcr.io/tkjpedia/test-deployment-development:fae2707c3aed43ed527f50d8d911u5g9b113b13d","name":"test-deployment","ports":[{"containerPort":80,"protocol":"TCP"}],"resources":{"limits":{"cpu":"30m","memory":"128Mi"},"requests":{"cpu":"1m","memory":"64Mi"}}}],"imagePullSecrets":[{"name":"ghcr"}]}}}}
provider: GitHub
repository: tkjpedia/test-deployment
run: "7639612587"
runUri: https://github.com/tkjpedia/test-deployment/actions/runs/7639612587
workflow: Github Actions Workflows
creationTimestamp: "2023-05-11T15:20:53Z"
generation: 311
labels:
k8slens-edit-resource-version: v1
name: test-deployment
name: test-deployment
namespace: tkjpedia-dev
resourceVersion: "33670469"
uid: ae602625-3562-4648-8027-f29508ed9533
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
name: test-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
kubectl.kubernetes.io/restartedAt: "2023-12-28T06:49:02Z"
creationTimestamp: null
labels:
name: test-deployment
spec:
containers:
- image: ghcr.io/tkjpedia/test-deployment-development:fae2707c3aed43ed527f50d8d911u5g9b113b13d
imagePullPolicy: Always
name: test-deployment
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
cpu: 30m
memory: 128Mi
requests:
cpu: 1m
memory: 64Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: ghcr
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status:
availableReplicas: 1
conditions:
- lastTransitionTime: "2023-12-28T07:08:27Z"
lastUpdateTime: "2023-12-28T07:08:27Z"
message: Deployment has minimum availability.
reason: MinimumReplicasAvailable
status: "True"
type: Available
- lastTransitionTime: "2024-01-12T14:30:01Z"
lastUpdateTime: "2024-01-24T11:45:03Z"
message: ReplicaSet "test-deployment-5ff88bdcff" has successfully progressed.
reason: NewReplicaSetAvailable
status: "True"
type: Progressing
observedGeneration: 311
readyReplicas: 1
replicas: 1
updatedReplicas: 1
we no need annotation and status parameter, then we should delete it. perhaps we can delete it manually, but what if we have many yaml kubernetes manifest? we can use jq and yq.


jq is a lightweight and powerful command-line tool designed specifically for working with JSON data in Linux environments, yq is a lightweight and portable command-line tool designed for processing YAML, JSON, and XML data in Linux environments. you should install jq and yq in your pc.
Export kubernetes yaml manifest
k get deployment -n tkjpedia-dev test-deployment -ojson > test-deployment.json
export to json format
Delete unused parameters using jq
we can define what we want to delete in jq like this
jq 'del(.metadata.resourceVersion,.metadata.uid,.metadata.selfLink,.metadata.creationTimestamp,.metadata.annotations,.metadata.generation,.metadata.ownerReferences,.status)'
its mean we delete this parameter
- .metadata.resourceVersion
- .metadata.uid
- .metadata.selfLink
- .metadata.creationTimestamp
- .metadata.annotations
- .metadata.generation
- .metadata.ownerReferences
- .status
command:
cat test-deployment.json | jq 'del(.metadata.resourceVersion,.metadata.uid,.metadata.selfLink,.metadata.creationTimestamp,.metadata.annotations,.metadata.generation,.metadata.ownerReferences,.status)'
output
{
"apiVersion": "apps/v1",
"kind": "Deployment",
"metadata": {
"labels": {
"k8slens-edit-resource-version": "v1",
"name": "test-deployment"
},
"name": "test-deployment",
"namespace": "tkjpedia-dev"
},
"spec": {
"progressDeadlineSeconds": 600,
"replicas": 1,
"revisionHistoryLimit": 10,
"selector": {
"matchLabels": {
"name": "test-deployment"
}
},
"strategy": {
"rollingUpdate": {
"maxSurge": "25%",
"maxUnavailable": "25%"
},
"type": "RollingUpdate"
},
"template": {
"metadata": {
"annotations": {
"kubectl.kubernetes.io/restartedAt": "2023-12-28T06:49:02Z"
},
"creationTimestamp": null,
"labels": {
"name": "test-deployment"
}
},
"spec": {
"containers": [
{
"image": "ghcr.io/tkjpedia/test-deployment-development:fae2707c3aed43ed527f50d8d911u5g9b113b13d",
"imagePullPolicy": "Always",
"name": "test-deployment",
"ports": [
{
"containerPort": 80,
"protocol": "TCP"
}
],
"resources": {
"limits": {
"cpu": "30m",
"memory": "128Mi"
},
"requests": {
"cpu": "1m",
"memory": "64Mi"
}
},
"terminationMessagePath": "/dev/termination-log",
"terminationMessagePolicy": "File"
}
],
"dnsPolicy": "ClusterFirst",
"imagePullSecrets": [
{
"name": "ghcr"
}
],
"restartPolicy": "Always",
"schedulerName": "default-scheduler",
"securityContext": {},
"terminationGracePeriodSeconds": 30
}
}
}
}
annotation and status all gone 😀
lets convert json to yaml using yq
yq eval . --prettyPrint
one command
cat test-deployment.json | jq 'del(.metadata.resourceVersion,.metadata.uid,.metadata.selfLink,.metadata.creationTimestamp,.metadata.annotations,.metadata.generation,.metadata.ownerReferences,.status)' | yq eval . --prettyPrint
output
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8slens-edit-resource-version: v1
name: test-deployment
name: test-deployment
namespace: tkjpedia-dev
spec:
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
name: test-deployment
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
kubectl.kubernetes.io/restartedAt: "2023-12-28T06:49:02Z"
creationTimestamp: null
labels:
name: test-deployment
spec:
containers:
- image: ghcr.io/tkjpedia/test-deployment-development:fae2707c3aed43ed527f50d8d911u5g9b113b13d
imagePullPolicy: Always
name: test-deployment
ports:
- containerPort: 80
protocol: TCP
resources:
limits:
cpu: 30m
memory: 128Mi
requests:
cpu: 1m
memory: 64Mi
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: ghcr
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30


Thank you..