看腾讯如何提升 Kubernetes 集群利用率?( 三 )


文章图片
当平台规模较大或在线、离线业务均具有的情况下 , 一般都需要使用在离线混部的方式提升资源利用率 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
其实现逻辑较为简单:当集群资源充足时 , 动态地将离线任务调度到空闲节点上;当节点资源接近高负载阈值时 , 优先驱逐离线任务 。
负载提升和稳定性优化通过各种手段提升集群利用率的同时 , 也会带来相应的负面问题:
引起Node节点高负载 , 影响服务质量;Node节点负载不均;剩余剩余资源不足导致Pod横向度失败 。
针对以上负面问题 , 通常需要使用扩容及稳定性相关的手段来解决 。
第一 , 两级扩容机制 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
HNA:当集群负载(装箱率)达到阈值(如85%)时 , 会触发节点自动扩缩容 , 来增加Node节点;
超级节点:当工作负载引发大量扩容、集群资源不足而导致Pod突增时 , 利用超级节点(通过VirtualKubelet加入集群的虚拟Node)直接将Pod扩容到VirtualKubelet节点上 , 超级节点的底层直接使用腾讯云公有云资源池创建弹性Pod 。
第二 , 两级动态超卖 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
通常情况况下 , Pod压缩与Node超卖两种手段需同时使用 。 Pod压缩已实现从静态到动态的优化 , 其压缩比(Request/limit)可以根据历史状态进行动态修改 。
同样 , Node超卖也实现了由静态向动态的升级 , Node节点可以根据实时负载进行动态调整 , 以防止节点负载过高 。
第三 , 动态调度 。
动态调度机制可以实现保证Node节点的资源均衡 , 避免不同Node节点负载不均的现象 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
上图可以看到 , 原生调度为静态调度且Node2空闲资源较多 , 那么根据静态调度策略 , 会将新的Pod调度到Node2节点中 。 但经过动态调度的算法优化 , 实际上会将Pod调度到Node1节点上 , 这是什么原因呢?
这是因为Node1节点的真是利用率更低所致的 , 将Pod调度至Node1上会提高Node的Pod利用率 , 进而使各节点的平均负载相近 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
上图是动态调度机制的原理 , ExtendNodeScorer会根据不同时段的信息参数对Node进行打分 , Kube-scheduler调度器可获取这些参数信息进而将新增Pod调度至实际内存使用更低的节点上 。
第四 , 动态驱逐 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
当Node负载不均或Node利用率过高时 , 大概率会对节点上运行的Pod资源产生影响 。 这种情况下 , 我们可以根据节点当前的状态信息以及节点上Pod的实际利用率对Pod进行动态驱逐 。 这里的参考维度是多样的 , 一般包括:CPU、Memory、FD、Inode等 , 且不同业务针对参数的权重与指标也存在差异 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
上图是某一在线业务集群的状态 , 可以清晰看到在经过超卖及压缩后 , 该集群的节点平均利用率可达38.7% 。
看腾讯如何提升 Kubernetes 集群利用率?
文章图片
节点负载分布(未采用动态调度及动态驱逐)看腾讯如何提升 Kubernetes 集群利用率?
文章图片
节点负载分布(采用动态调度及动态驱逐)通过以上两图对比 , 我们可以看到:在未采用动态调度及动态驱逐时 , 节点负载不均衡同时方差值较大 。 而在采用了动态调度及动态驱逐后 , 节点负载便会趋于稳定 , 异常Node数目减少 , 资源利用率得到有效提高 。