Skip to content

Instantly share code, notes, and snippets.

@negz
Last active March 6, 2024 18:42
Show Gist options
  • Save negz/c3ee465b48306593f16c523a22015bec to your computer and use it in GitHub Desktop.
Save negz/c3ee465b48306593f16c523a22015bec to your computer and use it in GitHub Desktop.
Dump Kubernetes cluster resources as YAML
#!/usr/bin/env bash
set -e
CONTEXT="$1"
if [[ -z ${CONTEXT} ]]; then
echo "Usage: $0 KUBE-CONTEXT"
exit 1
fi
NAMESPACES=$(kubectl --context ${CONTEXT} get -o json namespaces|jq '.items[].metadata.name'|sed "s/\"//g")
RESOURCES="configmap secret daemonset deployment service hpa"
for ns in ${NAMESPACES};do
for resource in ${RESOURCES};do
rsrcs=$(kubectl --context ${CONTEXT} -n ${ns} get -o json ${resource}|jq '.items[].metadata.name'|sed "s/\"//g")
for r in ${rsrcs};do
dir="${CONTEXT}/${ns}/${resource}"
mkdir -p "${dir}"
kubectl --context ${CONTEXT} -n ${ns} get -o yaml ${resource} ${r} > "${dir}/${r}.yaml"
done
done
done
@tilleryd
Copy link

tilleryd commented Jan 29, 2020

awesome

@wuestkamp
Copy link

wuestkamp commented Apr 22, 2020

sweet! If you want all resources you could do:

RESOURCES=$(kubectl api-resources --namespaced -o name | tr "\n" " ")

and namespaces without jq:

kubectl get ns -o jsonpath="{.items[*].metadata.name}"

@boweeb
Copy link

boweeb commented Nov 20, 2020

Quick jq tip:
If you use -r then you won't need to strip quotes with sed.

... | jq '.items[].metadata.name' | sed "s/\"//g"

# is equivalent to

... | jq -r '.items[].metadata.name'

Quote from man page:

o   --raw-output / -r:

    With this option, if the filter's result is a string then it will be written
    directly to standard output  rather  than  being formatted as a JSON string
    with quotes. This can be useful for making jq filters talk to non-JSON-based
    systems.

@cig0
Copy link

cig0 commented Dec 17, 2020

Saved me from a huge headache today

@artemkoru
Copy link

Thanks!

@WoozyMasta
Copy link

You can try this script

@RaymondHallquist
Copy link

This is a great script. I simply added statefulset to line 13 to get them too. :)

@shorif2000
Copy link

what is context?

@nuno-aj-aniceto
Copy link

what is context?

The context of the kubernetes "connection", check the ~/.kube/config file for more information.

If you don't know, just grab your current kubernetes context (ie: if you run minikube or a single-node this is what you want):
cat ~/.kube/config | grep current-context

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment