// qos compares pods by QoS (BestEffort < Burstable < Guaranteed) func qosComparator(p1, p2 *api.Pod) int { qosP1 := qos.GetPodQos(p1) qosP2 := qos.GetPodQos(p2) // its a tie if qosP1 == qosP2 { return 0 } // if p1 is best effort, we know p2 is burstable or guaranteed if qosP1 == qos.BestEffort { return -1 } // we know p1 and p2 are not besteffort, so if p1 is burstable, p2 must be guaranteed if qosP1 == qos.Burstable { if qosP2 == qos.Guaranteed { return -1 } return 1 } // ok, p1 must be guaranteed. return 1 }
// Admit rejects a pod if its not safe to admit for node stability. func (m *managerImpl) Admit(attrs *lifecycle.PodAdmitAttributes) lifecycle.PodAdmitResult { m.RLock() defer m.RUnlock() if len(m.nodeConditions) == 0 { return lifecycle.PodAdmitResult{Admit: true} } notBestEffort := qos.BestEffort != qos.GetPodQos(attrs.Pod) if notBestEffort { return lifecycle.PodAdmitResult{Admit: true} } glog.Warningf("Failed to admit pod %v - %s", format.Pod(attrs.Pod), "node has conditions: %v", m.nodeConditions) // we reject all best effort pods until we are stable. return lifecycle.PodAdmitResult{ Admit: false, Reason: reason, Message: message, } }
// Determine if a pod is scheduled with best-effort QoS func isPodBestEffort(pod *api.Pod) bool { return qos.GetPodQos(pod) == qos.BestEffort }