Klog

图解kubernetes Kubelet驱逐管理关键实现

不羁岁月 提交于 2020-02-26 05:09:39
驱逐管理是kubelet自我保护的一种机制,当资源缺乏的时候,通过阈值和策略主动驱逐部分的Pod从而保持系统的资源水位在一个合理的范围内,本身的策略官方文档上已经写的很详细,今天只是看下其在代码上的一些设计 1. 设计臆测 1.1 驱逐总体流程 驱逐总体流程主要是通过获取当前使用资源的统计信息和当前活跃的Pod容器列表,然后结合资源阈值来决策是否需要进行Pod的驱逐 1.2 基于观察者模式的观测 在驱逐管理器中基于观察者模式实现对特殊资源驱逐管理的支持,比如内存资源,在某些情况下即时当前的资源水位没有达到阈值,也可能会触发oom killer这个时候,对应的ThresholdNotifier也会尝试进行状态同步,从而确定是否要主动的驱逐一些节点, 目前这个特性应该还没开, 同理如果这个资源有专属的阈值监测,则在后续驱逐Pod的时候,如果是由该资源触发的驱逐,则优先级会被降低 2. 核心数据结构 驱逐管理器内部有很多的数据结构,这里我们只关注其整体实现的关键数据结构 2.1 阈值与信号 2.1.1 Signal kubelet主要是根据当前系统中的资源来进行驱逐决策的,而信号就表示某种具体可以触发驱逐的资源,比如可用内存,在驱逐决策的时候,会根据统计信息来进行对应资源的计算 type Signal string const ( // 省略其他资源

图解kubernetes scheduler基于map/reduce模式实现优选阶段

佐手、 提交于 2020-02-26 01:06:26
优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用了随机的方式来进行最终节点的分配,如果大家后续有类似的需求,不妨可以借鉴借鉴 1. 设计基础 1.1 两阶段: 单点与聚合 在进行优选的时候,除了最后一次计算,在进行针对单个算法的计算的时候,会分为两个阶段:单点和聚合 在单点阶段,会根据当前算法针对单个node计算 在聚合阶段,则会根据当前单点阶段计算完成后,来进行聚合 1.2 并行: 节点与算法 单点和聚合两阶段在计算的时候,都是并行的,但是对象则不同,其中单点阶段并行是针对单个node的计算,而聚合阶段则是针对算法级别的计算,通过这种设计分离计算,从而避免多goroutine之间数据竞争,无锁加速优选的计算 1.3 map与reduce 而map与reduce则是针对一个上面并行的两种具体实现,其中map中负责单node打分,而reduce则是针对map阶段的打分进行聚合后,根据汇总的结果进行二次打分计算 1.4 weight map/reduce阶段都是通过算法计算,如果我们要进行自定义的调整,针对单个算法,我们可以调整其在预选流程中的权重,从而进行定制自己的预选流程 1.5 随机分布 当进行优先级判断的时候