diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index a04e48f1e00..5a58f208460 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -20,6 +20,7 @@ import ( "context" "crypto/tls" "fmt" + "math" "net" "net/http" "net/url" @@ -1781,12 +1782,22 @@ func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHand housekeepingTicker := time.NewTicker(housekeepingPeriod) defer housekeepingTicker.Stop() plegCh := kl.pleg.Watch() + const ( + base = 100 * time.Millisecond + max = 5 * time.Second + factor = 2 + ) + duration := base for { if rs := kl.runtimeState.runtimeErrors(); len(rs) != 0 { glog.Infof("skipping pod synchronization - %v", rs) - time.Sleep(5 * time.Second) + // exponential backoff + time.Sleep(duration) + duration = time.Duration(math.Min(float64(max), factor*float64(duration))) continue } + // reset backoff if we have a success + duration = base kl.syncLoopMonitor.Store(kl.clock.Now()) if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) {