@@ -11,18 +11,29 @@ const (
11
11
)
12
12
13
13
func CalculateClusterResources (nodes * corev1.NodeList , pods * corev1.PodList ) corev1.ResourceList {
14
- base := GetNodesTotalResources (nodes )
15
- reqs , _ := GetPodsTotalRequestsAndLimits (pods )
14
+ unavailableNodes := GetNotReadyAndUnschedulableLeafNodes (nodes )
15
+ base := GetNodesTotalResources (nodes , unavailableNodes )
16
+ reqs , _ := GetPodsTotalRequestsAndLimits (pods , unavailableNodes )
16
17
podNums := GetUsedPodNums (pods , nodes )
17
18
SubResourceList (base , reqs )
18
19
SubResourceList (base , podNums )
19
20
return base
20
21
}
21
22
22
- func GetNodesTotalResources (nodes * corev1.NodeList ) (total corev1.ResourceList ) {
23
+ func GetNotReadyAndUnschedulableLeafNodes (leafNodes * corev1.NodeList ) (unavailableNodes map [string ]corev1.Node ) {
24
+ unavailableNodes = make (map [string ]corev1.Node )
25
+ for i , n := range leafNodes .Items {
26
+ if n .Spec .Unschedulable || ! NodeReady (& leafNodes .Items [i ]) {
27
+ unavailableNodes [n .Name ] = n
28
+ }
29
+ }
30
+ return unavailableNodes
31
+ }
32
+
33
+ func GetNodesTotalResources (nodes * corev1.NodeList , unavailableNodes map [string ]corev1.Node ) (total corev1.ResourceList ) {
23
34
total = corev1.ResourceList {}
24
- for i , n := range nodes .Items {
25
- if n . Spec . Unschedulable || ! NodeReady ( & nodes . Items [ i ]) {
35
+ for _ , n := range nodes .Items {
36
+ if _ , ok := unavailableNodes [ n . Name ]; ok {
26
37
continue
27
38
}
28
39
for key , val := range n .Status .Allocatable {
@@ -50,7 +61,7 @@ func SubResourceList(base, list corev1.ResourceList) {
50
61
51
62
// GetPodsTotalRequestsAndLimits
52
63
// lifted from https://github.com/kubernetes/kubernetes/blob/v1.21.8/staging/src/k8s.io/kubectl/pkg/describe/describe.go#L4051
53
- func GetPodsTotalRequestsAndLimits (podList * corev1.PodList ) (reqs corev1.ResourceList , limits corev1.ResourceList ) {
64
+ func GetPodsTotalRequestsAndLimits (podList * corev1.PodList , unavailableNodes map [ string ]corev1. Node ) (reqs corev1.ResourceList , limits corev1.ResourceList ) {
54
65
reqs , limits = corev1.ResourceList {}, corev1.ResourceList {}
55
66
if podList .Items != nil {
56
67
for _ , p := range podList .Items {
@@ -61,6 +72,9 @@ func GetPodsTotalRequestsAndLimits(podList *corev1.PodList) (reqs corev1.Resourc
61
72
if pod .Status .Phase != corev1 .PodRunning {
62
73
continue
63
74
}
75
+ if _ , ok := unavailableNodes [pod .Spec .NodeName ]; ok {
76
+ continue
77
+ }
64
78
podReqs , podLimits := v1resource .PodRequestsAndLimits (& pod )
65
79
for podReqName , podReqValue := range podReqs {
66
80
if value , ok := reqs [podReqName ]; ! ok {
0 commit comments