Kubernetes Pod驱逐策略

Kubelet 可以主动监测和防止计算资源的全面短缺。 在资源短缺的状况下,kubelet 能够主动地结束一个或多个 Pod 以回收短缺的资源。 当 kubelet 结束一个 Pod 时,它将终止 Pod 中的全部容器,而 Pod 的 Phase 将变为 Failed。 若是被驱逐的 Pod 由 Deployment 管理,这个 Deployment 会建立另外一个 Pod 给 Kubernetes 来调度。
配置资源不足时的处理方式:node

驱逐信号

kubelet 支持按照如下信号触发驱逐决定。
docker

92428b9095a47d010cc49d0087e6efa9.png

驱逐阈值

kubelet支持指定驱逐阈值,用于触发 kubelet 回收资源。
每一个阈值形式以下:shell

[eviction-signal][operator][quantity]

合法的 eviction-signal 标志如上图所示。
operator 是所需的关系运算符,例如 <,>。
quantity 是驱逐阈值值标志,例如 1Gi。合法的标志必须匹配 Kubernetes 使用的数量表示。 驱逐阈值也可使用 % 标记表示百分比。

举例说明,若是一个节点有 10Gi 内存,但愿在可用内存降低到 1Gi 如下时引发驱逐操做, 则驱逐阈值可使用下面任意一种方式指定(但不是二者同时)。ide

memory.available<10%
memory.available<1Gi

软驱逐阈值

软驱逐阈值使用一对由驱逐阈值和管理员必须指定的宽限期组成的配置对。在超过宽限期前,kubelet不会采起任何动做回收和驱逐信号关联的资源。若是没有提供宽限期,kubelet启动时将报错。spa

此外,若是达到了软驱逐阈值,操做员能够指定从节点驱逐 pod 时,在宽限期内容许结束的 pod 的最大数量。 若是指定了 pod.Spec.TerminationGracePeriodSeconds 值, kubelet 将使用它和宽限期两者中较小的一个。 若是没有指定,kubelet将当即终止 pod,而不会优雅结束它们。code

软驱逐阈值的配置支持下列标记:orm

92428b9095a47d010cc49d0087e6efa9.png

硬驱逐阈值

硬驱逐阈值没有宽限期,一旦察觉,kubelet将当即采起行动回收关联的短缺资源。 若是知足硬驱逐阈值,kubelet将当即结束 pod 而不是优雅终止。blog

硬驱逐阈值的配置支持下列标记:
eviction-hard 描述了驱逐阈值的集合(例如 memory.available<1Gi),若是知足条件将触发 pod 驱逐。排序

b4f50b65b639f42a70871368865777d4.png

驱逐监控时间间隔

kubelet 根据其配置的整理时间间隔计算驱逐阈值。
housekeeping-interval 是容器管理时间间隔。进程

驱逐最终用户的 pod

若是 kubelet 在节点上没法回收足够的资源,kubelet将开始驱逐 pod。

kubelet 首先根据他们对短缺资源的使用是否超过请求来排除 pod 的驱逐行为, 而后经过优先级, 而后经过相对于 pod 的调度请求消耗急需的计算资源。

kubelet 按如下顺序对要驱逐的 pod 排名:

  • BestEffort 或 Burstable,其对短缺资源的使用超过了其请求,此类 pod 按优先级排序,而后使用高于请求。
  • Guaranteed pod 和 Burstable pod,其使用率低于请求,最后被驱逐。 Guaranteed Pod 只有为全部的容器指定了要求和限制而且它们相等时才能获得保证。 因为另外一个 Pod 的资源消耗,这些 Pod 保证永远不会被驱逐。 若是系统守护进程(例如 kubelet、docker、和 journald)消耗的资源多于经过 system-reserved 或 kube-reserved 分配保留的资源,而且该节点只有 Guaranteed 或 Burstable Pod 使用少于剩余的请求,而后节点必须选择驱逐这样的 Pod 以保持节点的稳定性并限制意外消耗对其余 pod 的影响。 在这种状况下,它将首先驱逐优先级最低的 pod。

必要时,kubelet会在遇到 DiskPressure 时逐个驱逐 Pod 来回收磁盘空间。 若是 kubelet 响应 inode 短缺,它会首先驱逐服务质量最低的 Pod 来回收 inodes。 若是 kubelet 响应缺乏可用磁盘,它会将 Pod 排在服务质量范围内,该服务会消耗大量的磁盘并首先结束这些磁盘。

相关文章
相关标签/搜索