库伯内特斯没有';t等待所有websocket连接关闭,然后在滚动更新期间终止

库伯内特斯没有';t等待所有websocket连接关闭,然后在滚动更新期间终止,websocket,kubernetes,Websocket,Kubernetes,我试图在EKS(AWS K8s服务)滚动更新期间实现0停机时间 我有一个WebSocket服务器,我想确保在该服务器的滚动更新过程中,现有连接将保持不变,直到工作完成后关闭WebSocket 我原以为K8s滚动更新功能可以帮我解决这个问题,但事实并非如此。我试过了,它只是在仍然有连接到WebSocket的时候杀死了pod 如果我理解正确,则pod终止如下: 用户向K8s API发送pod删除信号 K8s停止将新流量路由到此pod,并发送SIGTERM信号 应用程序必须处理此信号,并在指定的宽限期

我试图在EKS(AWS K8s服务)滚动更新期间实现0停机时间

我有一个WebSocket服务器,我想确保在该服务器的滚动更新过程中,现有连接将保持不变,直到工作完成后关闭WebSocket

我原以为K8s滚动更新功能可以帮我解决这个问题,但事实并非如此。我试过了,它只是在仍然有连接到WebSocket的时候杀死了pod

如果我理解正确,则pod终止如下:

  • 用户向K8s API发送pod删除信号
  • K8s停止将新流量路由到此pod,并发送SIGTERM信号
  • 应用程序必须处理此信号,并在指定的
    宽限期内开始正常终止(默认为30秒)
  • 之后,K8s发送SIGKILL信号,强制终止pod
  • 如果我的上述理解是正确的,显然没有办法告诉K8s:

  • 不要中断当前的连接
  • 让它们运行所需的时间(它们最终将关闭,但周期变化很大)
  • 关闭所有连接后,终止pod
  • 问题:有没有办法确保K8s:

  • 不中断WebSocket连接
  • 不强制应用程序在特定的
    宽限期内终止连接
  • 检测所有WebSocket连接何时关闭并关闭pod

  • 如果有人能帮助我,我将不胜感激

    您可以在kubernetes吊舱生命周期中使用
    生命周期挂钩
    ,该吊舱生命周期具有
    预停挂钩
    。这个钩子将在吊舱终止前运行

    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将终止。

    对于任务关键型应用程序,请选择自定义蓝绿色部署

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


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

    让脚本终止所有连接并等待连接终止
    如果我终止所有连接,我将强制关闭连接。连接中断,这不是我想要的。我想让连接保持正常运行。当他们完成了预期的工作后,他们将自己关闭连接。理想情况下,应用程序在接收到SIGTERM时应该处理优雅的终止,但即使它不存在。您应该有一些机制来触发应用程序的正常终止。这可能包括停止长期存在的连接或存储某些状态。所有这些都是特定于应用程序的,必须仅在应用程序级别处理。请这样考虑。0停机时间意味着最终用户在升级过程中不会有任何感觉。在我的例子中,用户正在使用websocket,他们希望它一直运行,直到他们决定结束它。当我收到SIGTERM时,如何才能优雅地终止pod,而不让最终用户知道这一点?只要连接持续存在,您就必须保持已建立连接的pod处于活动状态(处于终止状态)。您可以使用前面描述的预停止挂钩来完成此操作。你在这段时间内做到了吗?你找到解决这个问题的好办法了吗?我面临同样的问题,我的应用程序处理sigterm信号,并等待所有套接字连接断开,然后再关闭服务器进程。但是,客户端的套接字断开连接,这似乎是负载平衡器/服务层的问题。这似乎是问题所在(从pods终止文档的步骤5开始):“(与3同时发生)Pod已从服务的终结点列表中删除,并且不再被视为复制控制器的运行Pod集的一部分。缓慢关闭的Pod无法继续服务于流量,因为负载平衡器(如服务代理)将其从循环中删除。”