我知道,当pod接收到删除请求时,它就会从服务端点被删除,而不再接收请求。但是,我不确定在从服务端点删除它之前收到的请求是否能够返回响应。如果从服务端点丢失了pod IP,它还能响应请求吗?
发布于 2022-01-28 10:17:30
Kubernetes可能终止一个健康的容器有很多原因(例如,节点流失,由于节点上缺乏资源而终止,滚动更新)。
一旦Kubernetes决定终止一个Pod,就会发生一系列事件:
1- Pod设置为“终止”状态,并从所有服务的端点列表中删除
此时,吊舱停止了新的交通。吊舱内运行的容器不会受到影响。
2-执行preStop钩
preStop钩是一个特殊的命令或http请求,发送到容器中。如果您的应用程序在接收SIGTERM时没有优雅地关闭,您可以使用这个钩子触发一个优雅的关闭。大多数程序在接收SIGTERM时都会优雅地关闭,但是如果您正在使用第三方代码或管理您无法控制的系统,那么preStop钩子是一个很好的方法,可以在不修改应用程序的情况下触发一个优雅的关闭。
3-SIGTERM信号被发送到吊舱
此时,Kubernetes将向舱内的容器发送SIGTERM信号。这个信号让容器知道它们将很快被关闭。您的代码应该侦听此事件,并在此时开始彻底关闭。这可能包括停止任何长期存在的连接(如数据库连接或WebSocket流)、保存当前状态或类似的任何东西。即使您正在使用preStop钩子,如果您向应用程序发送SIGTERM信号,那么测试应用程序发生了什么也是很重要的,因此您在生产中并不感到惊讶!
4-Kubernetes等待一个宽限期
此时,Kubernetes等待一个称为终止宽限期的指定时间。默认情况下,这是30秒。需要注意的是,这与preStop挂钩和SIGTERM信号并行进行。Kubernetes不等待preStop钩子完成。如果应用程序在terminationGracePeriod完成之前关闭并退出,Kubernetes将立即进入下一步。如果你的吊舱通常需要超过30秒才能关闭,请确保增加宽限期。您可以通过在Pod中设置terminationGracePeriodSeconds选项来做到这一点。
5- SIGKILL信号发送到吊舱,吊舱被移除。
如果集装箱在宽限期后仍在运行,则向它们发送SIGKILL信号并强行移除。此时,所有Kubernetes对象也被清理干净。
我希望这给库伯奈特斯终止生命周期以及如何优雅地处理Pod终止提供了一个很好的想法。
基于这篇文章。
https://stackoverflow.com/questions/70887885
复制相似问题