Merge pull request #101960 from knight42/fix/deflake-metrics-proxy

Deflake tests that need to grab metrics from controller-manager or scheduler
This commit is contained in:
Kubernetes Prow Robot 2021-05-27 03:40:23 -07:00 committed by GitHub
commit c495744436
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -34,39 +34,54 @@ import (
) )
type componentInfo struct { type componentInfo struct {
Name string
Port int Port int
IP string IP string
} }
// SetupMetricsProxy creates a nginx Pod to expose metrics from the secure port of kube-scheduler and kube-controller-manager in tests. // SetupMetricsProxy creates a nginx Pod to expose metrics from the secure port of kube-scheduler and kube-controller-manager in tests.
func SetupMetricsProxy(c clientset.Interface) error { func SetupMetricsProxy(c clientset.Interface) error {
var infos []componentInfo
// The component pods might take some time to show up.
err := wait.PollImmediate(time.Second*5, time.Minute*5, func() (bool, error) {
podList, err := c.CoreV1().Pods(metav1.NamespaceSystem).List(context.TODO(), metav1.ListOptions{}) podList, err := c.CoreV1().Pods(metav1.NamespaceSystem).List(context.TODO(), metav1.ListOptions{})
if err != nil { if err != nil {
return err return false, fmt.Errorf("list pods in ns %s: %w", metav1.NamespaceSystem, err)
} }
var infos []componentInfo var foundComponents []componentInfo
for _, pod := range podList.Items { for _, pod := range podList.Items {
if len(pod.Status.PodIP) == 0 {
continue
}
switch { switch {
case strings.HasPrefix(pod.Name, "kube-scheduler-"): case strings.HasPrefix(pod.Name, "kube-scheduler-"):
infos = append(infos, componentInfo{ foundComponents = append(foundComponents, componentInfo{
Name: pod.Name,
Port: kubeSchedulerPort, Port: kubeSchedulerPort,
IP: pod.Status.PodIP, IP: pod.Status.PodIP,
}) })
case strings.HasPrefix(pod.Name, "kube-controller-manager-"): case strings.HasPrefix(pod.Name, "kube-controller-manager-"):
infos = append(infos, componentInfo{ foundComponents = append(foundComponents, componentInfo{
Name: pod.Name,
Port: kubeControllerManagerPort, Port: kubeControllerManagerPort,
IP: pod.Status.PodIP, IP: pod.Status.PodIP,
}) })
} }
if len(infos) == 2 {
break
} }
if len(foundComponents) != 2 {
klog.Infof("Only %d components found. Will retry.", len(foundComponents))
klog.Infof("Found components: %v", foundComponents)
return false, nil
} }
if len(infos) == 0 { infos = foundComponents
klog.Warningf("Can't find any pods in namespace %s to grab metrics from", metav1.NamespaceSystem) return true, nil
return nil })
if err != nil {
return fmt.Errorf("missing component pods: %w", err)
} }
klog.Infof("Found components: %v", infos)
const name = metricsProxyPod const name = metricsProxyPod
_, err = c.CoreV1().ServiceAccounts(metav1.NamespaceSystem).Create(context.TODO(), &v1.ServiceAccount{ _, err = c.CoreV1().ServiceAccounts(metav1.NamespaceSystem).Create(context.TODO(), &v1.ServiceAccount{
ObjectMeta: metav1.ObjectMeta{Name: name}, ObjectMeta: metav1.ObjectMeta{Name: name},