Akemi

k8s剩余资源计算脚本

2025/04/08

现在在某一环境中要新增一些服务,如何计算k8s集群节点资源是否充足呢?

通过--show-labels先筛选出想要的查看的节点

通过describe node,查看allocatable总可用资源

查看Allocated resources字段中request部分,这一部分是qos设定的
即k8s调度器的视角,只要request没超过总可用资源,那么就可以源源不断的调度

查看Allocated resources字段中limits部分,这一部分是qos设定的
节点上所有服务的limits不应超过总可用资源,不然就会存在OOM的风险

limits一般设定为request的1.5倍,也可以相同

CPU资源不太严格,毕竟CPU可以分片,但内存资源最好严格执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/bin/bash

config=~/.kube/config
# 获取所有节点列表
NODES=$(kubectl --kubeconfig $config get nodes -o name | cut -d'/' -f2)

# 定义单位转换函数
memory_to_gib() {
local value=$1
if [[ $value == *Ki ]]; then
echo "scale=2; ${value%Ki}/1024/1024" | bc
elif [[ $value == *Mi ]]; then
echo "scale=2; ${value%Mi}/1024" | bc
elif [[ $value == *Gi ]]; then
echo "${value%Gi}"
else
echo "0"
fi
}

# 输出表头
printf "%-30s | %-10s | %-10s | %-15s | %-15s | %s\n" \
"Node" "Req CPU(m)" "Avail CPU(m)" "Req Mem(GiB)" "Avail Mem(GiB)" "Warnings"
printf "%-30s-+-%-10s-+-%-10s-+-%-15s-+-%-15s-+-%s\n" \
"------------------------------" "----------" "----------" "---------------" "---------------" "--------"

# 遍历所有节点
for node in $NODES; do
# 获取节点描述信息
node_json=$(kubectl --kubeconfig $config get node $node -o json)

# 提取关键数据
allocatable_cpu=$(echo "$node_json" | jq -r '.status.allocatable.cpu')
allocatable_mem=$(echo "$node_json" | jq -r '.status.allocatable.memory')
requested_cpu=$(kubectl --kubeconfig $config describe node $node | \
grep "Allocated resources" -A 9 | grep cpu | awk '{print $2}')
requested_mem=$(kubectl --kubeconfig $config describe node $node | \
grep "Allocated resources" -A 9 | grep mem | awk '{print $2}')

# 转换CPU单位
if [[ "$allocatable_cpu" == *m ]]; then
alloc_millicores=${allocatable_cpu%m}
else
alloc_millicores=$((allocatable_cpu * 1000))
fi
req_millicores=${requested_cpu%m}
available_cpu=$((alloc_millicores - req_millicores))

# 转换内存单位
alloc_mem_gib=$(memory_to_gib "$allocatable_mem")
req_mem_gib=$(memory_to_gib "$requested_mem")
available_mem_gib=$(echo "scale=2; $alloc_mem_gib - $req_mem_gib" | bc)

# 生成警告信息
warnings=""
[ $available_cpu -lt 500 ] && warnings+="Low CPU "
(( $(echo "$available_mem_gib < 2" | bc -l) )) && warnings+="Low Mem"

# 输出结果
printf "%-30s | %10s | %10s | %15s | %15s | %s\n" \
"$node" \
"${requested_cpu}" \
"${available_cpu}m" \
"$req_mem_gib" \
"$available_mem_gib" \
"$warnings"
done

Node | Req CPU(m) | Avail CPU(m) | Req Mem(GiB) | Avail Mem(GiB) | Warnings
——————————-+————+————+—————–+—————–+———
cn-hangzhou.172.28.4.6 | 4955m | 2845m | 7.25 | 20.07 |
cn-hangzhou.172.28.7.246 | 3655m | 4145m | 5.29 | 7.25 |
cn-hangzhou.172.28.7.249 | 5455m | 2345m | 13.86 | 13.46 |

可见我的这三个节点还有8C40G可用,够够的了

CATALOG