【K8S分配率】Shell脚本计算Kubernetes集群CPU和内存总分配率

目录

[1. 分配率计算逻辑](#1. 分配率计算逻辑)

[2. 完整脚本](#2. 完整脚本)

[3. 脚本执行结果](#3. 脚本执行结果)


1. 分配率计算逻辑

CPU分配率 = (所有Pod的CPU请求总和 / 节点CPU可分配总和) * 100%

内存分配率 = (所有Pod的内存请求总和 / 节点内存可分配总和) * 100%

2. 完整脚本

复制代码
#!/bin/bash

# 设置颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

echo -e "${GREEN}=== K8s集群Pod资源分配率计算 ===${NC}\n"

# 获取节点总资源
echo "计算节点总资源..."
NODE_CPU_TOTAL=0
NODE_MEM_TOTAL=0

# 获取所有节点的可分配资源
NODES=$(kubectl get nodes -o jsonpath='{.items[*].metadata.name}')

for node in $NODES; do
    echo "处理节点: $node"

    # 获取节点CPU(单位:核)
    node_cpu=$(kubectl describe node $node | grep -A 1 "Allocatable" | grep cpu | awk '{print $2}')
    if [[ "$node_cpu" == *"m" ]]; then
        node_cpu=$(echo $node_cpu | sed 's/m//')
        node_cpu=$(echo "scale=2; $node_cpu / 1000" | bc | xargs printf "%.2f\n")
    fi
    NODE_CPU_TOTAL=$(echo "$NODE_CPU_TOTAL + $node_cpu" | bc)

    # 获取节点内存(转换为MiB)
    node_mem=$(kubectl describe node $node | grep -A 6 "Allocatable" | grep memory | awk '{print $2}')

    # 转换不同单位的内存为KiB
    if [[ "$node_mem" == *"Ki" ]]; then
        node_mem=$(echo $node_mem | sed 's/Ki//')
        node_mem_mib=$(echo "scale=2; $node_mem / 1024" | bc)
    elif [[ "$node_mem" == *"Mi" ]]; then
        node_mem_mib=$(echo $node_mem | sed 's/Mi//')
    elif [[ "$node_mem" == *"Gi" ]]; then
        node_mem_mib=$(echo $node_mem | sed 's/Gi//')
        node_mem_mib=$(echo "$node_mem_mib * 1024" | bc)
    elif [[ -n "$node_mem" ]]; then
        node_mem_mib=$(echo "scale=2; $node_mem /1024/1024" | bc)
    else
        node_mem_mib=0
    fi

    NODE_MEM_TOTAL=$(echo "$NODE_MEM_TOTAL + $node_mem_mib" | bc)
done

echo -e "节点CPU总量: ${NODE_CPU_TOTAL}核"
echo -e "节点内存总量: ${NODE_MEM_TOTAL}MiB\n"

# 获取所有Pod的请求资源总量
echo "计算Pod请求资源总量..."
POD_CPU_REQUEST=0
POD_MEM_REQUEST=0

# 获取所有命名空间的Pod
NAMESPACES=$(kubectl get namespaces -o jsonpath='{.items[*].metadata.name}')

for ns in $NAMESPACES; do
    # 获取该命名空间下所有Pod的CPU请求
    cpu_requests=$(kubectl get pods -n $ns -o jsonpath='{.items[*].spec.containers[*].resources.requests.cpu}')

    for cpu in $cpu_requests; do
        if [[ "$cpu" == *"m" ]]; then
            cpu_val=$(echo $cpu | sed 's/m//')
            cpu_val=$(echo "scale=2; $cpu_val / 1000" | bc | xargs printf "%.2f\n")
        elif [[ -n "$cpu" ]]; then
            cpu_val=$cpu
        else
            cpu_val=0
        fi
        POD_CPU_REQUEST=$(echo "$POD_CPU_REQUEST + $cpu_val" | bc)
    done

    # 获取该命名空间下所有Pod的内存请求
    mem_requests=$(kubectl get pods -n $ns -o jsonpath='{.items[*].spec.containers[*].resources.requests.memory}')

    for mem in $mem_requests; do
        if [[ "$mem" == *"Ki" ]]; then
            mem_val=$(echo $mem | sed 's/Ki//')
            mem_val_mib=$(echo "scale=2; $mem_val / 1024" | bc)
        elif [[ "$mem" == *"Mi" ]]; then
            mem_val_mib=$(echo $mem | sed 's/Mi//')
        elif [[ "$mem" == *"Gi" ]]; then
            mem_val_mib=$(echo $mem | sed 's/Gi//')
            mem_val_mib=$(echo "$mem_val_mib * 1024" | bc)
        elif [[ -n "$mem" ]]; then
            mem_val_mib=$mem
        else
            mem_val_mib=0
        fi
        POD_MEM_REQUEST=$(echo "$POD_MEM_REQUEST + $mem_val_mib" | bc)
    done
done

echo -e "Pod CPU请求总量: ${POD_CPU_REQUEST}核"
echo -e "Pod内存请求总量: ${POD_MEM_REQUEST}MiB\n"

# 计算分配率
if [[ $(echo "$NODE_CPU_TOTAL > 0" | bc) -eq 1 ]]; then
    CPU_ALLOC_RATIO=$(echo "scale=2; $POD_CPU_REQUEST / $NODE_CPU_TOTAL * 100" | bc)
else
    CPU_ALLOC_RATIO=0
fi

if [[ $(echo "$NODE_MEM_TOTAL > 0" | bc) -eq 1 ]]; then
    MEM_ALLOC_RATIO=$(echo "scale=2; $POD_MEM_REQUEST / $NODE_MEM_TOTAL * 100" | bc)
else
    MEM_ALLOC_RATIO=0
fi

# 输出结果
echo -e "${GREEN}=== 资源分配率结果 ===${NC}"
echo -e "CPU分配率: ${YELLOW}${CPU_ALLOC_RATIO}%${NC}"
echo -e "内存分配率: ${YELLOW}${MEM_ALLOC_RATIO}%${NC}"

# 颜色标记警告
# bc执行一个逻辑判断,而不是一个算术运算,用 1表示逻辑真(True),用 0表示逻辑假(False)
if [[ $(echo "$CPU_ALLOC_RATIO >= 80" | bc) -eq 1 ]]; then
    echo -e "${RED}警告: CPU分配率较高,建议扩容节点或优化Pod资源请求${NC}"
fi

if [[ $(echo "$MEM_ALLOC_RATIO >= 80" | bc) -eq 1 ]]; then
    echo -e "${RED}警告: 内存分配率较高,建议扩容节点或优化Pod资源请求${NC}"
fi

3. 脚本执行结果

相关推荐
Henry-SAP4 小时前
SAP PP核心引擎计划策略业务解析
人工智能·云原生·sap·erp
小白的码BUG之路6 小时前
Docker -- 构建nacos镜像
运维·docker·容器
赵谨言10 小时前
红蓝对抗Docker渗透复盘-技能与产出汇总
docker·容器·eureka
打工仔折腾 AI15 小时前
飞牛OS上用Docker Compose部署ExerciseDiary运动记录并配置远程访问
运维·人工智能·后端·python·docker·容器·ai agent 实战
天衍四九-15 小时前
Docker Compose企业实战系列(八·终章):多环境隔离实战,开发/测试/生产一键切换
运维·docker·容器
ysu_031417 小时前
Docker-Desktop-WSL2实战指南-Windows从安装配置到项目容器化
windows·python·docker·容器·composer·dockerfile·wsl2
陈陈CHENCHEN17 小时前
【Kubernetes】纯 IPv6 K8s 集群访问外部 IPv4 服务
云原生·容器·kubernetes
明王明王18 小时前
从零搭建一个 AI Infra 实验室⑫:Docker 为什么默认看不到 GPU
人工智能·docker·容器
天衍四九-18 小时前
Docker Compose企业实战系列(四):Redis生产级部署|密码加固、持久化、内存优化完整方案
redis·docker·容器
troy12818 小时前
如何在谷歌云(Google Cloud)上部署 Kubernetes 集群
云原生·容器·kubernetes