From 78ad32a538ad06f6dd484545df0bd06a499e4908 Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Sat, 16 May 2015 19:37:13 -0400 Subject: [PATCH 1/2] Endpoints controller is logging too much Pods not having an IP yet or pods that don't have a port aren't v(0) log items, since the former is usually temporary and the latter has nothing actionable for an admit. --- pkg/service/endpoints_controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/service/endpoints_controller.go b/pkg/service/endpoints_controller.go index 857fe3edfb2..166760246b8 100644 --- a/pkg/service/endpoints_controller.go +++ b/pkg/service/endpoints_controller.go @@ -312,11 +312,11 @@ func (e *EndpointController) syncService(key string) { portProto := servicePort.Protocol portNum, err := findPort(pod, servicePort) if err != nil { - glog.Errorf("Failed to find port for service %s/%s: %v", service.Namespace, service.Name, err) + glog.V(4).Infof("Failed to find port for service %s/%s: %v", service.Namespace, service.Name, err) continue } if len(pod.Status.PodIP) == 0 { - glog.Errorf("Failed to find an IP for pod %s/%s", pod.Namespace, pod.Name) + glog.V(4).Infof("Failed to find an IP for pod %s/%s", pod.Namespace, pod.Name) continue } From d00f705652e2f45476c209adf0b3f1c642cf84ca Mon Sep 17 00:00:00 2001 From: Clayton Coleman Date: Sat, 16 May 2015 19:46:50 -0400 Subject: [PATCH 2/2] Tone down scheduler logging Having no nodes in the cluster is unusual and is likely a test environment, and when a pod is deleted there is no need to log information about our inability to schedule it. --- plugin/pkg/scheduler/factory/factory.go | 11 +++++++++-- plugin/pkg/scheduler/generic_scheduler.go | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/plugin/pkg/scheduler/factory/factory.go b/plugin/pkg/scheduler/factory/factory.go index 808bdb90ab7..87515b45cdb 100644 --- a/plugin/pkg/scheduler/factory/factory.go +++ b/plugin/pkg/scheduler/factory/factory.go @@ -24,6 +24,7 @@ import ( "time" "github.com/GoogleCloudPlatform/kubernetes/pkg/api" + "github.com/GoogleCloudPlatform/kubernetes/pkg/api/errors" "github.com/GoogleCloudPlatform/kubernetes/pkg/client" "github.com/GoogleCloudPlatform/kubernetes/pkg/client/cache" "github.com/GoogleCloudPlatform/kubernetes/pkg/controller/framework" @@ -244,7 +245,11 @@ func (factory *ConfigFactory) createServiceLW() *cache.ListWatch { func (factory *ConfigFactory) makeDefaultErrorFunc(backoff *podBackoff, podQueue *cache.FIFO) func(pod *api.Pod, err error) { return func(pod *api.Pod, err error) { - glog.Errorf("Error scheduling %v %v: %v; retrying", pod.Namespace, pod.Name, err) + if err == scheduler.ErrNoNodesAvailable { + glog.V(4).Infof("Unable to schedule %v %v: no nodes are registered to the cluster; waiting", pod.Namespace, pod.Name) + } else { + glog.Errorf("Error scheduling %v %v: %v; retrying", pod.Namespace, pod.Name, err) + } backoff.gc() // Retry asynchronously. // Note that this is extremely rudimentary and we need a more real error handling path. @@ -257,7 +262,9 @@ func (factory *ConfigFactory) makeDefaultErrorFunc(backoff *podBackoff, podQueue pod = &api.Pod{} err := factory.Client.Get().Namespace(podNamespace).Resource("pods").Name(podID).Do().Into(pod) if err != nil { - glog.Errorf("Error getting pod %v for retry: %v; abandoning", podID, err) + if !errors.IsNotFound(err) { + glog.Errorf("Error getting pod %v for retry: %v; abandoning", podID, err) + } return } if pod.Spec.Host == "" { diff --git a/plugin/pkg/scheduler/generic_scheduler.go b/plugin/pkg/scheduler/generic_scheduler.go index 28985220fa3..e1e67d4df25 100644 --- a/plugin/pkg/scheduler/generic_scheduler.go +++ b/plugin/pkg/scheduler/generic_scheduler.go @@ -36,6 +36,8 @@ type FitError struct { FailedPredicates FailedPredicateMap } +var ErrNoNodesAvailable = fmt.Errorf("no nodes available to schedule pods") + // implementation of the error interface func (f *FitError) Error() string { output := fmt.Sprintf("failed to find fit for pod: %v", f.Pod) @@ -59,7 +61,7 @@ func (g *genericScheduler) Schedule(pod *api.Pod, minionLister algorithm.MinionL return "", err } if len(minions.Items) == 0 { - return "", fmt.Errorf("no minions available to schedule pods") + return "", ErrNoNodesAvailable } filteredNodes, failedPredicateMap, err := findNodesThatFit(pod, g.pods, g.predicates, minions)