Kubernetes 中自动 Pod 删除延迟

Eld*_*one 5 deadlock sigterm kubernetes

是否有一种方法可以自动延迟所有Kubernetes pod 删除请求,以便发出端点注销信号,但 pod 的 SIGTERM 延迟几秒?

如果延迟仅影响具有端点/服务的 Pod,则更好,但不是必需的。

背景:

众所周知由于端点注销和删除信号的异步特性, Pod 发送 SIGTERM 终止信号后,某些流量可以继续流向 Pod 。建议的缓解措施是通过调用 来在 pod 的生命周期挂钩中引入几秒钟的延迟。preStopsleep

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

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

(当然,如果 K8S API 使端点注销与超时同步以避免死锁(提示,提示),那么所有这一切都可以避免,但我还没有看到任何关于此类更改的讨论。是的,有很多这是不同步的原因,但这并不意味着无法完成某些操作。)

Cro*_*rou 2

Kubernetes 生命周期有以下步骤。

\n\n
    \n
  • Pod 被设置为 \xe2\x80\x9cTerminate\xe2\x80\x9d 状态并从所有服务的端点列表中删除
  • \n
  • preStop 钩子被执行
  • \n
  • SIGTERM 信号发送到 pod
  • \n
  • Kubernetes 等待宽限期,默认为 30 秒
  • \n
  • 向 pod 发送 SIGKILL 信号,并删除 pod
  • \n
\n\n

宽限期正是您所需要的。\n重要的是要注意这个宽限期是与 preStop 挂钩和 SIGTERM 信号并行发生的。

\n\n
\n

如果容器已处于终止或完成状态,则对 preStop 挂钩的调用将失败。它是阻塞的,这意味着它是同步的,因此它必须在发送删除容器的调用之前完成。

\n
\n\n

在这里您可以阅读有关容器生命周期挂钩的更多信息。

\n\n

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

\n\n
spec: \n   terminationGracePeriodSeconds: 90\n   containers:\n       - name: myApplication\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以阅读有关Pod 终止的Kubernetes 文档。我还推荐精彩的博客文章Kubernetes 最佳实践:优雅地终止

\n