code: func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHandler) {
  	klog.Info("Starting kubelet main sync loop.")
  	// The syncTicker wakes up kubelet to checks if there are any pod workers
  	// that need to be sync'd. A one-second period is sufficient because the
  	// sync interval is defaulted to 10s.
  	syncTicker := time.NewTicker(time.Second)
  	defer syncTicker.Stop()
  	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 err := kl.runtimeState.runtimeErrors(); err != nil {
  			klog.Infof("skipping pod synchronization - %v", err)
  			// 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) {
  			break
  		}
  		kl.syncLoopMonitor.Store(kl.clock.Now())
  	}
  }
docs: // syncLoop is the main loop for processing changes. It watches for changes from
  // three channels (file, apiserver, and http) and creates a union of them. For
  // any new change seen, will run a sync against desired state and running state. If
  // no changes are seen to the configuration, will synchronize the last known desired
  // state every sync-frequency seconds. Never returns.