From 343240d559a0f4dbf6c7c4b8e29ce5b6109f83cb Mon Sep 17 00:00:00 2001 From: Yu-Ju Hong Date: Tue, 5 Jan 2016 14:20:26 -0800 Subject: [PATCH] Fix container restarts caused by kubelet restarts There has been a recent regression causing kubelet to assume no containers are running for the pod if kubelet has not seen the pod before. This would cause all containers to be restarted after kubelet gets restarted. This change fixes the bug. --- pkg/kubelet/kubelet.go | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 7bc7d5c9a97..a339f0ac689 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1709,30 +1709,28 @@ func (kl *Kubelet) syncPod(pod *api.Pod, mirrorPod *api.Pod, runningPod kubecont var apiPodStatus api.PodStatus var podStatus *kubecontainer.PodStatus + // Always generate the kubecontainer.PodStatus to know whether there are + // running containers associated with the pod. + podStatusPtr, apiPodStatusPtr, err := kl.containerRuntime.GetPodStatusAndAPIPodStatus(pod) + if err != nil { + glog.Errorf("Unable to get status for pod %q: %v", format.Pod(pod), err) + return err + } + apiPodStatus = *apiPodStatusPtr + podStatus = podStatusPtr + if updateType == kubetypes.SyncPodCreate { // This is the first time we are syncing the pod. Record the latency // since kubelet first saw the pod if firstSeenTime is set. if !firstSeenTime.IsZero() { metrics.PodWorkerStartLatency.Observe(metrics.SinceInMicroseconds(firstSeenTime)) } - + // kubelet may have just been restarted. Re-use the last known + // apiPodStatus. apiPodStatus = pod.Status apiPodStatus.StartTime = &unversioned.Time{Time: start} kl.statusManager.SetPodStatus(pod, apiPodStatus) - podStatus = &kubecontainer.PodStatus{ - ID: pod.UID, - Name: pod.Name, - Namespace: pod.Namespace, - } - glog.V(3).Infof("Not generating pod status for new pod %q", format.Pod(pod)) - } else { - podStatusPtr, apiPodStatusPtr, err := kl.containerRuntime.GetPodStatusAndAPIPodStatus(pod) - if err != nil { - glog.Errorf("Unable to get status for pod %q: %v", format.Pod(pod), err) - return err - } - apiPodStatus = *apiPodStatusPtr - podStatus = podStatusPtr + glog.V(3).Infof("Reusing api pod status for new pod %q", format.Pod(pod)) } pullSecrets, err := kl.getPullSecretsForPod(pod)