feat(nodes): 节点列表新增 Request 占用列;服务器列表分页改为 10/30/50/100
节点管理原表格只有"使用率"一列(CPU/内存双条),缺少 Request 占用。 - ListNodes 一次性拉取 Pod 并按节点聚合 CPU/内存 Request, 计算 cpu_alloc_pct / mem_alloc_pct(已申请 / 可分配), 新增 pod_count / cpu_request_m / mem_request_mi 字段 - 前端新增"Request 占用"双条列,阈值 60%/85% 变色, tooltip 展示"已申请 / 可分配"绝对值 - 不含磁盘/分区:K8s 原生 API 不提供磁盘用量, 后续接入 Prometheus 后由监控侧承担 服务器列表分页选项由 10/20/30 调整为 10/30/50/100。 // Logan.Li
This commit is contained in:
1 parent
a210163387
commit
c69d5479b3
3 files changed
+89
-3
No files matched your search
@@ -49,7 +49,44 @@ func (h *KubernetesHandler) ListNodes(c *gin.Context) {
|
||||
// Metrics absolute (for detail pages)
|
||||
CPUUsageM string `json:"cpu_usage_m,omitempty"` // e.g. "122m"
|
||||
MemUsageMi string `json:"mem_usage_mi,omitempty"` // e.g. "2105Mi"
|
||||
|
||||
// Request 占用(分配率 = 该节点 Pod 已申请 / 可分配)// Logan.Li
|
||||
PodCount int `json:"pod_count"`
|
||||
CPURequestM int `json:"cpu_request_m"`
|
||||
MemRequestMi int64 `json:"mem_request_mi"`
|
||||
CPUAllocPct float64 `json:"cpu_alloc_pct"`
|
||||
MemAllocPct float64 `json:"mem_alloc_pct"`
|
||||
}
|
||||
|
||||
// 一次性拉取 Pod 并按节点聚合 Request:列表页展示"Request 占用"所需,
|
||||
// 避免每行单独查一次 Pod 列表。 // Logan.Li
|
||||
type reqAgg struct {
|
||||
cpuM int
|
||||
memMi int64
|
||||
pods int
|
||||
}
|
||||
podReqs := map[string]*reqAgg{}
|
||||
if pods, perr := client.ListPods(); perr == nil && pods != nil {
|
||||
for _, p := range pods.Items {
|
||||
if p.Spec.NodeName == "" {
|
||||
continue
|
||||
}
|
||||
agg := podReqs[p.Spec.NodeName]
|
||||
if agg == nil {
|
||||
agg = &reqAgg{}
|
||||
podReqs[p.Spec.NodeName] = agg
|
||||
}
|
||||
agg.pods++
|
||||
for _, ctr := range p.Spec.Containers {
|
||||
if ctr.Resources.Requests == nil {
|
||||
continue
|
||||
}
|
||||
agg.cpuM += parseCpuToMilli(ctr.Resources.Requests["cpu"])
|
||||
agg.memMi += parseMemToMi(ctr.Resources.Requests["memory"])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result := []NodeSummary{}
|
||||
for _, n := range nodes.Items {
|
||||
role := "worker"
|
||||
@@ -100,6 +137,20 @@ func (h *KubernetesHandler) ListNodes(c *gin.Context) {
|
||||
s.MemoryUsage = float64(memMi) / float64(memCapacity) * 100
|
||||
}
|
||||
}
|
||||
// Request 占用:本节点 Pod 已申请 / 可分配。 // Logan.Li
|
||||
if agg := podReqs[n.Metadata.Name]; agg != nil {
|
||||
allocCPU := parseIntResource(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
|
||||
}
|
||||
if allocMem > 0 {
|
||||
s.MemAllocPct = float64(agg.memMi) / float64(allocMem) * 100
|
||||
}
|
||||
}
|
||||
result = append(result, s)
|
||||
}
|
||||
c.JSON(http.StatusOK, model.Response{Code: 200, Message: "success", Data: result})
|
||||
|
||||
Reference in new issue
Block a user