Skip to content

Commit 1922763

Browse files
committed
Refactor pvc mode
1 parent 73723cf commit 1922763

File tree

1 file changed

+38
-65
lines changed

1 file changed

+38
-65
lines changed

check_kubernetes.sh

Lines changed: 38 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ unset NAME
5858

5959
die() {
6060
echo "$1"
61-
exit "${2:-2}"
61+
exit "${2:-2}"
6262
}
6363

6464
while getopts ":m:M:H:T:t:K:N:n:o:c:w:h" arg; do
@@ -91,8 +91,7 @@ fi
9191
command -v jq &>/dev/null || die "CRITICAL: jq is required"
9292

9393
getJSON() {
94-
kubectl_command=$1
95-
api_path=$2
94+
api_path=$1
9695

9796
if [ "$APISERVER" ]; then
9897
if [ -z "$TOKEN" ]; then
@@ -115,7 +114,7 @@ getJSON() {
115114
die "Could not access API"
116115
fi
117116
else
118-
data=$(eval timeout "$TIMEOUT" kubectl "$kubectl_command" -o json 2>&1)
117+
data=$(eval timeout "$TIMEOUT" kubectl get --raw "/$api_path" 2>&1)
119118
code=$?
120119
if [ $code -gt 0 ]; then
121120
if [ $code = 124 ]; then
@@ -131,17 +130,15 @@ getJSON() {
131130
OUTPUT=""
132131
EXITCODE=0
133132

134-
kubectl_ns="--all-namespaces"
135133
if [ "$NAMESPACE" ]; then
136134
api_ns="/namespaces/$NAMESPACE"
137-
kubectl_ns="--namespace=$NAMESPACE"
138135
fi
139136

140137
mode_apiserver() {
141138
if [ -z "$APISERVER" ]; then
142139
die "Apiserver URL should be defined in this mode"
143140
fi
144-
data=$(getJSON "" "healthz")
141+
data=$(getJSON "healthz")
145142
[ $? -gt 0 ] && die "$data"
146143
if [ "$data" = ok ]; then
147144
OUTPUT="OK. Kubernetes apiserver is healthy"
@@ -154,7 +151,7 @@ mode_apiserver() {
154151
}
155152

156153
mode_nodes() {
157-
data="$(getJSON "get nodes" "api/v1/nodes")"
154+
data="$(getJSON "api/v1/nodes")"
158155
[ $? -gt 0 ] && die "$data"
159156
nodes=($(echo "$data" | jq -r ".items[].metadata.name"))
160157

@@ -189,7 +186,7 @@ mode_nodes() {
189186

190187
mode_unboundpvs() {
191188
CRIT=${CRIT:-5}
192-
data=$(getJSON "get pv" "api/v1/persistentvolumes")
189+
data=$(getJSON "api/v1/persistentvolumes")
193190
[ $? -gt 0 ] && die "$data"
194191
declare -A pvsArr unboundPvsArr
195192
while IFS="=" read -r key value; do
@@ -224,66 +221,42 @@ mode_pvc() {
224221
CRIT_ERROR=0
225222
PVC_COUNT=0
226223

227-
data="$(getJSON "get nodes" "api/v1/nodes")"
224+
data="$(getJSON "api/v1/nodes")"
228225
[ $? -gt 0 ] && die "$data"
229226
nodes=($(echo "$data" | jq -r ".items[].metadata.name"))
230-
231-
for node in "${nodes[@]}"; do
232-
data="$(getJSON "get nodes" "api/v1/nodes/$node/proxy/stats/summary")"
233-
[ $? -gt 0 ] && die "$data"
234-
pods=($(echo "$data" | jq -r ".pods[].podRef.name"))
235-
for pod in "${pods[@]}"; do
236-
pod_volumes="$(echo "$data" | jq -r ".pods[] | select(.podRef.name==\"$pod\") | .volume" 2>/dev/null)"
237-
[ "$pod_volumes" == "null" ] && continue
238-
for volumes in "${pod_volumes[@]}"; do
239-
volumes_list="$(echo "$volumes" | jq -r ".[] | select(.pvcRef.name!=null)")"
240-
volumes_namespace=$(echo "$volumes_list" | jq -r ".pvcRef.namespace" | uniq)
241-
for pvc_volumes in "${volumes_list[@]}"; do
242-
[ -z "$pvc_volumes" ] && continue
243-
for volume_name in $(echo "$pvc_volumes" | jq -r ".name"); do
244-
#volume_bytes_available=$(echo "$pvc_volumes" | jq -r ". | select(.name==\"$volume_name\") | .availableBytes")
245-
volume_bytes_capacity=$(echo "$pvc_volumes" | jq -r ". | select(.name==\"$volume_name\") | .capacityBytes")
246-
volume_bytes_used=$(echo "$pvc_volumes" | jq -r ". | select(.name==\"$volume_name\") | .usedBytes")
247-
#volume_inodes_free=$(echo "$pvc_volumes" | jq -r ". | select(.name==\"$volume_name\") | .inodesFree")
248-
volume_inodes_used=$(echo "$pvc_volumes" | jq -r ". | select(.name==\"$volume_name\") | .inodesUsed")
249-
volume_inodes_capacity=$(echo "$pvc_volumes" | jq -r ". | select(.name==\"$volume_name\") | .inodes")
250-
volume_bytes_utilization=$(echo "100 * $volume_bytes_used / $volume_bytes_capacity" | bc)
251-
volume_inodes_utilization=$(echo "100 * $volume_inodes_used / $volume_inodes_capacity" | bc)
252-
253-
((PVC_COUNT++))
254-
255-
if [ "$volume_bytes_utilization" -gt "$WARN" ] && [ "$volume_bytes_utilization" -lt "$CRIT" ]; then
256-
OUTPUT="${OUTPUT}High storage utilization on pvc $volume_name (namespace:$volumes_namespace): $volume_bytes_utilization% ($volume_bytes_used/$volume_bytes_capacity Bytes)\n"
257-
((WARN_ERROR++))
258-
fi
259-
if [ "$volume_bytes_utilization" -gt "$CRIT" ]; then
260-
OUTPUT="${OUTPUT}Very high storage utilization on pvc $volume_name: $volume_bytes_utilization% ($volume_bytes_used/$volume_bytes_capacity Bytes)\n"
261-
((CRIT_ERROR++))
262-
fi
263-
if [ "$volume_inodes_utilization" -gt "$WARN" ] && [ "$volume_inodes_utilization" -lt "$CRIT" ]; then
264-
OUTPUT="${OUTPUT}High inodes utilization on pvc $volume_name: $volume_inodes_utilization% ($volume_inodes_used/$volume_inodes_capacity)\n"
265-
((WARN_ERROR++))
266-
fi
267-
if [ "$volume_inodes_utilization" -gt "$CRIT" ]; then
268-
OUTPUT="${OUTPUT}Very high inodes utilization on pvc $volume_name: $volume_inodes_utilization% ($volume_inodes_used/$volume_inodes_capacity)\n"
269-
((CRIT_ERROR++))
270-
fi
271-
done
272-
done
273-
done
274-
done
227+
data=$(for node in "${nodes[@]}"; do getJSON "api/v1/nodes/$node/proxy/stats/summary"; done)
228+
volumes=$(echo "$data" | jq -s '[.[].pods[].volume[]? | select(has("pvcRef")) | {name: .pvcRef.name, namespace: .pvcRef.namespace, capacityBytes, usedBytes, availableBytes, percentageUsed: (.usedBytes / .capacityBytes * 100) | round}] | sort_by(.name) | unique')
229+
if [ "$NAMESPACE" ]; then
230+
volumes=$(echo "$volumes" | jq "[.[] | select(.namespace==\"$NAMESPACE\")]")
231+
fi
232+
length=$(echo "$volumes" | jq length)
233+
for (( n=0; n<length; n++ )); do
234+
volume=$(echo "$volumes" | jq ".[$n]")
235+
volume_name=$(echo "$volume" | jq -r '.namespace + "/" + .name')
236+
volume_bytes_utilization=$(echo "$volume" | jq -r '.percentageUsed')
237+
volume_bytes_capacity=$(echo "$volume" | jq -r '.capacityBytes')
238+
volume_bytes_used=$(echo "$volume" | jq -r '.usedBytes')
239+
240+
if [ "$volume_bytes_utilization" -gt "$WARN" ] && [ "$volume_bytes_utilization" -lt "$CRIT" ]; then
241+
OUTPUT="${OUTPUT} High storage utilization on pvc $volume_name: $volume_bytes_utilization% ($volume_bytes_used/$volume_bytes_capacity Bytes)"
242+
((WARN_ERROR++))
243+
fi
244+
if [ "$volume_bytes_utilization" -gt "$CRIT" ]; then
245+
OUTPUT="${OUTPUT} Very high storage utilization on pvc $volume_name: $volume_bytes_utilization% ($volume_bytes_used/$volume_bytes_capacity Bytes)"
246+
((CRIT_ERROR++))
247+
fi
275248
done
276249

277250
if [ "$WARN_ERROR" -eq "0" ] && [ "$CRIT_ERROR" -eq "0" ]; then
278251
echo "OK. No problems on $PVC_COUNT pvc"
279252
elif [ "$WARN_ERROR" -ne "0" ] && [ "$CRIT_ERROR" -eq "0" ]; then
280-
echo "WARNING.\n${OUTPUT}"
253+
echo "WARNING.${OUTPUT}"
281254
exit 1
282255
elif [ "$CRIT_ERROR" -ne "0" ]; then
283-
echo "CRITICAL.\n${OUTPUT}"
256+
echo "CRITICAL.${OUTPUT}"
284257
exit 2
285258
else
286-
echo "ERROR.\n${OUTPUT}"
259+
echo "ERROR.${OUTPUT}"
287260
exit 3
288261
fi
289262
}
@@ -296,7 +269,7 @@ mode_tls() {
296269
count_crit=0
297270
nowdate=$(date +%s)
298271

299-
fulldata=$(getJSON "get secrets $kubectl_ns" "api/v1$api_ns/secrets/")
272+
fulldata=$(getJSON "api/v1$api_ns/secrets/")
300273
[ $? -gt 0 ] && die "$fulldata"
301274
data=$(echo "$fulldata" | \
302275
jq -r ".items[] | select (.type==\"kubernetes.io/tls\")")
@@ -368,7 +341,7 @@ mode_pods() {
368341
count_failed=0
369342
max_restart_count=0
370343
bad_container=""
371-
data=$(getJSON "get pods $kubectl_ns" "api/v1$api_ns/pods/")
344+
data=$(getJSON "api/v1$api_ns/pods/")
372345
[ $? -gt 0 ] && die "$data"
373346

374347
if [ "$NAME" ]; then
@@ -448,7 +421,7 @@ mode_pods() {
448421
mode_deployments() {
449422
count_avail=0
450423
count_failed=0
451-
rawdata=$(getJSON "get deployments $kubectl_ns" "apis/apps/v1$api_ns/deployments/")
424+
rawdata=$(getJSON "apis/apps/v1$api_ns/deployments/")
452425
[ $? -gt 0 ] && die "$rawdata"
453426

454427
# deflate the data
@@ -504,7 +477,7 @@ mode_deployments() {
504477
mode_daemonsets() {
505478
count_avail=0
506479
count_failed=0
507-
data=$(getJSON "get ds $kubectl_ns" "apis/apps/v1$api_ns/daemonsets/")
480+
data=$(getJSON "apis/apps/v1$api_ns/daemonsets/")
508481
[ $? -gt 0 ] && die "$data"
509482

510483
if [ "$NAME" ]; then
@@ -565,7 +538,7 @@ mode_replicasets() {
565538
count_avail=0
566539
count_failed=0
567540

568-
data=$(getJSON "get rs $kubectl_ns" "apis/apps/v1$api_ns/replicasets/")
541+
data=$(getJSON "apis/apps/v1$api_ns/replicasets/")
569542
[ $? -gt 0 ] && die "$data"
570543

571544
if [ "$NAME" ]; then
@@ -625,7 +598,7 @@ mode_replicasets() {
625598
mode_statefulsets() {
626599
count_avail=0
627600
count_failed=0
628-
data=$(getJSON "get statefulsets $kubectl_ns" "apis/apps/v1$api_ns/statefulsets/")
601+
data=$(getJSON "apis/apps/v1$api_ns/statefulsets/")
629602
[ $? -gt 0 ] && die "$data"
630603

631604
if [ "$NAME" ]; then
@@ -691,7 +664,7 @@ mode_jobs() {
691664
total_jobs=0
692665
declare -i total_failed_count=0
693666
declare -i job_fail_count
694-
data=$(getJSON "get jobs $kubectl_ns" "apis/batch/v1$api_ns/jobs/")
667+
data=$(getJSON "apis/batch/v1$api_ns/jobs/")
695668
[ $? -gt 0 ] && die "$data"
696669

697670
if [ "$NAME" ]; then

0 commit comments

Comments
 (0)