前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes-pod驱逐机制

kubernetes-pod驱逐机制

原创
作者头像
yaohong
修改2020-07-06 10:42:14
1.3K0
修改2020-07-06 10:42:14
举报
文章被收录于专栏:姚红专栏姚红专栏

1.驱逐策略

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

2.驱逐信号

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

  memory : 内存;

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

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

Eviction Signal

Condition

Description

memory.available

MemoryPressue

memory.available := node.status.capacity[memory] - node.stats.memory.workingSet

nodefs.available

DiskPressure

nodefs.available := node.stats.fs.available(Kubelet Volume以及日志等)

nodefs.inodesFree

DiskPressure

nodefs.inodesFree := node.stats.fs.inodesFree

imagefs.available

DiskPressure

imagefs.available := node.stats.runtime.imagefs.available(镜像以及容器可写层等)

imagefs.inodesFree

DiskPressure

imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree

  • nodefs.available := node.stats.fs.available(Kubelet Volume以及日志等)

nodefs.inodesFreeDiskPressurenodefs.inodesFree := node.stats.fs.inodesFreeimagefs.availableDiskPressureimagefs.available := node.stats.runtime.imagefs.available(镜像以及容器可写层等)imagefs.inodesFreeDiskPressureimagefs.inodesFree := node.stats.runtime.imagefs.inodesFree

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

1234567891011121314

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          #设置和显示当前的swappinessmemory.move_charge_at_immigrate #设置当进程移动到其他cgroup中时,它所占用的内存是否也随着移动过去memory.oom_control         #设置/显示oom controls相关的配置memory.numa_stat           #显示numa相关的内存

  查看系统总memory:

1

cat /proc/meminfo |grep MemTotal

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

1

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

  查看当前cgroup使用memory情况:

1

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

3.软驱逐和硬驱逐

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

12

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

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

123

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

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

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

123

--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>

4.回收Node级别资源

  • 驱逐Node级别资源
    • 配置了 imagefs 阈值时
      • 达到 nodefs 阈值:删除已停止的 Pod
      • 达到 imagefs 阈值:删除未使用的镜像
    • 未配置 imagefs 阈值时
    • 达到 nodefs阈值时,按照删除已停止的 Pod 和删除未使用镜像的顺序清理资源
  • 驱逐用户 Pod
    • 驱逐顺序为:BestEffort、Burstable、Guaranteed
    • 配置了 imagefs 阈值时
      • 达到 nodefs 阈值,基于 nodefs 用量驱逐(local volume + logs)
      • 达到 imagefs 阈值,基于 imagefs 用量驱逐(容器可写层)
    • 未配置 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

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

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

  1.Scheduler行为

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

123

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

  2.Node的OOM行为

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.驱逐策略
  • 2.驱逐信号
  • 3.软驱逐和硬驱逐
  • 4.回收Node级别资源
  •  5.节点资源紧缺情况下系统行为
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档