in pkg/controller/ingress/concurrency_watchdog.go [275:321]
func (c *ConcurrencyWatchdog) processVotes(list *corev1.PodList, connectionCountByPod []float64, avgConnectionCount float64) string {
// Vote on outlier(s)
podsByName := map[string]struct{}{}
for i, pod := range list.Items {
podsByName[pod.Name] = struct{}{}
rank := (connectionCountByPod[i] / avgConnectionCount) * 100
if rank < c.minPercentOverAvgBeforeVote || time.Since(pod.CreationTimestamp.Time) < c.minPodAge {
continue
}
c.logger.Info("voting to evict pod due to high connection concurrency", "name", pod.Name, "percentOfAvg", rank)
c.votes = c.votes.Next()
var vote *evictionVote
if c.votes.Value == nil {
vote = &evictionVote{}
c.votes.Value = vote
} else {
vote = c.votes.Value.(*evictionVote)
}
vote.PodName = pod.Name
vote.Time = time.Now()
}
// Aggregate votes
votesPerPod := map[string]int{}
c.votes.Do(func(cur interface{}) {
vote, ok := cur.(*evictionVote)
if !ok {
return
}
if _, exists := podsByName[vote.PodName]; !exists || time.Since(vote.Time) > c.voteTTL {
return
}
votesPerPod[vote.PodName]++
})
// Apply votes
for pod, votes := range votesPerPod {
if votes < c.minVotesBeforeEviction {
continue
}
return pod
}
return ""
}