From c407542a3df71fae84fcef939c1bfc85fcd1ee07 Mon Sep 17 00:00:00 2001 From: Antti Kervinen Date: Wed, 31 Mar 2021 10:26:28 +0300 Subject: [PATCH] scripts: kube-cgroups prints cgroup entries per pod/container --- scripts/testing/kube-cgroups | 137 +++++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100755 scripts/testing/kube-cgroups diff --git a/scripts/testing/kube-cgroups b/scripts/testing/kube-cgroups new file mode 100755 index 000000000..bbdc26142 --- /dev/null +++ b/scripts/testing/kube-cgroups @@ -0,0 +1,137 @@ +#!/bin/bash + +usage() { + cat <&2 + exit 1 +} + +full_filename=0 +empty_files=0 +ns_regexp="default" # regexp matching +pod_regexp="." # regexp matching any pod name +cntr_regexp="." # regexp matching any container line +cgfile_regexp="cpuset.cpus|cpuset.mems|blkio.throttle.*_device" # regexp matching any cgroup file + +cg_controller_dir=/sys/fs/cgroup + +while getopts "hg:EFn:p:c:f:" OPTION; do + case $OPTION in + h) + usage + exit 0 + ;; + g) + cg_controller_dir="$OPTARG" + ;; + E) + empty_files=1 + ;; + F) + full_filename=1 + ;; + n) + ns_regexp="$OPTARG" + ;; + p) + pod_regexp="$OPTARG" + ;; + c) + cntr_regexp="$OPTARG" + ;; + f) + cgfile_regexp="$OPTARG" + ;; + *) + error "invalid option $OPTION" + ;; + esac +done + +if [ ! -d "$cg_controller_dir" ]; then + error "cgroup directory '$cg_controller_dir' does not exist" +fi + +kubectl get pods -A | grep -E "$pod_regexp" | while read -r namespace podname rest; do + + [ "$namespace" == "NAMESPACE" ] && continue + + grep -q -E "$ns_regexp" <<< "$namespace" || continue + + kubectl describe pod -n "$namespace" "$podname" | grep -B1 'Container ID:' | while read -r container _ containerid; do + + if [[ "$container" != "Container" ]] && [[ "$container" != "--" ]]; then + containername="${container%%:*}" + continue + fi + + containerID=${containerid#*://} + + if [[ -z "$containerID" ]]; then + continue + fi + + grep -q -E "$cntr_regexp" <<< "$containername" || continue + + while read -r cgroupdir; do + for filename in "$cgroupdir"/*; do + if [[ ! -f "$filename" ]]; then + continue + fi + filename_nodir="${filename##*/}" + grep -q -E "$cgfile_regexp" <<< "$filename_nodir" || continue + if [[ -n "$podname" ]]; then + echo "$namespace/$podname:" + unset podname + fi + [[ -n "$containername" ]] && { + echo " $containername:" + unset containername + } + linecount="$(wc -l < "$filename")" + if [[ "$linecount" == "0" ]] && [[ "$empty_files" == "0" ]]; then + continue + fi + if [[ "$full_filename" == "1" ]]; then + print_filename="$filename" + else + print_filename="$filename_nodir" + fi + if (( "$linecount" <= 1 )); then + # print contents of a single-line file after filename + echo " $print_filename: $(< "$filename")" + else + # print contents of a multiline file indented + echo " $print_filename:" + sed "s/^/ /g" < "$filename" + fi + done + done <<< "$(find "$cg_controller_dir" -name "$containerID")" + done +done