diff --git a/pkg/cloudprovider/nodecontroller/nodecontroller.go b/pkg/cloudprovider/nodecontroller/nodecontroller.go index 55510ebfb26..98c7e07d710 100644 --- a/pkg/cloudprovider/nodecontroller/nodecontroller.go +++ b/pkg/cloudprovider/nodecontroller/nodecontroller.go @@ -424,7 +424,7 @@ func (nc *NodeController) recordNodeEvent(node *api.Node, event string) { glog.V(2).Infof("Recording %s event message for node %s", event, node.Name) // TODO: This requires a transaction, either both node status is updated // and event is recorded or neither should happen, see issue #6055. - nc.recorder.Eventf(ref, event, "Node %s is now %s", node.Name, event) + nc.recorder.Eventf(ref, event, "Node %s status is now: %s", node.Name, event) } // For a given node checks its conditions and tries to update it. Returns grace period to which given node @@ -611,15 +611,9 @@ func (nc *NodeController) monitorNodeStatus() error { } } - // Report node events. - if readyCondition.Status == api.ConditionTrue && lastReadyCondition.Status != api.ConditionTrue { - nc.recordNodeEvent(node, "ready") - } - if readyCondition.Status == api.ConditionFalse && lastReadyCondition.Status != api.ConditionFalse { - nc.recordNodeEvent(node, "not_ready") - } - if readyCondition.Status == api.ConditionUnknown && lastReadyCondition.Status != api.ConditionUnknown { - nc.recordNodeEvent(node, "unknown") + // Report node event. + if readyCondition.Status != api.ConditionTrue && lastReadyCondition.Status == api.ConditionTrue { + nc.recordNodeEvent(node, "NodeNotReady") } } } diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 3293015ce78..52a1fba9db3 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -1716,22 +1716,11 @@ func (kl *Kubelet) updateNodeStatus() error { return fmt.Errorf("Update node status exceeds retry count") } -func (kl *Kubelet) recordNodeOnlineEvent() { +func (kl *Kubelet) recordNodeStatusEvent(event string) { + glog.V(2).Infof("Recording %s event message for node %s", event, kl.hostname) // TODO: This requires a transaction, either both node status is updated // and event is recorded or neither should happen, see issue #6055. - kl.recorder.Eventf(kl.nodeRef, "online", "Node %s is now online", kl.hostname) -} - -func (kl *Kubelet) recordNodeSchedulableEvent() { - // TODO: This requires a transaction, either both node status is updated - // and event is recorded or neither should happen, see issue #6055. - kl.recorder.Eventf(kl.nodeRef, "schedulable", "Node %s is now schedulable", kl.hostname) -} - -func (kl *Kubelet) recordNodeUnschedulableEvent() { - // TODO: This requires a transaction, either both node status is updated - // and event is recorded or neither should happen, see issue #6055. - kl.recorder.Eventf(kl.nodeRef, "unschedulable", "Node %s is now unschedulable", kl.hostname) + kl.recorder.Eventf(kl.nodeRef, event, "Node %s status is now: %s", kl.hostname, event) } // Maintains Node.Spec.Unschedulable value from previous run of tryUpdateNodeStatus() @@ -1798,9 +1787,10 @@ func (kl *Kubelet) tryUpdateNodeStatus() error { }() currentTime := util.Now() - var newCondition api.NodeCondition + var newNodeReadyCondition api.NodeCondition + var oldNodeReadyConditionStatus api.ConditionStatus if containerRuntimeUp && networkConfigured { - newCondition = api.NodeCondition{ + newNodeReadyCondition = api.NodeCondition{ Type: api.NodeReady, Status: api.ConditionTrue, Reason: "kubelet is posting ready status", @@ -1814,7 +1804,7 @@ func (kl *Kubelet) tryUpdateNodeStatus() error { if !networkConfigured { reasons = append(reasons, "network not configured correctly") } - newCondition = api.NodeCondition{ + newNodeReadyCondition = api.NodeCondition{ Type: api.NodeReady, Status: api.ConditionFalse, Reason: strings.Join(reasons, ","), @@ -1825,25 +1815,32 @@ func (kl *Kubelet) tryUpdateNodeStatus() error { updated := false for i := range node.Status.Conditions { if node.Status.Conditions[i].Type == api.NodeReady { - newCondition.LastTransitionTime = node.Status.Conditions[i].LastTransitionTime - if node.Status.Conditions[i].Status != api.ConditionTrue { - kl.recordNodeOnlineEvent() + oldNodeReadyConditionStatus = node.Status.Conditions[i].Status + if oldNodeReadyConditionStatus == newNodeReadyCondition.Status { + newNodeReadyCondition.LastTransitionTime = node.Status.Conditions[i].LastTransitionTime + } else { + newNodeReadyCondition.LastTransitionTime = currentTime } - node.Status.Conditions[i] = newCondition + node.Status.Conditions[i] = newNodeReadyCondition updated = true } } if !updated { - newCondition.LastTransitionTime = currentTime - node.Status.Conditions = append(node.Status.Conditions, newCondition) - kl.recordNodeOnlineEvent() + newNodeReadyCondition.LastTransitionTime = currentTime + node.Status.Conditions = append(node.Status.Conditions, newNodeReadyCondition) + } + if !updated || oldNodeReadyConditionStatus != newNodeReadyCondition.Status { + if newNodeReadyCondition.Status == api.ConditionTrue { + kl.recordNodeStatusEvent("NodeReady") + } else { + kl.recordNodeStatusEvent("NodeNotReady") + } } - if oldNodeUnschedulable != node.Spec.Unschedulable { if node.Spec.Unschedulable { - kl.recordNodeUnschedulableEvent() + kl.recordNodeStatusEvent("NodeNotSchedulable") } else { - kl.recordNodeSchedulableEvent() + kl.recordNodeStatusEvent("NodeSchedulable") } oldNodeUnschedulable = node.Spec.Unschedulable }