Merge pull request #14413 from gmarek/latency-bug

Functionally revert #12894
This commit is contained in:
Eric Tune 2015-09-23 11:00:30 -07:00
commit d23e3504e4
2 changed files with 18 additions and 59 deletions

View File

@ -2508,65 +2508,32 @@ func GetPhase(spec *api.PodSpec, info []api.ContainerStatus) api.PodPhase {
} }
} }
func readyPodCondition(isPodReady bool, reason, message string, existingStatus *api.PodStatus) []api.PodCondition { // Disabled LastProbeTime/LastTranitionTime for Pods to avoid constantly sending pod status
currentTime := unversioned.Now() // update to the apiserver. See http://issues.k8s.io/14273. Functional revert of a PR #12894
condition := api.PodCondition{
Type: api.PodReady,
}
if isPodReady {
condition.Status = api.ConditionTrue
} else {
condition.Status = api.ConditionFalse
}
condition.LastProbeTime = currentTime
condition.Reason = reason
condition.Message = message
if existingStatus != nil {
if api.IsPodReadyConditionTrue(*existingStatus) != isPodReady {
// condition has transitioned, update transition time.
condition.LastTransitionTime = currentTime
} else {
// retain the existing transition time.
existingCondition := api.GetPodReadyCondition(*existingStatus)
if existingCondition != nil {
condition.LastTransitionTime = existingCondition.LastTransitionTime
}
}
}
return []api.PodCondition{condition}
}
// getPodReadyCondition returns ready condition if all containers in a pod are ready, else it returns an unready condition. // getPodReadyCondition returns ready condition if all containers in a pod are ready, else it returns an unready condition.
func getPodReadyCondition(spec *api.PodSpec, containerStatuses []api.ContainerStatus, existingStatus *api.PodStatus) []api.PodCondition { func getPodReadyCondition(spec *api.PodSpec, containerStatuses []api.ContainerStatus, existingStatus *api.PodStatus) []api.PodCondition {
// Find if all containers are ready or not. ready := []api.PodCondition{{
Type: api.PodReady,
Status: api.ConditionTrue,
}}
notReady := []api.PodCondition{{
Type: api.PodReady,
Status: api.ConditionFalse,
}}
if containerStatuses == nil { if containerStatuses == nil {
return readyPodCondition(false, "UnknownContainerStatuses", "", existingStatus) return notReady
} }
unknownContainers := []string{}
unreadyContainers := []string{}
for _, container := range spec.Containers { for _, container := range spec.Containers {
if containerStatus, ok := api.GetContainerStatus(containerStatuses, container.Name); ok { if containerStatus, ok := api.GetContainerStatus(containerStatuses, container.Name); ok {
if !containerStatus.Ready { if !containerStatus.Ready {
unreadyContainers = append(unreadyContainers, container.Name) return notReady
} }
} else { } else {
unknownContainers = append(unknownContainers, container.Name) return notReady
} }
} }
unreadyMessages := []string{} return ready
if len(unknownContainers) > 0 {
unreadyMessages = append(unreadyMessages, fmt.Sprintf("containers with unknown status: %s", unknownContainers))
}
if len(unreadyContainers) > 0 {
unreadyMessages = append(unreadyMessages, fmt.Sprintf("containers with unready status: %s", unreadyContainers))
}
unreadyMessage := strings.Join(unreadyMessages, ", ")
if unreadyMessage != "" {
// return unready status.
return readyPodCondition(false, fmt.Sprint("ContainersNotReady"), unreadyMessage, existingStatus)
}
// return ready status.
return readyPodCondition(true, "", "", existingStatus)
} }
// By passing the pod directly, this method avoids pod lookup, which requires // By passing the pod directly, this method avoids pod lookup, which requires
@ -2580,8 +2547,7 @@ func (kl *Kubelet) generatePodStatus(pod *api.Pod) (api.PodStatus, error) {
podFullName := kubecontainer.GetPodFullName(pod) podFullName := kubecontainer.GetPodFullName(pod)
glog.V(3).Infof("Generating status for %q", podFullName) glog.V(3).Infof("Generating status for %q", podFullName)
existingStatus, hasExistingStatus := kl.statusManager.GetPodStatus(pod.UID) if existingStatus, hasExistingStatus := kl.statusManager.GetPodStatus(pod.UID); hasExistingStatus {
if hasExistingStatus {
// This is a hacky fix to ensure container restart counts increment // This is a hacky fix to ensure container restart counts increment
// monotonically. Normally, we should not modify given pod. In this // monotonically. Normally, we should not modify given pod. In this
// case, we check if there are cached status for this pod, and update // case, we check if there are cached status for this pod, and update
@ -2633,11 +2599,7 @@ func (kl *Kubelet) generatePodStatus(pod *api.Pod) (api.PodStatus, error) {
} }
} }
} }
if hasExistingStatus { podStatus.Conditions = append(podStatus.Conditions, getPodReadyCondition(spec, podStatus.ContainerStatuses, nil /* unused */)...)
podStatus.Conditions = append(podStatus.Conditions, getPodReadyCondition(spec, podStatus.ContainerStatuses, &existingStatus)...)
} else {
podStatus.Conditions = append(podStatus.Conditions, getPodReadyCondition(spec, podStatus.ContainerStatuses, nil)...)
}
if !kl.standaloneMode { if !kl.standaloneMode {
hostIP, err := kl.GetHostIP() hostIP, err := kl.GetHostIP()

View File

@ -1757,11 +1757,8 @@ func getNotReadyStatus(cName string) api.ContainerStatus {
} }
func getReadyCondition(status api.ConditionStatus, transitionTime unversioned.Time, reason, message string) []api.PodCondition { func getReadyCondition(status api.ConditionStatus, transitionTime unversioned.Time, reason, message string) []api.PodCondition {
return []api.PodCondition{{ return []api.PodCondition{{
Type: api.PodReady, Type: api.PodReady,
Status: status, Status: status,
LastTransitionTime: transitionTime,
Reason: reason,
Message: message,
}} }}
} }