美文网首页
k8s滚动更新时删除pod的规则

k8s滚动更新时删除pod的规则

作者: 无妄zxc | 来源:发表于2021-02-03 16:20 被阅读0次

    k8s 在弹性缩容或滚动更新时默认的pod删除规则如下:

    1 如果pod没分配到节点,先被删除
    2 如果pod的状态是 Pending>PodUnknown>PodRunning,则Pending优先被删除,PodUnknown次之,PodRunning最后被删除。
    3 不是Ready状态的Pod先被删除。
    4 如果Pod都是Ready状态,则最后一个变成Ready状态的Pod先被删除(Ready时间最短的)。
    5 重启次数大的Pod先被删除。
    6 创建时间最新的Pod先被删除。

    参考代码

    func (s ActivePods) Less(i, j int) bool {
        // 1. Unassigned < assigned
        // If only one of the pods is unassigned, the unassigned one is smaller
        if s[i].Spec.NodeName != s[j].Spec.NodeName && (len(s[i].Spec.NodeName) == 0 || len(s[j].Spec.NodeName) == 0) {
            return len(s[i].Spec.NodeName) == 0
        }
        // 2. PodPending < PodUnknown < PodRunning
        m := map[v1.PodPhase]int{v1.PodPending: 0, v1.PodUnknown: 1, v1.PodRunning: 2}
        if m[s[i].Status.Phase] != m[s[j].Status.Phase] {
            return m[s[i].Status.Phase] < m[s[j].Status.Phase]
        }
        // 3. Not ready < ready
        // If only one of the pods is not ready, the not ready one is smaller
        if podutil.IsPodReady(s[i]) != podutil.IsPodReady(s[j]) {
            return !podutil.IsPodReady(s[i])
        }
        // TODO: take availability into account when we push minReadySeconds information from deployment into pods,
        //       see https://github.com/kubernetes/kubernetes/issues/22065
        // 4. Been ready for empty time < less time < more time
        // If both pods are ready, the latest ready one is smaller
        if podutil.IsPodReady(s[i]) && podutil.IsPodReady(s[j]) && !podReadyTime(s[i]).Equal(podReadyTime(s[j])) {
            return afterOrZero(podReadyTime(s[i]), podReadyTime(s[j]))
        }
        // 5. Pods with containers with higher restart counts < lower restart counts
        if maxContainerRestarts(s[i]) != maxContainerRestarts(s[j]) {
            return maxContainerRestarts(s[i]) > maxContainerRestarts(s[j])
        }
        // 6. Empty creation time pods < newer pods < older pods
        if !s[i].CreationTimestamp.Equal(&s[j].CreationTimestamp) {
            return afterOrZero(&s[i].CreationTimestamp, &s[j].CreationTimestamp)
        }
        return false
    }
    

    相关文章

      网友评论

          本文标题:k8s滚动更新时删除pod的规则

          本文链接:https://www.haomeiwen.com/subject/jqhmtltx.html