Kubernetes不会在滚动更新期间终止之前等待所有websocket连接关闭

时间:2019-04-12 12:32:25

标签: websocket kubernetes

我正在尝试通过EKS(AWS K8s服务)进行滚动更新期间实现零停机。

我有一台WebSocket服务器,我想确保在该服务器的滚动更新期间,现有连接将一直保留到工作完成后WebSocket关闭为止。

我认为K8的滚动更新功能会对此有所帮助,但事实并非如此。我尝试过,它只是在仍然有WebSocket连接的情况下杀死了pod。

如果我正确理解document,则吊舱终止如下所示:

  1. 用户向K8s API发出Pod删除信号
  2. K8停止将新流量路由到此Pod并发送SIGTERM信号
  3. 应用程序必须处理该信号,并在指定的grace-period(默认值为30s)内开始正常终止自身
  4. 然后,K8s发送一个SIGKILL信号来强制终止Pod。

如果我的上述理解是正确的,显然没有办法告诉K8:

  1. 不要中断当前连接
  2. 让它们运行所需的时间(它们最终会关闭,但期间会大大不同)
  3. 一旦所有连接都关闭,请终止吊舱

问题:是否有任何方法可以确保K8:

  1. 不中断WebSocket连接
  2. 不强制应用程序终止特定grace-period中的连接
  3. 在所有WebSocket连接关闭时检测并杀死pod

如果有人可以帮助我,将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以在具有lifecycle hook的kubernetes容器生命周期中使用preStop hook。该挂钩将在吊舱终止之前运行。

lifecycle:
  postStart:
    exec:
      command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
  preStop:
    exec:
      command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

您可以使用脚本杀死所有连接,并等待连接终止,然后只有Pod会终止。

答案 1 :(得分:0)

对于关键任务应用程序,请进行自定义的蓝绿色部署。

首先使用新的选择器部署新版本,然后在所有POD副本都已启动并准备好提供流量时,将服务选择器切换为指向新版本。

在此之后,将kill开关发送到较旧版本,该版本可以正常处理并断开所有客户端的连接。因此,所有新的重新连接都会转发到已经设置为服务流量的新版本。

相关问题