Kubernetes Camel Spring应用程序正常关闭

时间:2018-10-31 12:21:32

标签: spring-boot kubernetes apache-camel

我有一个spring boot camel应用程序,用于处理activeMq上的消息。但是,就绪探针偶尔会失败并重新启动Pod。现在就可以了,但是随后我会不断地在Inflight消息中退出应用登录,由于准备就绪的探针不断失败,它进入了重启周期。

是否可以让kubernets允许spring / camel应用程序正常关闭或使用队列中的任何消息?

1 个答案:

答案 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

上的流程进行操作。
  
      
  1. 用户发送命令删除Pod,默认宽限期为30秒
  2.   
  3. API服务器中的Pod随时间更新,超过该时间Pod会被视为“死亡”以及宽限期。
  4.   
  5. 在客户端命令中列出时,Pod显示为“正在终止”
  6.   
  7. (与3同步)当Kubelet看到由于设置了2中的时间而将Pod标记为终止时,它将开始Pod关闭过程。      
        
    1. 如果pod定义了preStop hook,则会在pod内部调用它。如果宽限期到期后preStop挂钩仍在运行,则将以较小的(2秒)扩展宽限期调用步骤2。
    2.   
    3. 将Pod中的进程发送给TERM信号。
    4.   
  8.   
  9. (与3相同)从服务的端点列表中删除Pod,并且不再将其视为复制控制器正在运行的Pod集合的一部分。缓慢关闭的Pod无法继续为流量提供服务,因为负载均衡器(如服务代理)会将其从轮换中移除。
  10.   
  11. 宽限期到期后,使用SIGKILL杀死Pod中仍在运行的所有进程。
  12.   
  13. Kubelet将通过设置宽限期0(立即删除)来完成在API服务器上删除Pod的操作。该Pod从API中消失了,并且在客户端中不再可见。
  14.