从 1.26 版开始,GKE on AWS 会自动启用正常节点关停。此功能可以管理节点关停期间 Pod 的正常终止。正常终止可让 Pod 保存其状态,并在节点关停之前释放资源。这种终止 Pod 的方法可最大限度地降低数据丢失的风险。它还可以最大程度地减少其他 Pod 以及依赖于被关停的 Pod 或与这些 Pod 交互的服务中断的风险,从而增强集群的弹性。
工作原理
预定维护、节点扩缩或硬件问题等事件会触发节点关停。kubelet
kubelet 组件会检测事件,并指示 systemd
将系统关停延迟指定时长,从而启动正常节点终止过程。此延迟使节点有时间排空和逐出其上运行的 Pod。
正常节点终止的目标是在节点关停之前正常终止非系统和关键系统 Pod。系统会使用以下默认设置:
ShutdownGracePeriod
:30 秒ShutdownGracePeriodCriticalPods
:15 秒
这些设置会为非系统 Pod 在强制停止之前提供 15 秒的时间来正常终止。关键系统 Pod 在非系统 Pod 终止后有 15 秒的时间来关停。但是,由于该功能会尽最大努力运行,因此节点可能无法在指定的 30 秒内正常关停。
触发器和限制
触发正常节点关停的事件包括计划内事件,如下所示:
- 用户发起的关停
- 终止实例
- 计划性维护
- 缩减集群
在这些情况下,kubelet
会检测节点关停事件并启动正常节点关停过程。
相比之下,如果关停命令不会触发 kubelet
组件所依赖的 systemd
抑制器锁定机制,则无法激活正常节点关停。此类情况的示例包括:
- 网络断开连接
- 硬件故障
- 资源(例如内存或 CPU)不足
- 意外停电。
在这些情况下,节点可能会突然关停,从而可能导致中断或数据丢失。