From 286d7cd906b90ee026bcfd849b451fb923fedb25 Mon Sep 17 00:00:00 2001 From: "Logan.Li" Date: Sun, 18 Oct 2026 21:09:48 +0000 Subject: [PATCH] =?UTF-8?q?fix(nodes):=20=E4=BF=AE=E6=AD=A3=20Request=20?= =?UTF-8?q?=E5=8D=A0=E7=94=A8=E4=B8=A4=E5=A4=84=E8=AE=A1=E7=AE=97=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. CPU 分母单位错误 Allocatable["cpu"] 形如 "15890m",parseIntResource 用 %d 解析得 15890(已是毫核), 再乘 1000 使分母放大 1000 倍,16 核节点显示 0.07% 而非 70%。 改用 parseCpuToMilli 统一到毫核。 2. 已结束 Pod 未排除 Succeeded/Failed 的 Pod 不再占用资源,其 Request 被计入导致 分配率虚高(实测 172.19.0.61 显示 1090%,187 个 Pod 中多数已结束)。 改为跳过非运行态 Pod。 修复后 12 个节点分配率回到 60~90%,无超过 100% 的异常值。 // Logan.Li --- backend/controller/k8s_node.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/backend/controller/k8s_node.go b/backend/controller/k8s_node.go index f3dd9da..c183d72 100644 --- a/backend/controller/k8s_node.go +++ b/backend/controller/k8s_node.go @@ -71,6 +71,11 @@ func (h *KubernetesHandler) ListNodes(c *gin.Context) { if p.Spec.NodeName == "" { continue } + // 只统计仍在消耗资源的 Pod:Succeeded/Failed 已结束, + // 把它们的 Request 计入会虚高分配率(曾出现 1090% 的异常值)。 // Logan.Li + if p.Status.Phase == "Succeeded" || p.Status.Phase == "Failed" { + continue + } agg := podReqs[p.Spec.NodeName] if agg == nil { agg = &reqAgg{} @@ -137,15 +142,17 @@ func (h *KubernetesHandler) ListNodes(c *gin.Context) { s.MemoryUsage = float64(memMi) / float64(memCapacity) * 100 } } - // Request 占用:本节点 Pod 已申请 / 可分配。 // Logan.Li + // Request 占用:本节点 Pod 已申请 / 可分配。 + // 注意 Allocatable 的 cpu 可能带 m 后缀(如 "15890m"),必须用 parseCpuToMilli 统一到毫核, + // 不能再用 parseIntResource 后乘 1000,否则分母会被放大 1000 倍。 // Logan.Li if agg := podReqs[n.Metadata.Name]; agg != nil { - allocCPU := parseIntResource(n.Status.Allocatable["cpu"]) + allocCPU := parseCpuToMilli(n.Status.Allocatable["cpu"]) allocMem := parseMemResource(n.Status.Allocatable["memory"]) s.PodCount = agg.pods s.CPURequestM = agg.cpuM s.MemRequestMi = agg.memMi if allocCPU > 0 { - s.CPUAllocPct = float64(agg.cpuM) / float64(allocCPU*1000) * 100 + s.CPUAllocPct = float64(agg.cpuM) / float64(allocCPU) * 100 } if allocMem > 0 { s.MemAllocPct = float64(agg.memMi) / float64(allocMem) * 100