• kubernetes集群之Pod优雅重启


    kubernetes集群之Pod优雅重启

    1、Pod 体面终止限期的默认值是多少?

    默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。kubectl delete命令支持 --grace-period=选项,允许你重载默认值, 设定自己希望的期限值。将宽限期限强制设置为 0意味着立即从 API 服务器删除 Pod。如果 Pod 仍然运行于某节点上,强制删除操作会触发 kubelet立即执行清理操作。

    说明: 你必须在设置 --grace-period=0的同时额外设置 --force参数才能发起强制删除请求。
    如:kubectl delete pods --grace-period 0 --force PodNmae

    2、Pod体面终止的过程是怎么样的?

    Pod正常终止,容器运行时会发送一个 TERM 信号到每个容器中的主进程。kubelet开始本地的 Pod 关闭过程,API 服务器中的 Pod 对象被更新,记录涵盖体面终止限期在内 Pod 的最终死期30秒,超出所计算时间点则认为 Pod 已死(dead),之后 Pod 就会被从 API 服务器上移除。

    拆分理解

    1. 发起删除一个Pod命令后系统默认给30s的宽限期,API系统标志这个Pod对象为Terminating(终止中)状态
    2. kublectl发现Pod状态为Terminating则尝试执行preStop生命周期勾子,并可多给2s的宽限期
    3. 同时控制面将Pod中svc的endpoint中移除
    4. 宽限期到则发送TERM信号,API 服务器删除 Pod 的 API 对象,同时告诉kubelet删除Pod资源对象
    5. Pod还不关闭再发送SIGKILL强制关闭,kubelet也会清理隐藏的 pause容器

    2、超出终止宽限期限时,kubelet 会触发强制关闭过程,这个过程是怎么样的?

    直接执行强制删除操作时,API 服务器不再等待来自 kubelet的、关于 Pod 已经在原来运行的节点上终止执行的确认消息。

    API 服务器直接删除 Pod 对象,无论强制删除是否成功杀死了 Pod,都会立即从 API 服务器中释放该名字。

    不过在节点侧,被设置为立即终止的 Pod 仍然会在被强行杀死之前获得一点点的宽限时间。

    注意:这里的强制删除主要说的是从API服务器移除Pod对象ReplicaSets和其他工作负载资源不再将 Pod 视为合法的、能够提供服务的副本节点端依然是可以允许Pod体面消亡

    3、 如果 preStop 回调所需要的时间长于默认的体面终止限期会发生什么?

    如果 Pod 中的容器之一定义了 preStop回调勾子, kubelet开始在容器内运行该回调逻辑。如果超出体面终止限期时,preStop回调逻辑 仍在运行,kubelet会请求给予该 Pod 的宽限期一次性增加 2 秒钟

    4、强制删除 StatefulSet 的 Pod,会出现什么问题?为什么强制删除 StatefulSet 的 Pod可能会违背至多一个Pod原则?

    强制删除不会等待来自 kubelet对 Pod 已终止的确认消息。无论强制删除是否成功杀死了 Pod,它都会立即从 API 服务器中释放该名字

    这将让 StatefulSet 控制器可以创建一个具有相同标识的替身 Pod;因而可能导致正在运行 Pod 的重复。

    StatefulSets可用于运行分布式和集群级的应用,这些应用需要稳定的网络标识和可靠的存储。这些应用通常配置为具有固定标识固定数量的成员集合。

    具有相同身份的多个成员可能是灾难性的,并且可能导致数据丢失 (例如:票选系统中的脑裂场景)。

    Pod 的终止

    因为 pod 作为在集群的节点上运行的进程,所以在不再需要的时候能够优雅的终止掉是十分必要的(比起使用发送 KILL 信号这种暴力的方式)。用户需要能够发起一个删除 Pod 的请求,并且知道它们何时会被终止,是否被正确的删除。用户想终止程序时发送删除 pod 的请求,在 pod 可以被强制删除前会有一个宽限期,会发送一个 TERM 请求到每个容器的主进程。一旦超时,将向主进程发送 KILL 信号并从 API server 中删除。如果 kubelet 或者 container manager 在等待进程终止的过程中重启,在重启后仍然会重试完整的宽限期。

    流程如下:
    1. 用户发送删除 pod 的命令,默认宽限期是 30 秒;
    2. 在 Pod 超过该宽限期后 API server 就会更新 Pod 的状态为 “dead”;
    3. 在客户端命令行上显示的 Pod 状态为 “terminating”;
    4. 跟第三步同时,当 kubelet 发现 pod 被标记为 “terminating” 状态时,开始停止 pod 进程:如果在 pod 中定义了 preStop hook,在停止 pod 前会被调用。如果在宽限期过后,preStop hook 依然在运行,第二步会再增加 2 秒的宽限期;
    5. 向 Pod 中的进程发送 TERM 信号;
    6. 跟第三步同时,该 Pod 将从该 service 的端点列表中删除,不再是 replication controller 的一部分。关闭的慢的 pod 将继续处理 load balancer 转发的流量;
    7. 过了宽限期后,将向 Pod 中依然运行的进程发送 SIGKILL 信号而杀掉进程。
      Kubelet 会在 API server 中完成 Pod 的的删除,通过将优雅周期设置为 0(立即删除)。Pod 在 API 中消失,并且在客户端也不可见。
      删除宽限期默认是 30 秒。 kubectl delete 命令支持 —grace-period= 选项,允许用户设置自己的宽限期。如果设置为 0 将强制删除 pod。在 kubectl>=1.5 版本的命令中,你必须同时使用 --force 和 --grace-period=0 来强制删除 pod。 在 yaml 文件中可以通过 {{ .spec.spec.terminationGracePeriodSeconds }} 来修改此值。

    如:kubectl delete pods --grace-period 0 --force PodNmae

    强制删除 Pod

    Pod 的强制删除是通过在集群和 etcd 中将其定义为删除状态。当执行强制删除命令时,API server 不会等待该 pod 所运行在节点上的 kubelet 确认,就会立即将该 pod 从 API server 中移除,这时就可以创建跟原 pod 同名的 pod 了。这时,在节点上的 pod 会被立即设置为 terminating 状态,不过在被强制删除之前依然有一小段优雅删除周期。

    强制删除对于某些 pod 具有潜在危险性,请谨慎使用。使用 StatefulSet pod 的情况下,请参考删除 StatefulSet 中的 pod 文章。

  • 相关阅读:
    QT 菜单栏、工具栏和状态栏
    Java 21:最新特性、性能改进和语言发展
    JAVA——》模拟虚拟机栈溢出
    call、apply 以及 bind 的区别和用法
    入门力扣自学笔记279 C++ (题目编号:1123)
    package.json 详解
    SVN导入之后在本地没有创建svn控制文件,SVN如何提交文件
    H3C交换机如何重置console口密码
    2020年12月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
    小程序的开发与应用|软件定制开发|APP网站搭建
  • 原文地址:https://blog.csdn.net/weixin_45112997/article/details/128185872