美文网首页
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的规则

    k8s 在弹性缩容或滚动更新时默认的pod删除规则如下: 1 如果pod没分配到节点,先被删除2 如果pod的状态...

  • k8s deployment

    k8s 的更新策略为滚动更新,通过新创建的RS(Replica Set)创建新的pod,等新的pod调度完成显示r...

  • K8S的滚动更新(六)

    前言 K8S的滚动更新功能,一次可以更新部分副本,启动一部分pod,停止一部分pod,最后完成所有副本的更新,在升...

  • 如何优雅滚动更新Pod

    背景 一 触发滚动更新时候,会删除pod,会访问apiserver的接口,此时会设置tDeletionTimest...

  • Kubernetes configmap

    ConfigMap 更新后滚动更新 Pod 往往在使用kubernetes configmap作为业务的配置管理时...

  • k8s deployment 滚动更新

    正常来说 k8s 的 deployment 在更新时默认就会进行滚动的升级但是实际操作中会发现,滚动更新过程中应用...

  • kubelet重启导致container重启源码分析

    kubelet重启后pleg的中记录pod status的cache未更新完整时,kubelet收到k8s事件,由...

  • k8s关于Orphaned pod <pod_id> found

    问题描述因k8s节点异常关机导致启动后业务Pod重新部署,关机之前的Pod状态已被删除,今天在查看日志时发现在异常...

  • [!] Unable to find a pod with na

    解决方法 1、更新pod $ pod setup 如果pod search操作还是搜索失败 2、删除pod搜索文件...

  • k8s-Pod控制器基础

    快速创建一个pod 创建一个pod: 查看是否创建成功: 删除pod: 使用命令创建一个deploy k8s的资源...

网友评论

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

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