From 36bccb5d80e49c25147186a6e12f0fbe639f678f Mon Sep 17 00:00:00 2001 From: Darren Shepherd Date: Sat, 23 Feb 2019 22:18:59 -0700 Subject: [PATCH] Alleviate race between scheduler and kubelet If the scheduler learns of a node change and schedules based on it before the kubelet learns of the node change, the pod will fail. --- pkg/kubelet/lifecycle/predicate.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pkg/kubelet/lifecycle/predicate.go b/pkg/kubelet/lifecycle/predicate.go index 04eab48ffb..b55f2cd262 100644 --- a/pkg/kubelet/lifecycle/predicate.go +++ b/pkg/kubelet/lifecycle/predicate.go @@ -18,6 +18,7 @@ package lifecycle import ( "fmt" + "time" "k8s.io/klog" @@ -55,6 +56,19 @@ func NewPredicateAdmitHandler(getNodeAnyWayFunc getNodeAnyWayFuncType, admission } func (w *predicateAdmitHandler) Admit(attrs *PodAdmitAttributes) PodAdmitResult { + result := w.admit(attrs) + for i := 0; i < 10; i++ { + if result.Admit { + break + } + time.Sleep(time.Second) + result = w.admit(attrs) + } + + return result +} + +func (w *predicateAdmitHandler) admit(attrs *PodAdmitAttributes) PodAdmitResult { node, err := w.getNodeAnyWayFunc() if err != nil { klog.Errorf("Cannot get Node info: %v", err)