Kubernetes中的自动Pod删除延迟

时间:2019-02-22 18:27:05

标签: kubernetes

是否有一种方法可以自动延迟所有 Kubernetes吊舱删除请求,从而发出终结点注销信号,但吊舱的SIGTERM延迟几秒钟?

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

背景:

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

在可能通过舵机或其他上游源完成吊舱的部署,或者要管理大量部署和容器的情况下,困难迅速出现。以这种方式修改许多部署可能很困难,甚至是不可能的(例如,容器可能没有睡眠二进制文件,shell或应用程序可执行文件以外的任何东西)。

我简要地探讨了一个变异接纳控制器,但是动态添加一个preStop钩子似乎是行不通的,因为所有图像都没有/bin/sleep或已经有一个preStop图像相关的知识进行合并。

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

1 个答案:

答案 0 :(得分:0)

Kubernetes生命周期具有以下步骤。

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

宽限期就是您所需要的。 重要的是要使该宽限期与preStop挂钩和SIGTERM信号并行发生。同样,Kubernetes也不会等待preStop挂钩完成。

因此,例如,您可以设置terminationGracePeriodSeconds: 90,它可能如下所示:

spec: 
   terminationGracePeriodSeconds: 90
   containers:
       - name: myApplication

您可以阅读有关Termination of Pods的Kubernetes文档。我还推荐了很棒的博客文章Kubernetes最佳实践:优雅地终止。