深入理解K8S(五)
深入理解K8S(五)
·
节点资源管理
节点资源管理包括
- 状态上报:kubelet负责将节点的基础信息、节点资源信息(cpu、内存、Hugepage、临时存储、GPU等注册设备);调度器在位pod选择节点时会将将机器的状态作为依据
- 上报信息会造成不必要的开销,自K8S1.12版本起,K8S引入node lease对象,将上报信息划分为节点状态和Lease对象(每个节点都会有的对象,包含基本的节点信息)
- kubelet在节点状态变更时或者默认一分钟周期到时,更新节点状态信息。并且默认10s周期更新Lease对象,如果40s内Lease没有被更新,则认为节点不健康
- 资源预留
- kubelet通过启动参数可以为CPU、内存、PID等系统预留资源
- 可分配资源(Allocatable):用户pod可用资源(Capacity-分配给系统的资源的剩余部分)
- 容量资源(Capacity):kubelet获取计算节点当前的资源信息
- CPU:从/proc/cpuinfo中获取
- Memory:从/proc/memoryinfo
- ephemeral-storage:指节点根分区的大小
- kubelet通过启动参数可以为CPU、内存、PID等系统预留资源
- 资源可用额监控
- kubelet内置组件cAdvisor检查节点资源信息(内存和磁盘是不可压缩资源、cpu是可压缩资源)
- 驱逐管理:系统会在节点资源不够时终止一些容器进程,以空出资源保证节点的稳定性
- 驱逐策略
- 默认配置:
- memory.available<10%(或者<5Gi) 系统内存少于总量的10%或者5Gi时,就会对pod进行驱逐
- 驱逐方式
- 软驱逐(EvientionSoft):检测到当前资源达到驱逐阈值时,并不会立刻驱逐,会有个宽限期,宽限期到后如果资源状况没有改善,就会驱逐pod(按照Qos)
- 硬驱逐(EvientionHard):检测到当前资源达到驱逐阈值时会立刻驱逐pod(按照Qos)
- 基于内存压力的驱逐:memory.avaiable,当前系统的可用内存(默认设置<100Mi,硬驱逐策略)
- 基于磁盘压力的驱逐
-
划分分区:pod的emptyDir卷、容器日志目录、容器运行时目录
-
kubelet只对系统分区和容器运行时分区进行管理
nodefs.available:根分区磁盘可使用率
nodefs.inodesFree:根分区磁盘inode可使用率
imagefs.available:容器分区磁盘使用率,如果没有容器分区就没有有该资源配置
imagefs.inodesFree:容器分区inode可使用率 -
建议:将kubelet工作目录和容器日志放在系统分区中,容器运行时分区可选
-
当磁盘使用率高时,根据分区不同,kubelet采取的方式也不同:
- 有容器运行时分区:
- 如果系统分区到达驱逐阈值:kubelet删除已经退出容器
- 如果容器运行时分区达驱逐阈值:kubelet删除所有未使用镜像
- 无容器运行时分区:kubelet同时删除未运行的容器和未使用的镜像
- 有容器运行时分区:
-
回收后,如果还是满足驱逐条件,kubelet就会开始驱逐pod
-
驱逐pod选择目标的顺序:
- pod使用量是否超过请求的大小,如果超过,该pod会成为备选目标
- 查询pod的优先级,低优先级pod有限驱逐
- 根据磁盘使用超过请求数量进行排行,差值越小、越容易被驱逐
-
- 数据在不同的分区,kubelet针对不同的驱逐信号采取的驱逐策略不同:
- 有容器运行时分区:
- 系统分区触发驱逐:kubelet计算pod的磁盘使用量中所有容器的日志和本地卷数据
- 容器运行时分区触发驱逐:kubelet计算pod的磁盘使用两种所有容器的可写层
- 无容器运行时分区:
- 系统分区触发驱逐:kubelet计算pod的磁盘使用量中所有容器的日志和本地卷数据和可写层
- 有容器运行时分区:
- 默认配置:
- 驱逐策略
更多推荐
已为社区贡献5条内容
所有评论(0)