Skip to content

Instantly share code, notes, and snippets.

@mdrakiburrahman
Last active January 7, 2023 03:34
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 mdrakiburrahman/54f0173061a0c39e568eb3b1cb33a708 to your computer and use it in GitHub Desktop.
Save mdrakiburrahman/54f0173061a0c39e568eb3b1cb33a708 to your computer and use it in GitHub Desktop.
Calculates eviction signals used by kubelet to trigger eviction manager
# Calculate Eviction Signals - Current State vs Threshold:
#
# https://kubernetes.io/docs/concepts/scheduling-eviction/node-pressure-eviction/#eviction-signals
# https://medium.com/kubernetes-tutorials/efficient-node-out-of-resource-management-in-kubernetes-67f158da6e59
#
NODES=($(kubectl get nodes -o jsonpath='{.items[*].metadata.name}'))
NODE_COUNT=${#NODES[@]}
while true;
do
for ((i=1; i<=${NODE_COUNT}; i++)); do
NODE=${NODES[$i-1]}
# =======
# Refresh
# =======
CURRENT_PAYLOAD=$(kubectl get --raw "/api/v1/nodes/${NODE}/proxy/stats/summary");
THRESHOLD_PAYLOAD=$(kubectl get --raw "/api/v1/nodes/${NODE}/proxy/configz");
# ====================
# Current Calculations
# ====================
# -- 1. Memory --
MEMORY_AVAILABLE_BYTES=$(echo ${CURRENT_PAYLOAD} | jq .node.memory.availableBytes);
# MB
MEMORY_AVAILABLE_MB=$(echo "scale=2; ${MEMORY_AVAILABLE_BYTES}/1024/1024" | bc);
# -- 2. Nodefs capacity --
NODEFS_AVAILABLE_BYTES=$(echo ${CURRENT_PAYLOAD} | jq .node.fs.availableBytes);
NODEFS_CAPACITY_BYTES=$(echo ${CURRENT_PAYLOAD} | jq .node.fs.capacityBytes);
# GB
NODEFS_AVAILABLE_GB=$(echo "scale=2; ${NODEFS_AVAILABLE_BYTES}/1024/1024/1024" | bc);
NODEFS_CAPACITY_GB=$(echo "scale=2; ${NODEFS_CAPACITY_BYTES}/1024/1024/1024" | bc);
# %
NODEFS_PERCENTAGE=$(echo "scale=2; ${NODEFS_AVAILABLE_GB}/${NODEFS_CAPACITY_GB}*100" | bc);
# -- 3. Nodefs Inodes --
NODEFS_INODES_AVAILABLE=$(echo ${CURRENT_PAYLOAD} | jq .node.fs.inodesFree);
NODEFS_INODES_CAPACITY=$(echo ${CURRENT_PAYLOAD} | jq .node.fs.inodes);
# %
NODEFS_INODES_PERCENTAGE=$(echo "scale=2; ${NODEFS_INODES_AVAILABLE}/${NODEFS_INODES_CAPACITY}*100" | bc);
# -- 4. Imagefs capacity --
IMAGEFS_AVAILABLE_BYTES=$(echo ${CURRENT_PAYLOAD} | jq .node.runtime.imageFs.availableBytes);
IMAGEFS_CAPACITY_BYTES=$(echo ${CURRENT_PAYLOAD} | jq .node.runtime.imageFs.capacityBytes);
# GB
IMAGEFS_AVAILABLE_GB=$(echo "scale=2; ${IMAGEFS_AVAILABLE_BYTES}/1024/1024/1024" | bc);
IMAGEFS_CAPACITY_GB=$(echo "scale=2; ${IMAGEFS_CAPACITY_BYTES}/1024/1024/1024" | bc);
# %
IMAGEFS_PERCENTAGE=$(echo "scale=2; ${IMAGEFS_AVAILABLE_GB}/${IMAGEFS_CAPACITY_GB}*100" | bc);
# -- 5. Imagefs Inodes --
IMAGEFS_INODES_AVAILABLE=$(echo ${CURRENT_PAYLOAD} | jq .node.fs.inodesFree);
IMAGEFS_INODES_CAPACITY=$(echo ${CURRENT_PAYLOAD} | jq .node.fs.inodes);
# %
IMAGEFS_INODES_PERCENTAGE=$(echo "scale=2; ${NODEFS_INODES_AVAILABLE}/${NODEFS_INODES_CAPACITY}*100" | bc);
# -- 6. Pid stats --
#
PID_MAX=$(echo ${CURRENT_PAYLOAD} | jq .node.rlimit.maxpid);
PID_CURR=$(echo ${CURRENT_PAYLOAD} | jq .node.rlimit.curproc);
PID_AVAILABLE=$(echo "scale=2; ${PID_MAX}-${PID_CURR}" | bc);
# =========
# Threshold
# =========
# Thresholds available differs by K8s distros
# -- 1. Memory --
MEMORY_AVAILABLE_MB_THRESHOLD=$(echo ${THRESHOLD_PAYLOAD} | jq '.kubeletconfig.evictionHard."memory.available"' | sed 's/"//g');
# -- 2. Nodefs capacity --
NODEFS_AVAILABLE_PERCENTAGE_THRESHOLD=$(echo ${THRESHOLD_PAYLOAD} | jq '.kubeletconfig.evictionHard."nodefs.available"' | sed 's/"//g');
# -- 3. Nodefs Inodes --
NODEFS_INODES_AVAILABLE_PERCENTAGE_THRESHOLD=$(echo ${THRESHOLD_PAYLOAD} | jq '.kubeletconfig.evictionHard."nodefs.inodesFree"' | sed 's/"//g');
# -- 4. Imagefs capacity --
IMAGEFS_AVAILABLE_PERCENTAGE_THRESHOLD=$(echo ${THRESHOLD_PAYLOAD} | jq '.kubeletconfig.evictionHard."imagefs.available"' | sed 's/"//g');
# -- 5. Imagefs Inodes --
IMAGEFS_INODES_AVAILABLE_PERCENTAGE_THRESHOLD=$(echo ${THRESHOLD_PAYLOAD} | jq '.kubeletconfig.evictionHard."imagefs.inodesFree"' | sed 's/"//g');
# -- 6. Pid stats --
PID_AVAILABLE_PERCENTAGE_THRESHOLD=$(echo ${THRESHOLD_PAYLOAD} | jq '.kubeletconfig.evictionHard."pid.available"' | sed 's/"//g');
echo
echo " ===================================================================== "
echo " Node ${i}/${NODE_COUNT}: ${NODE}"
echo " ===================================================================== "
echo " -- Current State ---------------------------------------------------- "
echo " --------------------------------------------------------------------- "
echo "1. memory.available: ${MEMORY_AVAILABLE_MB}Mi";
echo "2. nodefs.available: ${NODEFS_PERCENTAGE}% [${NODEFS_AVAILABLE_GB}/${NODEFS_CAPACITY_GB}Gi]";
echo "3. nodefs.inodesFree: ${NODEFS_INODES_PERCENTAGE}% [${NODEFS_INODES_AVAILABLE}/${NODEFS_INODES_CAPACITY}]";
echo "4. imagefs.available: ${IMAGEFS_PERCENTAGE}% [${IMAGEFS_AVAILABLE_GB}/${IMAGEFS_CAPACITY_GB}Gi]";
echo "5. imagefs.inodesFree: ${IMAGEFS_INODES_PERCENTAGE}% [${IMAGEFS_INODES_AVAILABLE}/${IMAGEFS_INODES_CAPACITY}]";
echo "6. pid.available: ${PID_AVAILABLE}";
echo " --------------------------------------------------------------------- "
echo " -- Eviction Thresholds ---------------------------------------------- "
echo " --------------------------------------------------------------------- "
echo "1. memory.available: ${MEMORY_AVAILABLE_MB_THRESHOLD}"
echo "2. nodefs.available: ${NODEFS_AVAILABLE_PERCENTAGE_THRESHOLD}"
echo "3. nodefs.inodesFree: ${NODEFS_INODES_AVAILABLE_PERCENTAGE_THRESHOLD}"
echo "4. imagefs.available: ${IMAGEFS_AVAILABLE_PERCENTAGE_THRESHOLD}"
echo "5. imagefs.inodesFree: ${IMAGEFS_INODES_AVAILABLE_PERCENTAGE_THRESHOLD}"
echo "6. pid.available: ${PID_AVAILABLE_PERCENTAGE_THRESHOLD}"
echo " --------------------------------------------------------------------- "
echo
done
done
@mdrakiburrahman
Copy link
Author

Sample payload:
image

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