你显然不希望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 标识)。

从路径上观察, 很可能是先 pod 被关闭, 后从 iptables 中移出 pod.
问题就是 iptables 不会过滤客户端请求, 仍转发到正在关闭的 pod.
应用程序这时应该拒绝连接.
解决问题
妥善关闭一个应用的步骤:
- 等待几秒钟,然后停止接收新的连接 。(应该是应用 sleep 几秒, 等待 iptables)
- 关闭所有没有请求过来的长连接 。
- 等待所有的请求都完成 。
- 然后完全关闭应用 。

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

