Last active
December 10, 2021 14:51
-
-
Save juanbrny/6fd755c5019745678a73933ed1c1638c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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