我有一个spring boot camel应用程序,用于处理activeMq上的消息。但是,就绪探针偶尔会失败并重新启动Pod。现在就可以了,但是随后我会不断地在Inflight消息中退出应用登录,由于准备就绪的探针不断失败,它进入了重启周期。
是否可以让kubernets允许spring / camel应用程序正常关闭或使用队列中的任何消息?
答案 0 :(得分:0)
使用Container hooks,您可以设置prestop
,其外观如下:
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
在终止容器之前立即调用此钩子。它是阻塞的,表示它是同步的,因此必须先完成删除容器的调用才能发送。没有参数传递给处理程序。
您可以按照Termination of Pods
上的流程进行操作。
- 用户发送命令删除Pod,默认宽限期为30秒
- API服务器中的Pod随时间更新,超过该时间Pod会被视为“死亡”以及宽限期。
- 在客户端命令中列出时,Pod显示为“正在终止”
- (与3同步)当Kubelet看到由于设置了2中的时间而将Pod标记为终止时,它将开始Pod关闭过程。
- 如果pod定义了preStop hook,则会在pod内部调用它。如果宽限期到期后
preStop
挂钩仍在运行,则将以较小的(2秒)扩展宽限期调用步骤2。- 将Pod中的进程发送给TERM信号。
- (与3相同)从服务的端点列表中删除Pod,并且不再将其视为复制控制器正在运行的Pod集合的一部分。缓慢关闭的Pod无法继续为流量提供服务,因为负载均衡器(如服务代理)会将其从轮换中移除。
- 宽限期到期后,使用SIGKILL杀死Pod中仍在运行的所有进程。
- Kubelet将通过设置宽限期0(立即删除)来完成在API服务器上删除Pod的操作。该Pod从API中消失了,并且在客户端中不再可见。