你显然不希望pod 在启动或者关闭过程中出现断开连接的情况 。 Kubernetes 本身并没有避免这种事情的发生 。

17.3.1 在 pod 启动时避免客户端连接断开

确保 pod 启动的时候每个连接都被妥善处理很容易:

  • pod 需要发送信号给 Kubernetes 通知它自己已经准备好了 。 pod 在准备好之后,它才能变成一个服务端点,否则无法接收任何客户端的连接请求 。
  • 如果你在 pod spec 中没有指定就绪探针,那么 pod 总是被认为是准备好了的。

17.3.2 在 pod 关闭时避免客户端连接断开

了解 pod 删除时发生的一连串事件

当 API 服务器接收到删除 pod 的 请求之后,它首先修改了 etcd 中的状态并且把删除事件通知给观察者。其中的两个观察者就是 Kube let 和 端点控制器( Endpoint Controller )。图 17.7 展示了并行发生的两串事件(用 A 或 B 标识)。

image.png

从路径上观察, 很可能是先 pod 被关闭, 后从 iptables 中移出 pod.

问题就是 iptables 不会过滤客户端请求, 仍转发到正在关闭的 pod.

应用程序这时应该拒绝连接.

解决问题

妥善关闭一个应用的步骤:

  1. 等待几秒钟,然后停止接收新的连接 。(应该是应用 sleep 几秒, 等待 iptables)
  2. 关闭所有没有请求过来的长连接 。
  3. 等待所有的请求都完成 。
  4. 然后完全关闭应用 。

image.png

也可以利用停止前钩子来暂停几秒:

image.png