写在前面
节点优雅关闭(Graceful node shutdown)已经在kubernetes 1.21进入beta状态,开启节点优雅关闭可以使kubelet在节点关闭期间正常的终止pod。
Kuberentes是一个多节点的分布式系统,各种意外情况都可能出现,比如可能某人或某个操作系统事件,在没有先排空节点的情况下关闭了节点,那么pod将会等待节点被判定为NotReady后,再遵循配置的驱逐时间(没有配置的话默认为5m),这样可能会影响服务访问的连续性。
在关闭之前最佳的流程应该是可以自动的安全的排干节点,确保节点上的pod被安全的终止,并在pod中接收SIGTERM信号或运行preStop。
Kubernetes的Graceful node shutdown能力可以我们更好的控制一些意外关闭的情况,开启功能后kubelet能够意识到底层系统的关闭事件,并将关闭事件传播到pod,确保pod能够尽可能优雅的关闭。
原理
节点优雅关闭功能依赖systemd,利用了systemd抑制锁来延迟节点关闭的时间。
systemd抑制锁可以覆盖到许多不同的节点关闭场景,如:
- 运行shutdown、shutdown now -h、reboot、systemctl reboot、systemctl poweroff等
- 物理机按电源键
- 公有云停止VM实例或抢占式VM被动关闭
开启了Graceful node shutdown能力后,kubelet会在启动时获得一个延迟型的Inhibitor Lock,当系统即将关闭时,kubelet会指示systemd推迟一段时间关闭系统,让kubelet有时间终