我有一个部署(A pods),附带Service和HorizontalPodAutoscaler。我希望能够控制缩小过程并在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时出错。
答案 0 :(得分:0)
由于终止流程设计,无法做到这一点。
以下是终止流程documentation的摘录:
用户发送删除Pod的命令,默认宽限期(30秒)
API服务器中的Pod随着时间的推移而更新,其中Pod被视为“死亡”以及宽限期。
(与3同时)当Kubelet发现Pod已被标记为终止因为2中的时间已经设置,它将开始pod关闭过程。
(与3同时) Pod从端点列表中删除以进行维护,并且不再被视为复制控制器的运行pod集的一部分。缓慢关闭的窗格可以继续为流量提供服务,因为负载平衡器(如服务代理)会将其从轮换中删除。
因此,在解析“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。