Merge pull request #80811 from liu-cong/loglevel

Lower verbosity level for some useful scheduler logs; Also add node resource info when pod is scheduled on node.
This commit is contained in:
Kubernetes Prow Robot 2019-08-08 17:57:38 -07:00 committed by GitHub
commit 2bea7a371b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 10 deletions

View File

@ -551,11 +551,12 @@ func NewPodInformer(client clientset.Interface, resyncPeriod time.Duration) core
func MakeDefaultErrorFunc(client clientset.Interface, podQueue internalqueue.SchedulingQueue, schedulerCache internalcache.Cache, stopEverything <-chan struct{}) func(pod *v1.Pod, err error) { func MakeDefaultErrorFunc(client clientset.Interface, podQueue internalqueue.SchedulingQueue, schedulerCache internalcache.Cache, stopEverything <-chan struct{}) func(pod *v1.Pod, err error) {
return func(pod *v1.Pod, err error) { return func(pod *v1.Pod, err error) {
if err == core.ErrNoNodesAvailable { if err == core.ErrNoNodesAvailable {
klog.V(4).Infof("Unable to schedule %v/%v: no nodes are registered to the cluster; waiting", pod.Namespace, pod.Name) klog.V(2).Infof("Unable to schedule %v/%v: no nodes are registered to the cluster; waiting", pod.Namespace, pod.Name)
} else { } else {
if _, ok := err.(*core.FitError); ok { if _, ok := err.(*core.FitError); ok {
klog.V(4).Infof("Unable to schedule %v/%v: no fit: %v; waiting", pod.Namespace, pod.Name, err) klog.V(2).Infof("Unable to schedule %v/%v: no fit: %v; waiting", pod.Namespace, pod.Name, err)
} else if errors.IsNotFound(err) { } else if errors.IsNotFound(err) {
klog.V(2).Infof("Unable to schedule %v/%v: possibly due to node not found: %v; waiting", pod.Namespace, pod.Name, err)
if errStatus, ok := err.(errors.APIStatus); ok && errStatus.Status().Details.Kind == "node" { if errStatus, ok := err.(errors.APIStatus); ok && errStatus.Status().Details.Kind == "node" {
nodeName := errStatus.Status().Details.Name nodeName := errStatus.Status().Details.Name
// when node is not found, We do not remove the node right away. Trying again to get // when node is not found, We do not remove the node right away. Trying again to get
@ -563,7 +564,9 @@ func MakeDefaultErrorFunc(client clientset.Interface, podQueue internalqueue.Sch
_, err := client.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{}) _, err := client.CoreV1().Nodes().Get(nodeName, metav1.GetOptions{})
if err != nil && errors.IsNotFound(err) { if err != nil && errors.IsNotFound(err) {
node := v1.Node{ObjectMeta: metav1.ObjectMeta{Name: nodeName}} node := v1.Node{ObjectMeta: metav1.ObjectMeta{Name: nodeName}}
schedulerCache.RemoveNode(&node) if err := schedulerCache.RemoveNode(&node); err != nil {
klog.V(4).Infof("Node %q is not found; failed to remove it from the cache.", node.Name)
}
} }
} }
} else { } else {

View File

@ -567,7 +567,9 @@ func (cache *schedulerCache) RemoveNode(node *v1.Node) error {
cache.moveNodeInfoToHead(node.Name) cache.moveNodeInfoToHead(node.Name)
} }
cache.nodeTree.RemoveNode(node) if err := cache.nodeTree.RemoveNode(node); err != nil {
return err
}
cache.removeNodeImageStates(node) cache.removeNodeImageStates(node)
return nil return nil
} }

View File

@ -81,7 +81,7 @@ func (nt *NodeTree) addNode(n *v1.Node) {
if na, ok := nt.tree[zone]; ok { if na, ok := nt.tree[zone]; ok {
for _, nodeName := range na.nodes { for _, nodeName := range na.nodes {
if nodeName == n.Name { if nodeName == n.Name {
klog.Warningf("node %v already exist in the NodeTree", n.Name) klog.Warningf("node %q already exist in the NodeTree", n.Name)
return return
} }
} }
@ -90,7 +90,7 @@ func (nt *NodeTree) addNode(n *v1.Node) {
nt.zones = append(nt.zones, zone) nt.zones = append(nt.zones, zone)
nt.tree[zone] = &nodeArray{nodes: []string{n.Name}, lastIndex: 0} nt.tree[zone] = &nodeArray{nodes: []string{n.Name}, lastIndex: 0}
} }
klog.V(5).Infof("Added node %v in group %v to NodeTree", n.Name, zone) klog.V(2).Infof("Added node %q in group %q to NodeTree", n.Name, zone)
nt.numNodes++ nt.numNodes++
} }
@ -110,14 +110,14 @@ func (nt *NodeTree) removeNode(n *v1.Node) error {
if len(na.nodes) == 0 { if len(na.nodes) == 0 {
nt.removeZone(zone) nt.removeZone(zone)
} }
klog.V(5).Infof("Removed node %v in group %v from NodeTree", n.Name, zone) klog.V(2).Infof("Removed node %q in group %q from NodeTree", n.Name, zone)
nt.numNodes-- nt.numNodes--
return nil return nil
} }
} }
} }
klog.Errorf("Node %v in group %v was not found", n.Name, zone) klog.Errorf("Node %q in group %q was not found", n.Name, zone)
return fmt.Errorf("node %v in group %v was not found", n.Name, zone) return fmt.Errorf("node %q in group %q was not found", n.Name, zone)
} }
// removeZone removes a zone from tree. // removeZone removes a zone from tree.

View File

@ -606,7 +606,12 @@ func (sched *Scheduler) scheduleOne() {
fwk.RunUnreservePlugins(pluginContext, assumedPod, scheduleResult.SuggestedHost) fwk.RunUnreservePlugins(pluginContext, assumedPod, scheduleResult.SuggestedHost)
sched.recordSchedulingFailure(assumedPod, err, SchedulerError, fmt.Sprintf("Binding rejected: %v", err)) sched.recordSchedulingFailure(assumedPod, err, SchedulerError, fmt.Sprintf("Binding rejected: %v", err))
} else { } else {
klog.V(2).Infof("pod %v/%v is bound successfully on node %v, %d nodes evaluated, %d nodes were found feasible", assumedPod.Namespace, assumedPod.Name, scheduleResult.SuggestedHost, scheduleResult.EvaluatedNodes, scheduleResult.FeasibleNodes) // Calculating nodeResourceString can be heavy. Avoid it if klog verbosity is below 2.
if klog.V(2) {
node, _ := sched.Cache().GetNodeInfo(scheduleResult.SuggestedHost)
klog.Infof("pod %v/%v is bound successfully on node %q, %d nodes evaluated, %d nodes were found feasible. Bound node resource: %q.", assumedPod.Namespace, assumedPod.Name, scheduleResult.SuggestedHost, scheduleResult.EvaluatedNodes, scheduleResult.FeasibleNodes, nodeResourceString(node))
}
metrics.PodScheduleSuccesses.Inc() metrics.PodScheduleSuccesses.Inc()
// Run "postbind" plugins. // Run "postbind" plugins.
@ -614,3 +619,15 @@ func (sched *Scheduler) scheduleOne() {
} }
}() }()
} }
// nodeResourceString returns a string representation of node resources.
func nodeResourceString(n *v1.Node) string {
if n == nil {
return "N/A"
}
return fmt.Sprintf("Capacity: %s; Allocatable: %s.", resourceString(&n.Status.Capacity), resourceString(&n.Status.Allocatable))
}
func resourceString(r *v1.ResourceList) string {
return fmt.Sprintf("CPU<%s>|Memory<%s>|Pods<%s>|StorageEphemeral<%s>", r.Cpu().String(), r.Memory().String(), r.Pods().String(), r.StorageEphemeral().String())
}