【问题标题】:Automatic Pod Deletion Delay in KubernetesKubernetes 中的自动 Pod 删除延迟
【发布时间】:2019-07-16 21:37:40
【问题描述】:

有没有办法自动延迟 所有 Kubernetes pod 删除请求,以便发出端点注销的信号,但 pod 的 SIGTERM 延迟几秒钟?

如果延迟只影响带有端点/服务的 pod,那将是可取的,但不是必需的。

背景:

wellestablished 是由于端点注销和删除信号的asynchronous 特性,在向 Pod 发送 SIGTERM 终止信号后,一些流量可以继续流向 Pod。推荐的 mitigation 是通过调用 sleep 在 pod 的 preStop 生命周期钩子中引入几秒钟的延迟。

如果 pod 的部署可能通过 helm 或其他上游源完成,或者有大量的部署和容器需要管理,那么困难很快就会出现。以这种方式修改许多部署可能很困难,甚至是不可能的(例如,容器可能没有 sleep 二进制文件、shell 或除应用程序可执行文件之外的任何东西)。

我简要地探索了一个变异准入控制器,但动态添加 preStop 钩子似乎不可行,因为所有图像都没有 /bin/sleep 或已经有可能需要图像特定知识才能合并的 preStop .

(当然,如果 K8S API 使端点注销与超时同步以避免死锁(提示,提示),则所有这些都可以避免,但我还没有看到任何关于这种更改的讨论。是的,那里这不是同步的原因有很多,但这并不意味着不能做某事。)

【问题讨论】:

    标签: kubernetes deadlock sigterm


    【解决方案1】:

    Kubernetes 生命周期有以下步骤。

    • Pod 设置为“终止”状态并从所有服务的端点列表中删除
    • preStop 钩子被执行
    • SIGTERM 信号发送到 pod
    • Kubernetes 等待一个宽限期,默认为 30 秒
    • SIGKILL 信号发送到 Pod,Pod 被移除

    宽限期是您所需要的。 重要的是要知道此宽限期与 preStop 挂钩和 SIGTERM 信号并行发生。

    如果容器已经处于终止或完成状态,则调用 preStop 挂钩会失败。它是阻塞的,意味着它是同步的,所以它必须在调用删除容器之前完成。

    您可以在此处阅读有关Container Lifecycle Hooks 的更多信息。

    例如,您可以设置terminationGracePeriodSeconds: 90,这可能如下所示:

    spec: 
       terminationGracePeriodSeconds: 90
       containers:
           - name: myApplication
    

    您可以阅读有关 Termination of Pods 的 Kubernetes 文档。我还推荐很棒的博文Kubernetes best practices: terminating with grace

    【讨论】:

    • 是的,我了解terminationGracePeriod 选项——这是关闭完成的总体超时。我想延迟所有 pod 的初始关闭,即使只是几秒钟。如果我尝试添加(例如)8 秒的初始 preStop 等效延迟,我预计不需要更改大多数 pod 的宽限期。
    • “Kubernetes 也不等待 preStop 挂钩完成。” - 能否请您提供此信息的来源?
    • @Vusal,非常感谢您指出这一点。我已经编辑了答案以反映当前文档。
    猜你喜欢
    • 1970-01-01
    • 2019-07-31
    • 1970-01-01
    • 2019-11-14
    • 2019-12-27
    • 2019-03-16
    • 2017-12-29
    • 2019-04-02
    • 2019-04-23
    相关资源
    最近更新 更多