软驱逐(soft eviction)和硬驱逐(hard eviction)

因为驱逐 pod 是具有毁坏性的行为,因此必须要谨慎。有时候内存使用率增高只是暂时性的,有可能 20s 内就能恢复,这时候启动驱逐程序意义不大,而且可能会导致应用的不稳定,我们要考虑到这种情况应该如何处理;另外需要注意的是,如果内存使用率过高,比如高于 95%(或者 90%,取决于主机内存大小和应用对稳定性的要求),那么我们不应该再多做评估和考虑,而是赶紧启动驱逐程序,因为这种情况再花费时间去判断可能会导致内存继续增长,系统完全崩溃。

为了解决这个问题,kubernetes 引入了 soft eviction 和 hard eviction 的概念。

软驱逐

可以在资源紧缺情况并没有哪些严重的时候触发,比如内存使用率为 85%,软驱逐还需要配置一个时间指定软驱逐条件持续多久才触发,也就是说 kubelet 在发现资源使用率达到设定的阈值之后,并不会立即触发驱逐程序,而是继续观察一段时间,如果资源使用率高于阈值的情况持续一定时间,才开始驱逐。并且驱逐 pod 的时候,会遵循 grace period ,等待 pod 处理完清理逻辑。和软驱逐相关的启动参数是:

  • —eviction-soft:软驱逐触发条件,比如 memory.available<1Gi
  • —eviction-sfot-grace-period:触发条件持续多久才开始驱逐,比如 memory.available=2m30s
  • —eviction-max-pod-grace-period:kill pod 时等待 grace period 的时间让 pod 做一些清理工作,如果到时间还没有结束就做 kill

前面两个参数必须同时配置,软驱逐才能正常工作;后一个参数会和 pod 本身配置的 grace period 比较,选择较小的一个生效。

硬驱逐

更加直接干脆,kubelet 发现节点达到配置的硬驱逐阈值后,立即开始驱逐程序,并且不会遵循 grace period,也就是说立即强制杀死 pod。对应的配置参数只有一个 —eviction-hard,可以选择上面表格中的任意条件搭配。
设置这两种驱逐程序是为了平衡节点稳定性和对 pod 的影响,软驱逐照顾到了 pod 的优雅退出,减少驱逐对 pod 的影响;而硬驱逐则照顾到节点的稳定性,防止资源的快速消耗导致节点不可用。
软驱逐和硬驱逐可以单独配置,不过还是推荐两者都进行配置,一起使用。