diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 7772489b8a8..de7eec50304 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1393,6 +1393,11 @@ func (kl *Kubelet) syncPod(o syncPodOptions) error { return errOuter } + // If the network plugin is not ready, only start the pod if it uses the host network + if rs := kl.runtimeState.networkErrors(); len(rs) != 0 && !podUsesHostNetwork(pod) { + return fmt.Errorf("network is not ready: %v", rs) + } + // Create Cgroups for the pod and apply resource parameters // to them if cgroup-per-qos flag is enabled. pcm := kl.containerManager.NewPodContainerManager() @@ -1644,7 +1649,7 @@ func (kl *Kubelet) syncLoop(updates <-chan kubetypes.PodUpdate, handler SyncHand defer housekeepingTicker.Stop() plegCh := kl.pleg.Watch() for { - if rs := kl.runtimeState.errors(); len(rs) != 0 { + if rs := kl.runtimeState.runtimeErrors(); len(rs) != 0 { glog.Infof("skipping pod synchronization - %v", rs) time.Sleep(5 * time.Second) continue diff --git a/pkg/kubelet/kubelet_node_status.go b/pkg/kubelet/kubelet_node_status.go index 8d3b8cb47d0..981762ae05f 100644 --- a/pkg/kubelet/kubelet_node_status.go +++ b/pkg/kubelet/kubelet_node_status.go @@ -577,7 +577,8 @@ func (kl *Kubelet) setNodeReadyCondition(node *api.Node) { // ref: https://github.com/kubernetes/kubernetes/issues/16961 currentTime := unversioned.NewTime(kl.clock.Now()) var newNodeReadyCondition api.NodeCondition - if rs := kl.runtimeState.errors(); len(rs) == 0 { + rs := append(kl.runtimeState.runtimeErrors(), kl.runtimeState.networkErrors()...) + if len(rs) == 0 { newNodeReadyCondition = api.NodeCondition{ Type: api.NodeReady, Status: api.ConditionTrue, diff --git a/pkg/kubelet/runonce_test.go b/pkg/kubelet/runonce_test.go index 6e595ad9c72..6d7d2664494 100644 --- a/pkg/kubelet/runonce_test.go +++ b/pkg/kubelet/runonce_test.go @@ -83,6 +83,7 @@ func TestRunOnce(t *testing.T) { kubeClient: &fake.Clientset{}, hostname: testKubeletHostname, nodeName: testKubeletHostname, + runtimeState: newRuntimeState(time.Second), } kb.containerManager = cm.NewStubContainerManager() diff --git a/pkg/kubelet/runtime.go b/pkg/kubelet/runtime.go index 90a83898a31..6cb74fe364c 100644 --- a/pkg/kubelet/runtime.go +++ b/pkg/kubelet/runtime.go @@ -68,16 +68,13 @@ func (s *runtimeState) setInitError(err error) { s.initError = err } -func (s *runtimeState) errors() []string { +func (s *runtimeState) runtimeErrors() []string { s.RLock() defer s.RUnlock() var ret []string if s.initError != nil { ret = append(ret, s.initError.Error()) } - if s.networkError != nil { - ret = append(ret, s.networkError.Error()) - } if !s.lastBaseRuntimeSync.Add(s.baseRuntimeSyncThreshold).After(time.Now()) { ret = append(ret, "container runtime is down") } @@ -87,6 +84,16 @@ func (s *runtimeState) errors() []string { return ret } +func (s *runtimeState) networkErrors() []string { + s.RLock() + defer s.RUnlock() + var ret []string + if s.networkError != nil { + ret = append(ret, s.networkError.Error()) + } + return ret +} + func newRuntimeState( runtimeSyncThreshold time.Duration, ) *runtimeState {