暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kubernetes-pod 驱逐机制

51reboot运维开发 2020-11-19
899


目录:

  1. 驱逐策略

  2. 驱逐信号

  3. 软驱逐和硬驱逐

  4. 回收 Node 级别资源 

  5. 节点资源紧缺情况下系统行为


01
驱逐策略

kubelet 持续监控主机的资源使用情况,并尽量防止计算资源被耗尽。一旦出现资源紧缺的迹象,kubelet 就会主动终止部分 pod 的运行,以回收资源。


02
驱逐信号

以下是一些 kubelet 能用来做决策依据的信号,依据这些信号来做驱逐行为。

  • memory: 内存;

  • nodefs: 指 node 自身的存储,存储 daemon 的运行日志等,一般指 root 分区/;

  • imagefs: 指 docker daemon 用于存储 image 和容器可写层(writable layer)的磁盘;


Eviction SignalConditionDescription
memory.availableMemoryPressuememory.available := node.status.capacity[memory] - node.stats.memory.workingSet
nodefs.availableDiskPressurenodefs.available := node.stats.fs.available(Kubelet Volume以及日志等)
nodefs.inodesFreeDiskPressurenodefs.inodesFree := node.stats.fs.inodesFree
imagefs.availableDiskPressureimagefs.available := node.stats.runtime.imagefs.available(镜像以及容器可写层等)
imagefs.inodesFreeDiskPressureimagefs.inodesFree := node.stats.runtime.imagefs.inodesFree

memory.available 的值不是根据系统的 free 收集,取值来自于 cgroupfs,free -m 命令不支持在容器中工作,

cgroup.event_control #用于eventfd的接口
memory.usage_in_bytes #显示当前已用的内存
memory.limit_in_bytes #设置/显示当前限制的内存额度
memory.failcnt #显示内存使用量达到限制值的次数
memory.max_usage_in_bytes #历史内存最大使用量
memory.soft_limit_in_bytes #设置/显示当前限制的内存软额度
memory.stat #显示当前cgroup的内存使用情况
memory.use_hierarchy #设置/显示是否将子cgroup的内存使用情况统计到当前cgroup里面
memory.force_empty #触发系统立即尽可能的回收当前cgroup中可以回收的内存
memory.pressure_level #设置内存压力的通知事件,配合cgroup.event_control一起使用
memory.swappiness #设置和显示当前的swappiness
memory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去
memory.oom_control #设置/显示oom controls相关的配置
memory.numa_stat #显示numa相关的内存


查看系统总 memory:

cat /proc/meminfo |grep MemTotal


查看当前已使用 memory 的方法:

#cat /sys/fs/cgroup/memory/memory.usage_in_bytes


查看当前 cgroup 使用 memory 情况:

cat /sys/fs/cgroup/memory/memory.stat |grep total_inactive_file



03
软驱逐和硬驱逐

如果一个节点有 10Gi 内存,我们希望在内存不足 1Gi 时候进行驱逐,可以用下面两种方式进行定位驱逐阈值:

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


1.软驱逐(Soft Eviction):配合驱逐宽限期(eviction-soft-grace-period 和 eviction-max-pod-grace-period)一起使用。系统资源达到软驱逐阈值并在超过宽限期之后才会执行驱逐动作。

--eviction-soft:描述驱逐阈值,例如:memory.available<1.5G
--eviction-soft-grace-period:驱逐宽限期,memory.available=1m30s
--eviction-max-pod-grace-period:终止pod最大宽限时间,单位s


2.硬驱逐(Hard Eviction ):系统资源达到硬驱逐阈值时立即执行驱逐动作。

 

这些驱逐阈值可以使用百分比,也可以使用绝对值,如:

--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
--system-reserved=memory=1.5Gi<br><br>



04
回收 Node 级别资源

驱逐 Node 级别资源

1、达到 nodefs 阈值时

  • 达到 nodefs 阈值:删除已停止的 Pod

  • 达到 imagefs 阈值:删除未使用的镜像

2、未配置 imagefs 阈值时

3、达到 nodefs 阈值时,按照删除已停止的 Pod 和删除未使用镜像的顺序清理资源


驱逐用户 Pod

1、驱逐顺序为:BestEffort、Burstable、Guaranteed

2、配置了 imagefs 阈值时

  • 达到 nodefs 阈值,基于 nodefs 用量驱逐(local volume + logs)

  • 达到 imagefs 阈值,基于 imagefs 用量驱逐(容器可写层)

3、未配置 imagefs 阈值时

  • 达到 nodefs 阈值时,按照总磁盘使用驱逐(local volume + logs + 容器可写层)


除了驱逐之外,Kubelet 还支持一系列的容器和镜像垃圾回收选项,它们未来将会被驱逐替代:

垃圾回收参数驱逐参数解释

--image-gc-high-threshold

--eviction-hard 或 --eviction-soft

现存的驱逐回收信号可以触发镜像垃圾回收

--image-gc-low-threshold

--eviction-minimum-reclaim

驱逐回收实现相同行为

--minimum-image-ttl-duration


由于驱逐不包括TTL配置,所以它还会继续支持

--maximum-dead-containers


一旦旧日志存储在容器上下文之外,就会被弃用

--maximum-dead-containers-per-container


一旦旧日志存储在容器上下文之外,就会被弃用

--minimum-container-ttl-duration


一旦旧日志存储在容器上下文之外,就会被弃用

--low-diskspace-threshold-mb

--eviction-hard or eviction-soft

驱逐回收将磁盘阈值泛化到其他资源

--outofdisk-transition-frequency

--eviction-pressure-transition-period

驱逐回收将磁盘压力转换到其他资源



05
节点资源紧缺情况下系统行为

1.Scheduler 行为

Master 上的 scheduler 不再向该节点调度 pod,节点状况与调度行为的对应关系如下:

MemoryPressure:不再调度新的BestEffort pod到这个节点
 
DiskPressure:不再向这一节点调度pod


2.Node 的 OOM 行为

kubelet 根据 pod 的 Qos 为每个容器设置一个 oom_score_adj,如果 kubelet 无法在系统 OOM 之前回收足够的内存。则 oom_killer 会根据内存使用比例来计算 oom_score,最后结果和 oom_score_adj 相加,得分最高的 pod 将会首先被驱逐。


出处:http://dwz.date/dqck







51Reboot 课程介绍如下




整理 kubernetes 各种问题汇总

使用 Elastic 技术栈构建 Kubernetes 全栈监控(完结)

Kubernetes 与


文章转载自51reboot运维开发,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论