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