K8s驱逐策略

2022-07-15 12:20:03 浏览数 (1)

Kube-controller-manger

周期性检查节点状态,每当节点状态为 NotReady,并且超出 podEvictionTimeout 时间后,就把该节点上的 pod 全部驱逐到其它节点,其中具体驱逐速度还受驱逐速度参数,集群大小等的影响。

  • pod-eviction-timeout:即当节点宕机该事件间隔后,开始eviction机制,驱赶宕机节点上的Pod,默认为5min
  • node-eviction-rate: 驱赶速率,即驱赶Node的速率,由令牌桶流控算法实现,默认为0.1,即每秒驱赶0.1个节点,注意这里不是驱赶Pod的速率,而是驱赶节点的速率。相当于每隔10s,清空一个节点
  • secondary-node-eviction-rate: 二级驱赶速率,当集群中宕机节点过多时,相应的驱赶速率也降低,默认为0.01
  • unhealthy-zone-threshold:不健康zone阈值,会影响什么时候开启二级驱赶速率,默认为0.55,即当该zone中节点宕机数目超过55%,而认为该zone不健康
  • large-cluster-size-threshold:大集群法制,当该zone的节点多余该阈值时,则认为该zone是一个大集群。大集群节点宕机数目超过55%时,则将驱赶速率降为0.0.1,假如是小集群,则将速率直接降为0

Kubelet

Kubelet 周期性检查本节点的内存和磁盘资源,当可用资源低于阈值时,则按照优先级驱逐 pod

  1. nodefs:保存 kubelet 的卷和守护进程日志等。
  2. imagefs:在容器运行时,用于保存镜像以及可写入层。

软驱逐

  • eviction-soft:描述一套驱逐阈值(例如 memory.available<1.5Gi ),如果满足这一条件的持续时间超过宽限期,就会触发对 Pod 的驱逐动作。
  • eviction-soft-grace-period:包含一套驱逐宽限期(例如memory.available=1m30s),用于定义达到软阈值之后,持续时间超过多久才进行驱逐。
  • eviction-max-pod-grace-period:在因为达到软阈值之后,到驱逐一个 Pod 之前的最大宽限时间(单位是秒),

硬驱逐

eviction-hard:描述一系列的驱逐阈值(比如说 memory.available<1Gi),一旦达到这一阈值,就会触发对 Pod 的驱逐

代码语言:javascript复制
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
复制代码

容器检查间隔

housekeeping-interval

kubelet持续报告节点状态

node-status-update-frequency

节点状态波动

如果一个节点的状况在软阈值的上下波动,但是又不会超过他的宽限期,将会导致该节点的状态持续的在是否之间徘徊,最终会影响降低调度的决策过程。

要防止这种状况,下面的标志可以用来通知 Kubelet,在脱离压力状态之前,必须等待。

eviction-pressure-transition-period 定义了在跳出压力状态之前要等待的时间。

Kubelet 在把压力状态设置为 False 之前,会确认在周期之内,该节点没有达到逐出阈值。

代码语言:javascript复制
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"
复制代码

要缓和这种状况,Kubelet 能够对每种资源定义 minimum-reclaim。kubelet 一旦发现了资源压力,就会试着回收至少 minimum-reclaim 的资源,使得资源消耗量回到期望范围。

驱逐用户策略

Kubelet 会按照下面的标准对 Pod 的驱逐行为进行评判:

  • 根据服务质量
  • 根据 Pod 调度请求的被耗尽资源的消耗量

接下来,Pod 按照下面的顺序进行驱逐:

  • BestEffort:消耗最多紧缺资源的 Pod 最先失败。
  • Burstable:相对请求(request)最多紧缺资源的 Pod 最先被驱逐,如果没有 Pod 超出他们的请求,策略会瞄准紧缺资源消耗量最大的 Pod。
  • Guaranteed:相对请求(request)最多紧缺资源的 Pod 最先被驱逐,如果没有 Pod 超出他们的请求,策略会瞄准紧缺资源消耗量最大的 Pod。

保留资源给系统与kubelet服务

代码语言:javascript复制
--system-reserved=memory=1.5Gi,ephemeral-storage=1Gi
--system-reserved-cgroup=/system.slice
--enforce-node-allocatable=pods,kube-reserved,system-reserve
--kube-reserved=cpu=1000m,memory=8Gi,ephemeral-storage=1Gi
--kube-reserved-cgroup=/kubelet.service

0 人点赞