当Pod处于终止宽限期

时间:2018-05-09 11:32:33

标签: kubernetes

我有一个部署(A pods),附带Service和Horizo​​ntalPodAutoscaler。我希望能够控制缩小过程并在pod关闭之前进行一些清理。问题是,清理可能需要花费很多时间,并且要完成其他一些服务(B pod)应该能够访问试图关闭的pod。

为实现此目的,我将部署A设置为具有较长的spec.terminationGracePeriodSeconds值。当A pod获得SIGTERM时,它开始完成并在完成后关闭该过程。

从点A获取SIGTERM它不再接收来自pod B的连接,因为该服务从端点移除了它的IP - 使得pod A无法完成它的清理。

尝试使用ClusterIP和Headless服务,两者都是相同的。

即使在获得SIGTERM后,如何让服务继续向pod A发送流量?我不介意B pod的请求在尝试访问A pod时出错。

2 个答案:

答案 0 :(得分:0)

由于终止流程设计,无法做到这一点。

以下是终止流程documentation的摘录:

  1. 用户发送删除Pod的命令,默认宽限期(30秒)

  2. API服务器中的Pod随着时间的推移而更新,其中Pod被视为“死亡”以及宽限期。

  3. Pod在客户端命令中列出时显示为“终止”
  4. (与3同时)当Kubelet发现Pod已被标记为终止因为2中的时间已经设置,它将开始pod关闭过程。

    1. 如果pod已定义preStop挂钩,则会在pod中调用它。如果在宽限期到期后preStop挂钩仍在运行,则会以较小的(2秒)延长宽限期调用步骤2。
    2. Pod中的进程将发送TERM信号。
  5. (与3同时) Pod从端点列表中删除以进行维护,并且不再被视为复制控制器的运行pod集的一部分。缓慢关闭的窗格可以继续为流量提供服务,因为负载平衡器(如服务代理)会将其从轮换中删除。

  6. 当宽限期到期时,仍然在Pod中运行的任何进程都将被SIGKILL杀死。
  7. Kubelet将通过设置宽限期0(立即删除)完成删除API服务器上的Pod。 Pod从API中消失,不再从客户端看到。
  8. 因此,在解析“SIGTERM”信号时,Pod将在服务中取消注册,您无法避免它。

答案 1 :(得分:0)

通过以下方式配置服务

cat memory.usage_in_bytes

然后,您的Pod即使处于spec.publishNotReadyAddresses: true 状态也将收到流量,如Kubernetes docs所解释:

publishNotReadyAddresses设置为true时,指示DNS实现必须发布与服务关联的端点的子集的notReadyAddresses。默认值为false。设置此字段的主要用例是使用StatefulSet的Headless Service传播其Pod的SRV记录,而无需考虑它们为对等点发现而准备就绪的情况。

请注意,Terminating only works in Kubernetes v1.11+。 在较旧的群集中,使用spec.publishNotReadyAddresses批注获得similar behaviour