关于腾讯云:游戏业务安全实时计算集群云原生资源优化实践

49次阅读

共计 29419 个字符,预计需要花费 74 分钟才能阅读完成。

「毛西方,腾讯后盾开发工程师,负责 IEG- 业务安全部的后盾实时零碎 Kubernetes 相干的开发与经营,目前次要致力于进步集群的资源利用率,缩小机器老本。」

背景

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 随着公司外部上云的呼声越来越高,越来越多的团队曾经实现业务上云的过程。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 然而,自己所在平台的利用部署上云后,在资源管理方面仍然呈现了一系列的问题,这些问题或多或少都对老本优化或利用的服务质量造成了肯定水平的影响。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”>a. 利用资源应用设置不合理</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 云原生的资源管理形式要求利用在部署之前,提前设置好 CPU、内存、磁盘的最小和最大资源使用量,并且之后不能改变(除非重建所有实例),这要求利用在正式上线之前预估其资源需要。线上的资源需要能够通过压测来模仿,但不免和理论状况有出入;此外利用上线之后,其资源应用会随着业务、策略等的动静更新而发生变化,因而在创立之初设置的资源使用量并不能很好地反映理论的资源需要,容易造成资源节约或资源有余。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”>b. 雷同类型的 Pod,各项资源应用有差别</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 在理论运行过程中,咱们发现即便是雷同的 Pod,其 CPU、内存、磁盘、网络等监控指标也会有很大的差别,极其状况下会相差 60%。有时会遇见大部分 Pod 的 CPU 利用率都很低,个别 Pod 的 CPU 利用率却长期在 90% 以上,最稳当的解决形式为扩容,然而这样却会造成资源的大量节约。例如下图为一段线上环境雷同 Pod 的 CPU 利用率监控,能够看到不同的 Pod 其 CPU 应用也存在几倍的差距。</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/eda2a2b4373977b6d10813391040d008.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 通过进一步剖析,呈现该景象的起因有以下几点:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>Pod 部署的节点性能不同 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>Pod 部署的节点各项资源的耗费不同 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>Pod 在细粒度的工夫单位内,占用的资源不平衡 </section></li></ul>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”>c. 多维度闲暇资源碎片化重大</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 集群在运行一段时间后,随着节点一直上架下架,Pod 一直扩缩容,会有越来越多的闲暇资源扩散在整个集群,并且这样的闲散资源同时存在多个维度(例如节点 CPU 耗尽,然而内存还剩很多)。这样的多维度闲散资源通常难以集中并下架,也会造成资源的节约。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”>d. 突发流量洪峰导致资源有余</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 游戏平安服务在失常运行时有着显著的周期性,并且周期与周期之间峰值变动不大,个别状况下早晨九十点流量最高,后半夜流量最低。然而在某些突发状况下(突发性热点、大型节假日等),服务的申请量会在短时间内大幅上涨,造成资源有余,影响服务失常运行产生告警。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”>e. 资源维度无限</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 原生的调度策略只会基于 CPU、内存、磁盘这三个维度判断节点资源是否短缺。然而理论状况下,磁盘 IO、网络 IO、连接数等维度同样是决定业务是否失常运行的要害。因而资源维度的匮乏会对业务失常的保障造成影响。</p>

现有解决方案

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 上述提到的问题在上云的实际过程中简直遇到,因而前人在遇到这些问题时曾经提出了一些解决方案,具体如下:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>HPA:基于业务理论运行的性能指标(个别为 CPU),主动变更 Pod 数量 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 反亲和性:设置 Pod 反亲和属性,使得雷同 Pod 尽量部署在不同节点,优化均衡性 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 在线离线混布:在同一集群混合部署在离线业务,离线业务在在线业务的低峰期扩容,进步低峰期利用率 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>Descheduler:定期扫描节点资源和部署状况,通过驱赶 Pod 均匀节点负载以及平衡 Pod 部署 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>Dynamic Scheduler:基于节点理论负载调度 Pod,优先调度到低负载节点,优化均衡性 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 高下水位线:设置高下水位线,扩容时 Pod 优先调度到负载处于高下水位线之间的节点,缩容时优先缩容部署在低水位线下节点的 Pod</section></li></ul>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 这些解决方案对上述问题的成果如下表:</p>
<section class=”table-container” data-tool=”mdnice 编辑器 ” style=”overflow-x: auto;”><table style=”display: table; text-align: left;”>
<thead>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: center;”> 解决方案 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: center;”> 资源设置不合理 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: center;”> 雷同 Pod 资源应用有差别 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: center;”> 多维度闲暇资源碎片化 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: center;”> 突发流量 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: center;”> 资源维度无限 </th>
</tr>
</thead>
<tbody style=”border: 0;”>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>HPA</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: #F8F8F8;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”> 反亲和性 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”> 在离线混布 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: #F8F8F8;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>Descheduler</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>Dynamic Scheduler</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: #F8F8F8;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”> 高下水位线 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>√</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: center;”>×</td>
</tr>
</tbody>
</table>
</section><p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 从表中能够看出,上述解决方案只是解决了局部问题,没有解决 资源设置不合理 资源维度无限 这两个问题。此外,短少一个整体的解决方案来对上述所有问题进行对立优化。因而,后文将分享一些本团队对上述问题的解决方案。</p>
## 优化计划

基于历史监控的预测值 predicts 代替 requests

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 对于游戏平安的实时计算业务,其资源应用往往具备显著的周期性,并且周期之间变动不会太大,因而能够基于 Pod 的历史监控数据预测将来的资源应用状况,并且准确度较高,以此解决 资源设置不合理 问题。</p>

预测模型

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 预测模型旨在基于 Pod 的历史多个周期监控数据,预测下个周期的资源应用数据(个别为基于历史一个月预测将来一周)。次要有以下几种预测形式:</p>
<section class=”table-container” data-tool=”mdnice 编辑器 ” style=”overflow-x: auto;”><table style=”display: table; text-align: left;”>
<thead>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: left;”> 办法 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: left;”> 长处 </th>
<th style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; font-weight: bold; background-color: #f0f0f0; min-width: 85px; text-align: left;”> 毛病 </th>
</tr>
</thead>
<tbody style=”border: 0;”>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”> 间接应用历史数据 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>1. 逻辑简略 2. 可解释性好 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>1. 准确率低 2. 雷同类型 Pod 预测后果雷同 </td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: #F8F8F8;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”> 周期因子法 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>1. 逻辑简略 2. 可解释性好 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>1. 只适宜周期性场景 2. 无奈预测趋势 3. 对节假日、流动等非凡场景无奈建模 </td>
</tr>
<tr style=”border: 0; border-top: 1px solid #ccc; background-color: white;”>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>Prophet</td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>1. 预测准确率高 2. 综合思考趋势项、周期项、节假日项 3. 可解决异样值和缺失值 </td>
<td style=”font-size: 16px; border: 1px solid #ccc; padding: 5px 10px; min-width: 85px; text-align: left;”>1. 预测后果存在稳定,鲁棒性差 2. 复杂度高,计算速度慢 </td>
</tr>
</tbody>
</table>
</section><p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 咱们基于实在场景的数据进行了测试,输出为历史两周的小时级别的 CPU 利用率,输入为将来一周小时级别的 CPU 使用率,评估指标为 MAPE(Mean Absolute Percentage Error),具体后果见下图。
<img src=”https://qcloudimg.tencent-cloud.cn/raw/97b6b834260dc87b6b345c85863ae909/2.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 依据各算法得出的预测后果比拟见下图:
<img src=”https://qcloudimg.tencent-cloud.cn/raw/a4bce3efc4753864b4b4380225a06b87/3.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></p>

基于预测值调度 Pod

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 云原生的调度形式是基于 requests 进行的,为了实现基于 predicts 调度,须要对调度器的性能进行扩大,这里举荐云原生提供的 Scheduling Framework,用插件化的形式增加用户自定义的性能。</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/7758e4e81fe5afd056aa011e5fbdbfe7/4.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 该框架将调度过程划分成排序、过滤、评分、批准、绑定,共五个阶段,具体性能如下:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 排序:对调度队列中的 Pod 进行排序 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 过滤:过滤掉不满足 Pod 运行需要的节点 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 评分:对通过过滤阶段的节点进行打分 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 批准:选取评分最高的节点,并判断是否绑定 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 绑定:将 Pod 调度到最终选定的节点 </section></li></ul>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 上述每个阶段都反对用户增加自定义的插件。为了实现基于 predicts 调度,须要增加一个过滤插件,计算节点已绑定 Pod 的 predicts 和待调度的 Pod predicts 之和,并过滤掉不满足资源需要的节点。</p>

反对多维度资源

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 针对业务平安现有的服务,除了 CPU、内存和磁盘大小外,磁盘 IO、网络 IO 对于业务运行也十分重要。所以在收集 Pod 监控数据时,额定收集了这两个维度的数据,在调度时也会计算在内。同时如果业务有其余额定的资源维度,也能够很不便的扩大。这样解决了 资源维度无限 的问题。</p>

整体编排

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 资源均衡性是解决 雷同 Pod 资源应用有差别 的重要办法,这里的资源均衡性要思考多个维度的资源均衡性。如果仅仅在 Pod 须要调度时才思考均衡性,那么在 Pod 调度之后,随着集群整体的部署状况变动,均衡性也会被毁坏。因而,为了实现集群整体长期的资源均衡性,须要定期对集群整体进行从新布局编排。这样的整体编排同时也能够解决 多维度闲暇资源碎片化 问题。整体编排次要分为两个步骤:</p>
<ol data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: decimal; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 基于 Pod predicts 计算出资源平衡的部署计划,应用尽可能少的节点满足以后 Pod 的资源需要;</section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 将计算出的部署计划利用到集群;</section></li></ol>

部署计划计算

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 部署计划次要须要实现两个指标:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 压缩多个维度的资源 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 在节点层面平衡散布多个维度的资源 </section></li></ul>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/217d38e500831fa6fbabf4a5e0cff429.jpeg” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 上述指标形象来讲即为一个多维装箱问题,同时要求在装箱的同时保护多维度的平衡。对于这一类问题,次要有以下几种算法解决:
<img src=”https://qcloudimg.tencent-cloud.cn/raw/01dafb9d56530032aff32e92d3ae29a5.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 多维装箱问题的一个难点是求解容易陷入到部分最优解,另外集群中的 Pod 数量个别上万,对于装箱问题来讲规模较大,因而综合思考,决定采纳遗传算法(GA)来求解最佳部署计划,因为其具备能跳出部分最优解的个性,同时绝对来讲对于大规模求解有着更好的性能。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 对于遗传算法,多维装箱问题的可行解能够被设计成一个染色体。
<img src=”https://qcloudimg.tencent-cloud.cn/raw/5b068afb8d53ee4c38226b6511f509ca.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 算法整体流程大抵如下:
<img src=”https://qcloudimg.tencent-cloud.cn/raw/555f138241db229e99c336e82bd1be34.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 以咱们线上环境的重庆集群为例,以后集群应用了 69 个节点,在计算部署计划之后,只须要应用 27 个节点即可满足所有 Pod 的运行,机器老本降落61%。并且为了保障服务质量,计算部署计划时节点各维度资源的最高利用率设置为不超过 80%,因而有进一步压缩的可能。同时各资源维度也实现了较好的均衡性,下图以 CPU、内存为例,展现部署计划中资源的均衡性。</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/b9bbcbd7cf12486157ab07dfd11e670a.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 从图中可看出,除了最初一个节点没有布满,其余节点都靠近咱们的指标 80% 利用率。内存方面,大部分节点也都在 60%-80% 的区间内。</p>

部署计划利用

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 部署计划旨在应用起码的节点包容以后所有 Pod,将资源应用尽可能压缩。这样会将节点分成两局部:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 热节点:在计划中部署 Pod 的节点 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 冷节点:在计划中被腾出空间的闲暇节点,可下架或用于冗余 </section></li></ul>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 对于大型集群而言,施行部署计划是一个耗时较长的过程,在这期间原先的 Pod 会有变动,例如扩缩容。对于缩容,只是会使本来压缩的资源应用没有那么严密;对于扩容或者新业务部署,咱们须要预留一批节点资源来包容这些新创建的 Pod。这里倡议理论应用时先评估将来的使用量,而后从冷节点中把这部分预留资源划分进去,残余的冷节点禁止新的 Pod 调度下来,这样在部署计划利用之后,能够防止上一步腾出来的闲暇节点被新产生的 Pod 占用,从而无奈间接下架。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 除此之外,将部署计划理论利用到节点还面临两大挑战:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 如何将 Pod 调度到计划指定的节点 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 调度 Pod 时如何保障不影响业务失常运行 </section></li></ul>

调度

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 和之前类似,要想管制 Pod 的调度后果,也须要对 K8s 调度器进行性能扩大。此处依然举荐应用云原生提供的 Scheduling Framework 实现,具体不在赘述。此处实现须要别离增加一个过滤插件和评分插件:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 过滤:依据待调度 Pod 的部署计划,过滤掉已有足够 Pod 数量的节点 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 评分:减少热节点的评分,升高冷节点评分,使 Pod 优先调度到热节点 </section></li></ul>

保障业务失常运行

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 利用部署计划难免会对集群中的局部 Pod 进行重建,而这里的外围指标除了实现部署计划,还须要保障不影响业务的失常运行。不影响业务失常运行的一个重要前提是服务网格的革新,这方面的内容曾经在 IEG- 大规模游戏平安实时计算服务的上云实际 的 3.2 节做了简略介绍,这里不再赘述。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 此外,为了保障调度不影响业务的失常运行,须要依据业务的不同类型施行不同的调度策略。</p>

无状态服务

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 无状态服务指 Pod 即便立刻进行也对以后业务没有影响。针对这一类型服务,须要保障的是同一时刻有指定比例的 Pod 失常提供服务。这能够通过设置就绪探针和存活探针实现,同时要求业务侧反对灰度,确保开始调度下一批 Pod 时,新启动的 Pod 曾经能够失常提供服务。</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/32596d0c0c59ac374f5453cc3e47b989.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>

弱状态服务

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 弱状态服务指 Pod 立刻进行对以后业务有肯定影响,但不致命。对于该种服务,能够通过在服务访问量较小的时段调度(例如凌晨 3 - 6 点)来进一步优化。</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/f097303bee94c3b48d5470a6fd0a963d.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>

强状态服务

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 强状态服务指 Pod 立刻进行对以后业务有影响,并且致命。此类服务的进行比较复杂,须要平台侧和业务侧协同单干。其中业务侧须要设置 Pod Prestop 回调,且须要捕捉并解决退出时收到的 TERM 信号,对以后申请进行收尾并退出。平台侧则须要切断转发到该 Pod 的流量,防止有新的申请发送到该 Pod。具体流程如下:</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/6970eabf1f7c924e1778a84bda840d26.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>

容灾复原

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 基于 Pod 预测值调度存在以下危险:</p>
<ul data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: disc; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”>Pod 可能因为资源适度压缩,无奈失常提供服务 </section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 突发性流量顶峰可能使 Pod 资源应用超过 predicts</section></li></ul>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 针对第一种状况,能够给 Pod 设置存活探针,监控 Pod 的衰弱状态。如果 Pod 频繁呈现不衰弱,则须要进一步查看起因,是否有其余要害资源维度或者须要调整节点预期的资源利用率。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 针对第二种状况,须要设置告警监控集群节点状态,告警触发时主动调用接口刷新 Pod predicts 并驱赶低优先级的 Pod,保障高优先级的 Pod 失常运行。这样能够无效防止 突发流量 影响业务服务质量。</p>
<figure data-tool=”mdnice 编辑器 ” style=”margin: 0; margin-top: 10px; margin-bottom: 10px; display: flex; flex-direction: column; justify-content: center; align-items: center;”><img src=”https://qcloudimg.tencent-cloud.cn/raw/6420d2a1cf8765197d66e4ecea1ca1e1.png” alt style=”margin: 0 auto; max-width: 100%; width: 100%; border-radius: 5px; display: block; margin-bottom: 15px; height: auto;”></figure>

低负载节点裁撤

<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 前文提到通过整体编排解决 多维度闲暇资源碎片化 问题,然而整体编排的整个流程耗时比拟长,无奈疾速地回收资源。在理论生产环境中,针对一些可预感的流量高峰期(例如国庆),业务会提前扩容,这要求新节点资源的增加;流量峰值过后,业务会再缩容,这时之前增加的节点资源就会闲暇进去,然而这些闲暇资源并不能间接回收,因为缩容并不能精准缩容之前扩容出的 Pod,并且在新节点上架期间,老的 Pod 也会被调度下来。因而业务缩容过后经常出现的状况是间接增加的节点负载很低,然而下面有大量业务 Pod 还在运行。</p>
<p data-tool=”mdnice 编辑器 ” style=”padding-bottom: 8px; margin: 0; line-height: 2; padding-top: 8px; padding: 4px; font-size: 15px; color: rgb(#626262); line-height: 2; letter-spacing: 1px;”> 对于这种状况,如果采纳之前的整体编排计划去解决不免有大炮打蚊子的嫌疑,因而咱们采纳了另一套更简略间接的解决方案:</p>
<ol data-tool=”mdnice 编辑器 ” style=”margin-top: 8px; margin-bottom: 8px; padding-left: 25px; color: black; list-style-type: decimal; line-height: 2; letter-spacing: 1px;”>
<li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 筛选出低负载节点;</section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 将下面的 Pod 驱赶,该步骤也须要在不影响业务服务质量的前提下进行;</section></li><li><section style=”margin-top: 5px; margin-bottom: 5px; line-height: 26px; text-align: left; color: rgb(1,1,1); font-weight: 500;”> 正式下架节点,实现老本的削减。</section></li></ol>
</section>

【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!

正文完
 0