Skip to content

Instantly share code, notes, and snippets.

@juanbrny
Last active December 10, 2021 14:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save juanbrny/6fd755c5019745678a73933ed1c1638c to your computer and use it in GitHub Desktop.
Save juanbrny/6fd755c5019745678a73933ed1c1638c to your computer and use it in GitHub Desktop.
#!/bin/bash
##############################################
# Script to dump all kubernetes objects and
# definitions for all namespaces the
# user running the script has access to.
# Includes standard objects and CRDs are not exported.
# References:
# - https://www.studytonight.com/post/how-to-list-all-resources-in-a-kubernetes-namespace
# - Rancher's log collector: https://raw.githubusercontent.com/rancherlabs/support-tools/master/collection/rancher/v2.x/logs-collector/rancher2_logs_collector.sh
##############################################
KUBECONFIG=./kubeconfig.yaml
TMPDIR=.
#Skip resources that are rarely used to speed up dump process
FASTMODE=1
#Only get info from System namespaces (in the list below)
ONLY_SYSTEM_NAMESPACES=0
SYSTEM_NAMESPACES=(kube-system kube-public cattle-system cattle-alerting cattle-logging cattle-pipeline ingress-nginx cattle-prometheus istio-system longhorn-system cattle-global-data fleet-system fleet-default rancher-operator-system cattle-monitoring-system cattle-logging-system cattle-fleet-system cattle-fleet-local-system)
RESOURCES_IGNORE_LIST=(alertmanagers.monitoring.coreos.com cisbenchmarkversions.management.cattle.io cisconfigs.management.cattle.io clustertemplates.management.cattle.io clustertemplaterevisions.management.cattle.io endpointslices.discovery.k8s.io etcdbackups.management.cattle.io leases.coordination.k8s.io pipelines.project.cattle.io pipelineexecutions.project.cattle.io pipelinesettings.project.cattle.io pods.metrics.k8s.io )
getCoreInfo() {
mkdir -p $TMPDIR/k8s/podlogs
echo "Collecting system pod logs"
for SYSTEM_NAMESPACE in "${SYSTEM_NAMESPACES[@]}"; do
for SYSTEM_POD in $(kubectl -n $SYSTEM_NAMESPACE get pods --kubeconfig $KUBECONFIG --insecure-skip-tls-verify --no-headers -o custom-columns=NAME:.metadata.name); do
kubectl -n $SYSTEM_NAMESPACE --kubeconfig $KUBECONFIG --insecure-skip-tls-verify logs --all-containers $SYSTEM_POD > $TMPDIR/k8s/podlogs/$SYSTEM_NAMESPACE-$SYSTEM_POD 2>&1
kubectl -n $SYSTEM_NAMESPACE --kubeconfig $KUBECONFIG --insecure-skip-tls-verify logs -p --all-containers $SYSTEM_POD > $TMPDIR/k8s/podlogs/$SYSTEM_NAMESPACE-$SYSTEM_POD-previous 2>&1
done
done
mkdir -p $TMPDIR/k8s/kubectl
kubectl get nodes -o wide --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/nodes 2>&1
kubectl describe nodes --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/nodesdescribe 2>&1
kubectl get pods -o wide --all-namespaces --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/pods 2>&1
kubectl get svc -o wide --all-namespaces --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/services 2>&1
kubectl get endpoints -o wide --all-namespaces --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/endpoints 2>&1
kubectl get configmaps --all-namespaces --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/configmaps 2>&1
kubectl get namespaces --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify > $TMPDIR/k8s/kubectl/namespaces 2>&1
}
archive() {
FILEDIR=$(dirname $TMPDIR)
FILENAME="$CLUSTER_NAME-$(date +'%Y-%m-%d_%H_%M_%S').tar"
tar --create --file ${FILEDIR}/${FILENAME} --directory ${TMPDIR}/k8s .
## gzip separately for Rancher OS
gzip ${FILEDIR}/${FILENAME}
echo "Created ${FILEDIR}/${FILENAME}.gz"
}
cleanup() {
echo "Removing ${TMPDIR}"
rm -r -f "${TMPDIR}/k8s" >/dev/null 2>&1
}
OBJECTSLIST=()
function buildAPIObjectsList {
for i in $(kubectl --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify api-resources --verbs=list --namespaced -o name | grep -v "events.events.k8s.io" | grep -v "events" | sort | uniq); do
if [ $FASTMODE -eq 1 ]; then
if [[ ! " ${RESOURCES_IGNORE_LIST[*]} " =~ " ${i} " ]]; then
OBJECTSLIST+=($i)
fi
else
OBJECTSLIST+=($i)
fi
done
# for OBJECT in "${OBJECTSLIST[@]}"; do
# echo $OBJECT
# done
}
function getAPIObjects {
echo "====== START RESOURCE DEFINITIONS FOR NAMESPACE ${1} ======"
#for i in $(kubectl --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify api-resources --verbs=list --namespaced -o name | grep -v "events.events.k8s.io" | grep -v "events" | sort | uniq); do
for i in "${OBJECTSLIST[@]}"; do
echo "Processing k8s API resource:" $i
mkdir -p $TMPDIR/k8s/objects/${1}
kubectl -n ${1} get --ignore-not-found ${i} -o wide > $TMPDIR/k8s/objects/${1}/${i}_list.txt 2>&1
results=`wc -l $TMPDIR/k8s/objects/${1}/${i}_list.txt | awk '{print $1}'`;
if [ $results -gt 1 ]; then
kubectl -n ${1} get --ignore-not-found ${i} -o yaml > $TMPDIR/k8s/objects/${1}/${i}.yaml 2>&1
fi
done
#Cleanup empty results
#grep -lR "error: the server doesn't have a resource type" $TMPDIR/k8s/objects/* | xargs rm -f
#find $TMPDIR/k8s/objects/ -type f -empty -delete
echo "====== END RESOURCE DEFINITIONS ${1} ======"
}
CLUSTER_NAME=$(kubectl config current-context --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify )
mkdir -p $TMPDIR/k8s
echo "================================================================================"
date > $TMPDIR/k8s/report_data.txt >> $TMPDIR/k8s/report_data.txt
echo "Cluster name: ${CLUSTER_NAME}" >> $TMPDIR/k8s/report_data.txt
kubectl --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify cluster-info >> $TMPDIR/k8s/report_data.txt
kubectl --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify version >> $TMPDIR/k8s/report_data.txt
kubectl --kubeconfig=$KUBECONFIG --insecure-skip-tls-verify cluster-info dump >> $TMPDIR/k8s/cluster_info_dump.json
echo "================================================================================"
getCoreInfo
buildAPIObjectsList
if [ $ONLY_SYSTEM_NAMESPACES -eq 1 ]; then
for NAMESPACE in "${SYSTEM_NAMESPACES[@]}"; do
getAPIObjects $NAMESPACE
done
else
kubectl get namespaces | awk '{print $1}' | sed -e 1d | while IFS=$'\n' read NAMESPACE; do
getAPIObjects $NAMESPACE
done
fi
archive
cleanup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment