@@ -19,6 +19,7 @@ package metrics
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "regexp"
22
23
"sync"
23
24
"time"
24
25
@@ -27,7 +28,6 @@ import (
27
28
"k8s.io/apimachinery/pkg/util/wait"
28
29
clientset "k8s.io/client-go/kubernetes"
29
30
e2epod "k8s.io/kubernetes/test/e2e/framework/pod"
30
- "k8s.io/kubernetes/test/e2e/system"
31
31
32
32
"k8s.io/klog/v2"
33
33
)
@@ -61,38 +61,48 @@ type Grabber struct {
61
61
grabFromKubelets bool
62
62
grabFromScheduler bool
63
63
grabFromClusterAutoscaler bool
64
- masterName string
65
- registeredMaster bool
64
+ kubeScheduler string
65
+ kubeControllerManager string
66
66
waitForControllerManagerReadyOnce sync.Once
67
67
}
68
68
69
69
// NewMetricsGrabber returns new metrics which are initialized.
70
70
func NewMetricsGrabber (c clientset.Interface , ec clientset.Interface , kubelets bool , scheduler bool , controllers bool , apiServer bool , clusterAutoscaler bool ) (* Grabber , error ) {
71
- registeredMaster := false
72
- masterName := ""
73
- nodeList , err := c .CoreV1 ().Nodes ().List (context .TODO (), metav1.ListOptions {})
71
+
72
+ kubeScheduler := ""
73
+ kubeControllerManager := ""
74
+
75
+ regKubeScheduler := regexp .MustCompile ("kube-scheduler-.*" )
76
+ regKubeControllerManager := regexp .MustCompile ("kube-controller-manager-.*" )
77
+
78
+ podList , err := c .CoreV1 ().Pods (metav1 .NamespaceSystem ).List (context .TODO (), metav1.ListOptions {})
74
79
if err != nil {
75
80
return nil , err
76
81
}
77
- if len (nodeList .Items ) < 1 {
78
- klog .Warning ("Can't find any Nodes in the API server to grab metrics from" )
82
+ if len (podList .Items ) < 1 {
83
+ klog .Warningf ("Can't find any pods in namespace %s to grab metrics from" , metav1 . NamespaceSystem )
79
84
}
80
- for _ , node := range nodeList .Items {
81
- if system .DeprecatedMightBeMasterNode (node .Name ) {
82
- registeredMaster = true
83
- masterName = node .Name
85
+ for _ , pod := range podList .Items {
86
+ if regKubeScheduler .MatchString (pod .Name ) {
87
+ kubeScheduler = pod .Name
88
+ }
89
+ if regKubeControllerManager .MatchString (pod .Name ) {
90
+ kubeControllerManager = pod .Name
91
+ }
92
+ if kubeScheduler != "" && kubeControllerManager != "" {
84
93
break
85
94
}
86
95
}
87
- if ! registeredMaster {
96
+ if kubeScheduler == "" {
88
97
scheduler = false
98
+ klog .Warningf ("Can't find kube-scheduler pod. Grabbing metrics from kube-scheduler is disabled." )
99
+ }
100
+ if kubeControllerManager == "" {
89
101
controllers = false
90
- clusterAutoscaler = ec != nil
91
- if clusterAutoscaler {
92
- klog .Warningf ("Master node is not registered. Grabbing metrics from Scheduler, ControllerManager is disabled." )
93
- } else {
94
- klog .Warningf ("Master node is not registered. Grabbing metrics from Scheduler, ControllerManager and ClusterAutoscaler is disabled." )
95
- }
102
+ klog .Warningf ("Can't find kube-controller-manager pod. Grabbing metrics from kube-controller-manager is disabled." )
103
+ }
104
+ if ec == nil {
105
+ klog .Warningf ("Did not receive an external client interface. Grabbing metrics from ClusterAutoscaler is disabled." )
96
106
}
97
107
98
108
return & Grabber {
@@ -103,14 +113,14 @@ func NewMetricsGrabber(c clientset.Interface, ec clientset.Interface, kubelets b
103
113
grabFromKubelets : kubelets ,
104
114
grabFromScheduler : scheduler ,
105
115
grabFromClusterAutoscaler : clusterAutoscaler ,
106
- masterName : masterName ,
107
- registeredMaster : registeredMaster ,
116
+ kubeScheduler : kubeScheduler ,
117
+ kubeControllerManager : kubeControllerManager ,
108
118
}, nil
109
119
}
110
120
111
- // HasRegisteredMaster returns if metrics grabber was able to find a master node
112
- func (g * Grabber ) HasRegisteredMaster () bool {
113
- return g .registeredMaster
121
+ // HasControlPlanePods returns true if metrics grabber was able to find control-plane pods
122
+ func (g * Grabber ) HasControlPlanePods () bool {
123
+ return g .kubeScheduler != "" && g . kubeControllerManager != ""
114
124
}
115
125
116
126
// GrabFromKubelet returns metrics from kubelet
@@ -139,10 +149,10 @@ func (g *Grabber) grabFromKubeletInternal(nodeName string, kubeletPort int) (Kub
139
149
140
150
// GrabFromScheduler returns metrics from scheduler
141
151
func (g * Grabber ) GrabFromScheduler () (SchedulerMetrics , error ) {
142
- if ! g . registeredMaster {
143
- return SchedulerMetrics {}, fmt .Errorf ("Master's Kubelet is not registered. Skipping Scheduler's metrics gathering" )
152
+ if g . kubeScheduler == "" {
153
+ return SchedulerMetrics {}, fmt .Errorf ("kube-scheduler pod is not registered. Skipping Scheduler's metrics gathering" )
144
154
}
145
- output , err := g .getMetricsFromPod (g .client , fmt . Sprintf ( "%v-%v" , "kube-scheduler" , g . masterName ) , metav1 .NamespaceSystem , insecureSchedulerPort )
155
+ output , err := g .getMetricsFromPod (g .client , g . kubeScheduler , metav1 .NamespaceSystem , insecureSchedulerPort )
146
156
if err != nil {
147
157
return SchedulerMetrics {}, err
148
158
}
@@ -151,8 +161,8 @@ func (g *Grabber) GrabFromScheduler() (SchedulerMetrics, error) {
151
161
152
162
// GrabFromClusterAutoscaler returns metrics from cluster autoscaler
153
163
func (g * Grabber ) GrabFromClusterAutoscaler () (ClusterAutoscalerMetrics , error ) {
154
- if ! g .registeredMaster && g .externalClient == nil {
155
- return ClusterAutoscalerMetrics {}, fmt .Errorf ("Master's Kubelet is not registered . Skipping ClusterAutoscaler's metrics gathering" )
164
+ if ! g .HasControlPlanePods () && g .externalClient == nil {
165
+ return ClusterAutoscalerMetrics {}, fmt .Errorf ("Did not find control-plane pods . Skipping ClusterAutoscaler's metrics gathering" )
156
166
}
157
167
var client clientset.Interface
158
168
var namespace string
@@ -172,12 +182,12 @@ func (g *Grabber) GrabFromClusterAutoscaler() (ClusterAutoscalerMetrics, error)
172
182
173
183
// GrabFromControllerManager returns metrics from controller manager
174
184
func (g * Grabber ) GrabFromControllerManager () (ControllerManagerMetrics , error ) {
175
- if ! g . registeredMaster {
176
- return ControllerManagerMetrics {}, fmt .Errorf ("Master's Kubelet is not registered. Skipping ControllerManager's metrics gathering" )
185
+ if g . kubeControllerManager == "" {
186
+ return ControllerManagerMetrics {}, fmt .Errorf ("kube-controller-manager pod is not registered. Skipping ControllerManager's metrics gathering" )
177
187
}
178
188
179
189
var err error
180
- podName := fmt . Sprintf ( "%v-%v" , "kube-controller-manager" , g . masterName )
190
+ podName := g . kubeControllerManager
181
191
g .waitForControllerManagerReadyOnce .Do (func () {
182
192
if readyErr := e2epod .WaitForPodsReady (g .client , metav1 .NamespaceSystem , podName , 0 ); readyErr != nil {
183
193
err = fmt .Errorf ("error waiting for controller manager pod to be ready: %w" , readyErr )
0 commit comments