mirror of https://github.com/k3s-io/k3s
Merge pull request #47124 from andyxning/remove_sync_loop_health_check
Automatic merge from submit-queue (batch tested with PRs 47000, 47188, 47094, 47323, 47124) fix sync loop health check This PR will do error logging about the fall behind sync for kubelet instead of sync loop healthz checking. The reason is kubelet can not do sync loop and therefore can not update sync loop time when there is any runtime error, such as docker hung. When there is any runtime error, according to current implementation, kubelet will not do sync operation and thus kubelet's sync loop time will not be updated. This will make when there is any runtime error, kubelet will also return non 200 response status code when accessing healthz endpoint. This is contrary with #37865 which prevents kubelet from being killed when docker hangs. **Release note**: ```release-note fix sync loop health check with seperating runtime errors ``` /cc @yujuhong @Random-Liu @dchen1107pull/6/head
commit
17244ea5d9
|
@ -1812,9 +1812,12 @@ func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHand
|
|||
time.Sleep(5 * time.Second)
|
||||
continue
|
||||
}
|
||||
|
||||
kl.syncLoopMonitor.Store(kl.clock.Now())
|
||||
if !kl.syncLoopIteration(updates, handler, syncTicker.C, housekeepingTicker.C, plegCh) {
|
||||
break
|
||||
}
|
||||
kl.syncLoopMonitor.Store(kl.clock.Now())
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1852,7 +1855,6 @@ func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHand
|
|||
// containers have failed liveness checks
|
||||
func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handler SyncHandler,
|
||||
syncCh <-chan time.Time, housekeepingCh <-chan time.Time, plegCh <-chan *pleg.PodLifecycleEvent) bool {
|
||||
kl.syncLoopMonitor.Store(kl.clock.Now())
|
||||
select {
|
||||
case u, open := <-configCh:
|
||||
// Update from a config source; dispatch it to the right handler
|
||||
|
@ -1946,7 +1948,6 @@ func (kl *Kubelet) syncLoopIteration(configCh <-chan kubetypes.PodUpdate, handle
|
|||
}
|
||||
}
|
||||
}
|
||||
kl.syncLoopMonitor.Store(kl.clock.Now())
|
||||
return true
|
||||
}
|
||||
|
||||
|
|
|
@ -326,32 +326,6 @@ func newTestPods(count int) []*v1.Pod {
|
|||
|
||||
var emptyPodUIDs map[types.UID]kubetypes.SyncPodType
|
||||
|
||||
func TestSyncLoopTimeUpdate(t *testing.T) {
|
||||
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
|
||||
defer testKubelet.Cleanup()
|
||||
testKubelet.fakeCadvisor.On("MachineInfo").Return(&cadvisorapi.MachineInfo{}, nil)
|
||||
kubelet := testKubelet.kubelet
|
||||
|
||||
loopTime1 := kubelet.LatestLoopEntryTime()
|
||||
require.True(t, loopTime1.IsZero(), "Expect sync loop time to be zero")
|
||||
|
||||
// Start sync ticker.
|
||||
syncCh := make(chan time.Time, 1)
|
||||
housekeepingCh := make(chan time.Time, 1)
|
||||
plegCh := make(chan *pleg.PodLifecycleEvent)
|
||||
syncCh <- time.Now()
|
||||
kubelet.syncLoopIteration(make(chan kubetypes.PodUpdate), kubelet, syncCh, housekeepingCh, plegCh)
|
||||
loopTime2 := kubelet.LatestLoopEntryTime()
|
||||
require.False(t, loopTime2.IsZero(), "Expect sync loop time to be non-zero")
|
||||
|
||||
syncCh <- time.Now()
|
||||
kubelet.syncLoopIteration(make(chan kubetypes.PodUpdate), kubelet, syncCh, housekeepingCh, plegCh)
|
||||
loopTime3 := kubelet.LatestLoopEntryTime()
|
||||
require.True(t, loopTime3.After(loopTime1),
|
||||
"Sync Loop Time was not updated correctly. Second update timestamp %v should be greater than first update timestamp %v",
|
||||
loopTime3, loopTime1)
|
||||
}
|
||||
|
||||
func TestSyncLoopAbort(t *testing.T) {
|
||||
testKubelet := newTestKubelet(t, false /* controllerAttachDetachEnabled */)
|
||||
defer testKubelet.Cleanup()
|
||||
|
|
Loading…
Reference in New Issue