// setNodeInodePressureCondition for the node. // TODO: this needs to move somewhere centralized... func (kl *Kubelet) setNodeInodePressureCondition(node *api.Node) { currentTime := unversioned.NewTime(kl.clock.Now()) var condition *api.NodeCondition // Check if NodeInodePressure condition already exists and if it does, just pick it up for update. for i := range node.Status.Conditions { if node.Status.Conditions[i].Type == api.NodeInodePressure { condition = &node.Status.Conditions[i] } } newCondition := false // If the NodeInodePressure condition doesn't exist, create one if condition == nil { condition = &api.NodeCondition{ Type: api.NodeInodePressure, Status: api.ConditionUnknown, } // cannot be appended to node.Status.Conditions here because it gets // copied to the slice. So if we append to the slice here none of the // updates we make below are reflected in the slice. newCondition = true } // Update the heartbeat time condition.LastHeartbeatTime = currentTime // Note: The conditions below take care of the case when a new NodeInodePressure condition is // created and as well as the case when the condition already exists. When a new condition // is created its status is set to api.ConditionUnknown which matches either // condition.Status != api.ConditionTrue or // condition.Status != api.ConditionFalse in the conditions below depending on whether // the kubelet is under inode pressure or not. if kl.evictionManager.IsUnderInodePressure() { if condition.Status != api.ConditionTrue { condition.Status = api.ConditionTrue condition.Reason = "KubeletHasInodePressure" condition.Message = "kubelet has inode pressure" condition.LastTransitionTime = currentTime kl.recordNodeStatusEvent(api.EventTypeNormal, "NodeHasInodePressure") } } else { if condition.Status != api.ConditionFalse { condition.Status = api.ConditionFalse condition.Reason = "KubeletHasNoInodePressure" condition.Message = "kubelet has no inode pressure" condition.LastTransitionTime = currentTime kl.recordNodeStatusEvent(api.EventTypeNormal, "NodeHasNoInodePressure") } } if newCondition { node.Status.Conditions = append(node.Status.Conditions, *condition) } }
// Set OODcondition for the node. func (kl *Kubelet) setNodeOODCondition(node *api.Node) { currentTime := unversioned.NewTime(kl.clock.Now()) var nodeOODCondition *api.NodeCondition // Check if NodeOutOfDisk condition already exists and if it does, just pick it up for update. for i := range node.Status.Conditions { if node.Status.Conditions[i].Type == api.NodeOutOfDisk { nodeOODCondition = &node.Status.Conditions[i] } } newOODCondition := false // If the NodeOutOfDisk condition doesn't exist, create one. if nodeOODCondition == nil { nodeOODCondition = &api.NodeCondition{ Type: api.NodeOutOfDisk, Status: api.ConditionUnknown, } // nodeOODCondition cannot be appended to node.Status.Conditions here because it gets // copied to the slice. So if we append nodeOODCondition to the slice here none of the // updates we make to nodeOODCondition below are reflected in the slice. newOODCondition = true } // Update the heartbeat time irrespective of all the conditions. nodeOODCondition.LastHeartbeatTime = currentTime // Note: The conditions below take care of the case when a new NodeOutOfDisk condition is // created and as well as the case when the condition already exists. When a new condition // is created its status is set to api.ConditionUnknown which matches either // nodeOODCondition.Status != api.ConditionTrue or // nodeOODCondition.Status != api.ConditionFalse in the conditions below depending on whether // the kubelet is out of disk or not. if kl.isOutOfDisk() { if nodeOODCondition.Status != api.ConditionTrue { nodeOODCondition.Status = api.ConditionTrue nodeOODCondition.Reason = "KubeletOutOfDisk" nodeOODCondition.Message = "out of disk space" nodeOODCondition.LastTransitionTime = currentTime kl.recordNodeStatusEvent(api.EventTypeNormal, "NodeOutOfDisk") } } else { if nodeOODCondition.Status != api.ConditionFalse { // Update the out of disk condition when the condition status is unknown even if we // are within the outOfDiskTransitionFrequency duration. We do this to set the // condition status correctly at kubelet startup. if nodeOODCondition.Status == api.ConditionUnknown || kl.clock.Since(nodeOODCondition.LastTransitionTime.Time) >= kl.outOfDiskTransitionFrequency { nodeOODCondition.Status = api.ConditionFalse nodeOODCondition.Reason = "KubeletHasSufficientDisk" nodeOODCondition.Message = "kubelet has sufficient disk space available" nodeOODCondition.LastTransitionTime = currentTime kl.recordNodeStatusEvent(api.EventTypeNormal, "NodeHasSufficientDisk") } else { glog.Infof("Node condition status for OutOfDisk is false, but last transition time is less than %s", kl.outOfDiskTransitionFrequency) } } } if newOODCondition { node.Status.Conditions = append(node.Status.Conditions, *nodeOODCondition) } }