在Kubernetes中,平台容器申请资源有request和limit概念来描述资源请求的资源最小值和最大值
。 总体而言 ,运营在调度的实践时候requests比较重要 ,在运行时limits比较重要。容器在实际使用时,平台容器资源规格 request 和 limit 的建站模板资源设置规格也一直都让Kubernetes的用户饱受困扰 : vivo容器平台基于Kubernetes技术对内部业务提供容器服务。内部业务统一在CICD平台部署和管理容器资源
,容器平台自研的源码库caas-openapi组件提供restful接口与CICD交互。 平台通过标签 ,从资源维度逻辑上可以分为测试池、共享池
、专有池、混部池。 vivo容器平台的所有在线业务部署均要求设置request和limit,且request <= limit
,默认情况request等于limit
。在共享池中
,常见业务request设置会出现如下情况: (1) 较少情况 ,业务设置较低的 request 值,而实际使用资源远大于它的 request 值 ,若大量pod调度一个节点,加剧节点热点问题影响同节点其他业务
。云计算 (2)大多情况,业务按最大资源需求设置较高的 request 值,而实际使用资源长期远小于它的 request 值。业务侧账单成本高(按request计费),且容器异常退出时 ,重调度时可能因为平台空闲资源碎片,导致大规格容器无法调度。这会导致
,平台侧可调度资源少
,但平台整体节点资源利用率偏低
。 对平台和用户方 ,request值设置合理很重要,但平台无法直接判断用户设置request值合理性 ,所以无法首次部署时硬限制 。高防服务器 2.3.1 request怎么样才是合理设置 request值接近业务实际使用量,例如用户申请request为2核 ,limit为4核,实际真实使用量最多1核 ,那么合理request值设置为1核附近 。但是业务真实使用量只有运行一段时间后才能评估,属于后验知识。 2.3.2 保障资源最大使用量 不修改limit值就能保障业务最大使用量符合业务预期。 思路: 静态超卖方案是将CICD用户申请规格的request按一定比例降低 ,根据平台运营经验设置不同集群不同机房不同环境的静态系数
,源码下载由caas-openapi组件自动修改。如下图: 优点: 首次部署时可以应用,实现简单 。 缺点: 生产环境系数设置保守
,导致request依然偏大 ,且由于内存是不可压缩资源,实际实施时为避免业务实例内存oom-kill ,静态超卖只开启了cpu维度,未开启内存静态超卖 。 3.2.1 方案思路 开发caas-recommender组件 ,基于业务监控数据的真实资源用量来修正业务request值
。 3.2.2 半衰期滑动窗口模型 结合容器业务的特点,对推荐算法有如下要求
: 半衰期滑动窗口模型可以根据数据的时效性对其权重进行衰减,可以满足上述要求。 详细描述参考 :google Borg Autopilot的moving window模型 ,参看原论文>> 公式如下: 其中 τ 为数据样本的时间点 ,t1/2 为半衰期,表示每经过 t1/2 时间间隔,前一个 t1/2 时间窗口内数据样本的权重就降低一半 。 核心理念
:在参考时间点之前的数据点
,离的越远权重越低 。在参考时间点之后的数据点权重越高
。 半衰期halfLife:经过时间halfLife后,权重值降低到一半 。默认的halfLife为24小时。 数据点的时间timestamp:监控数据的时间戳。 参考时间referenceTimestamp :监控数据上的某个时间(一般是监控时间最近的零点00:00)
。 衰减系数decayFactor :2^((timestamp-referenceTimestamp)/halfLife) cpu资源的固定权重:CPU 使用量数据对应的固定权重是基于容器 CPU request 值确定的。当 CPU request 增加时,对应的固定权重也随之增加,旧的样本数据固定权重将相对减少 。 memory资源的固定权重
一
、容器背景
二、现状
2.1 vivo容器平台介绍 
图片
三、解决方案探索
3.1 静态超卖方案 
图片