参考链接:k8s 节点驱逐
https://kubernetes.io/zh/docs/concepts/scheduling-eviction/node-pressure-eviction/#soft-eviction-thresholds
mem_awaiable计算脚本
#!/bin/bash
#!/usr/bin/env bash
#改脚本计算k8s cgroups的mem-available值 影响kubelet驱逐的内存指标
#节点总内存
memory_capacity_in_kb=$(cat /proc/meminfo | grep MemTotal | awk '{print $2}')
memory_capacity_in_mb=$((memory_capacity_in_kb / 1024))
memory_capacity_in_bytes=$((memory_capacity_in_kb * 1024))
#k8s cgroups usage值
memory_usage_in_bytes=$(cat /sys/fs/cgroup/memory/memory.usage_in_bytes)
memory_usage_in_mb=$((memory_usage_in_bytes / (1024*1024)))
# inactive_file(即非活动 LRU 列表上基于文件来虚拟的内存的字节数), 因为它假定在压力下内存是可回收的
memory_total_inactive_file=$(cat /sys/fs/cgroup/memory/memory.stat | grep total_inactive_file | awk '{print $2}')
memory_total_inactive_file_in_mb=$((memory_total_inactive_file / (1024*1024)))
#working-set(工作集内存,包括一些正在写入的内存,脏内存、内核内存等)的值是k8s正在使用真正的度量标准,也是kubectl top 通过cadvisor拿的值
#如果cgroups中usage值大于cgroups中可回收的内存值(inactive),那么实际的workingset值就是usage-inactive(比如usage 1g inactive 800mi 那么实际计算workingset就是使用200mi 就是多给了你800mi )
#反之如果usage值小于inactive值,那么workingset实际使用的值就是0,因为inactive值可以随时回收,可用的就是节点总的
memory_working_set=${memory_usage_in_bytes}
if [ "$memory_working_set" -lt "$memory_total_inactive_file" ];
then
memory_working_set=0
else
memory_working_set=$((memory_usage_in_bytes - memory_total_inactive_file))
fi
memory_working_set_in_mb=$((memory_working_set / (1024*1024)))
#cgroups可用内存(节点pod驱逐的关键值)是节点总内存值-正在使用的working-set值
memory_available_in_bytes=$((memory_capacity_in_bytes - memory_working_set))
memory_available_in_mb=$((memory_available_in_bytes / (1024*1024)))
ehco "----------k8s mem_avaible等于mem_capicty减去mem_working_set------------"
echo "memory.capacity_in_mb $memory_capacity_in_mb"
echo "memory.usage_in_mb $memory_usage_in_mb"
echo "memory.total_inactive_file_in_mb $memory_total_inactive_file_in_mb"
echo "memory.working_set_in_mb $memory_working_set_in_mb"
echo "memory.available_in_mb $memory_available_in_mb"