摘要:随着云计算技术的演进,如何在保障服务质量的同时提升资源利用率,成为行业新的挑战。云原生混合部署是云原生的前沿课题,是云计算技术在提升算力效能、绿色减碳方面做出较大突破的关键路径,包括在线应用的混合部署及更进一步的在线服务和离线计算任务的混合部署,其目的是大幅度
文/中国民生银行信息科技部 袁春光 张立
随着云计算技术的演进,如何在保障服务质量的同时提升资源利用率,成为行业新的挑战。云原生混合部署是云原生的前沿课题,是云计算技术在提升算力效能、绿色减碳方面做出较大突破的关键路径,包括在线应用的混合部署及更进一步的在线服务和离线计算任务的混合部署,其目的是大幅度提升计算资源的使用率和弹性能力。
云原生混合部署技术的核心价值是通过将在线服务和离线计算任务进行精确调度,实现资源错峰高效利用。在线服务为了确保服务质量,通常需要长期运行并独占CPU资源,但CPU利用率并不高;而离线计算任务通常具有短生命周期、对资源服务质量要求不高、但运行期CPU利用率较高的特点。通过混合部署,可以实现CPU资源的弹性共享和优先级抢占,以及在线服务与离线任务错峰编排,从而提高整体资源利用率,降低闲置资源比例,减少同等算力需求下的设备和电力消耗。
图1 云原生混合部署架构示意图
五个层次自下而上逐层支撑混合部署能力,基础软硬件层实现全栈信创适配,容器宿主机采用海光/鲲鹏物理服务器,并使用麒麟Linux操作系统,同时由麒麟Linux操作系统提供适配混合部署的内核增强能力;容器云平台层实现Underlay网络和配套的网络访问策略联动,同时联动宿主机Linux内核实现资源优先级控制和隔离;高级调度层实现负载感知调度、跨集群调度、组调度和弹性配额调度;服务接入层提供标准容器服务和大数据作业Serverless框架,用于部署应用服务或者提交批量作业;管理控制台可以管理和查看混合部署的应用和批量作业状态、资源使用状况、日志等。
两大核心技术板块分别是精细化资源优先级控制系统和适配大数据作业的高效灵活调度系统。
1. 精细化资源优先级控制
为了更好地实现在线离线服务的资源隔离和优先级控制,需要在计算节点的Linux Kernel层面做增强。K8S Pod默认的资源控制和隔离是通过Linux Kernel提供的cgroup机制实现,仅支持Best Effort、Burstable和Guaranteed三种方式,Best Effort方式不能对Pod资源做限制,无法采用;Guaranteed方式类似CPU绑核,用于离线服务并不合适,用于在线服务也会造成较多资源浪费;Burstable是目前在线服务采用的方式,虽然有资源控制,但是不区分优先级,并不适合给低优先级的离线服务使用。
Linux Kernel需要增强的能力包括,为低优线程提供专门的低优先级CPU调度队列、SMT(CPU超线程)抗干扰、抢占式调度、网络带宽分级控制等,同时在cgroup层面要适配这些增强的能力。在此基础上,还需要优化K8S cgroup的实现,允许为低优先级的离线Pod设置单独的cgroup层级,把离线Pod使用的资源总量控制在一个允许的范围内,避免突增的离线负载与在线服务竞争资源。在增强的Linux Kernel和cgroup基础上,还需要一个K8S cgroup适配器,根据K8S Pod的优先级配置标签,将其放置到对应优先级的cgroup里,并且能够动态切换优先级,满足应用动态变化的需求。
2. 适配大数据作业的灵活调度
首先需要对大数据作业进行云原生Serverless改造,将大数据作业提交到混合部署的容器集群,使用在线服务低谷期出让的资源(如图2所示)。具体来说是将Yarn的NodeManager节点改造为K8S node,ResourceManager节点用RM Pod替代,AM作业容器改造为K8S Pod,这样Yarn作业可以经过一定转换后,通过K8S方式提交。只有作业被提交到K8S集群后,才会创建作业Pod,任务处理完成后立即销毁作业Pod释放资源。通过在Yarn客户端上配置简单的指向参数,将业务请求发往K8S集群,做到对业务透明。业务也可以通过切换客户端,将作业切换回传统的大数据集群。
图2 大数据作业云原生改造示意图
之后需要为大数据作业配套专门的K8S调度器,更好地满足大数据作业调度的需求。除了基础的Gang Scheduling(团体调度),还需要负载感知调度和弹性配额调度。负载感知调度有两个层面,一是在调度大数据作业Pod前要先观察所有计算节点的历史负载,选择负载最低的节点进行调度,同时辅助以Pod间反亲和性,让同一个作业的Pod尽量均匀分散在不同的计算节点;二是在某个节点负载过高,超过警戒阈值时,主动将部分低优先级的大数据作业Pod驱离到其他负载较低的节点,确保不对在线服务产生干扰。组调度把一个作业相关的一组Pod作为整体进行调度,防止部分Pod创建异常而导致作业被阻塞。跨集群调度可为不同应用的大数据作业队列,配置不同的K8S集群路由策略,实现跨集群的负载调度,充分利用不同K8S集群资源,可让作业队列在各K8S集群之间切换,实现灵活的跨集群资源负载分担,需要时也可作为灾备切换的手段。弹性配额调度是指根据时间段为大数据作业分配不同的资源配额,比如夜间可以分配较多的配额,日间分配较少的配额。在配额减少时,如果正在运行的作业占用了超过配额的资源,就必须减少部分低优先级作业的资源,甚至停止这些作业,以释放资源保证在线服务有充足的资源可用。
1. Underlay容器网络访问策略联动
Underlay网络模型是大规模混合部署的前提条件,可以在共享计算节点情况下,让每个应用容器在硬件网络上有自己独立可见的IP地址,应用弹性伸缩不再受到IP地址的限制。采用BGP Underlay网络模型,Pod IP对硬件网络可见,BGP模型相比VLAN模型,可支持大规模集群部署,但是Pod IP的不固定会导致传统静态网络策略无法适用。因此需要实现防火墙网络策略的联动,在Pod IP发生变化时,实时更新防火墙上的相关网络访问策略。为了确保实时性,需要联合防火墙厂商优化防火墙的细粒度控制能力,比如提供增量更新地址集的能力,提供更高效的API等。
2. 裸金属计算节点
大数据作业的单个资源开销比较大,且需要本地SSD盘承载Shaffle数据,只有物理机才能满足需求。物理机不依赖虚拟化层,稳定性和性能更好,可为混合部署提供更好的纵向弹性能力。此外,物理机单节点承载的应用容器Pod数量多,平均可达到150个,而管理类Pod数量为10个左右,应用Pod和管理Pod数量的比值为15:1,远远大于虚拟机节点的应用/管理Pod数量比值(通常为1:1),可以大幅度降低管理层面的资源开销。
3. 资源动态超卖
K8S调度主要依赖节点CPU/内存的Request使用情况,混部节点的大部分Request被在线服务占据,如果要承载大数据批量作业,就需要对节点Request总量进行超卖。为了符合大数据作业夜间负载高、白天负载低的特点,需要进行动态资源超卖,如白天超卖10%,夜间可以超卖30%~40%。通过动态超卖可以将闲置资源尽可能多地出让给离线作业。
4. 减缓对容器运行时冲击
一些大数据作业所需的资源量非常大,且分多个阶段运行,会在短时间内创建大量的Pod,完成任务后又在短时间内销毁这些Pod。这种大规模的Pod创建/删除会对计算节点本身的容器运行时(比如Containerd)产生冲击,严重时会导致容器运行时处理缓慢,无法及时响应Kubelet,造成节点异常。为了避免这种故障,需要对大数据作业的Pod调度做优化,让Pod尽可能的分散,同时减少Containerd层面的命令执行次数,比如本地监控脚本和数据采集脚本需要优化,减少Containerd层面的命令执行。还需要尽量避免大数据作业Pod出现OOM阻塞Containerd。另外,在混部规模逐步扩大过程中,有可能触发一些以前不会遇到的缺陷,需要通过升级Kube-proxy才能解决。
5. 异构算力混合部署
随着AI技术的发展,GPU算力需求越来越多,对于AI推理服务来说,CPU的算力需求并不高,导致节点上CPU利用率较低。可以通过混合部署,让非GPU的应用,包括大数据批量作业,充分利用节点上闲置的CPU算力,提高整体算力的使用效率。通常是把GPU服务器加入到CPU服务器所在的算力资源池,实现一体化算力调度和供给。
云原生混合部署已经在民生银行生产环境大规模使用,各在线应用都是通过混合部署共享计算节点,同时离线大数据作业数量在快速增长,其中90%以上的作业运行在夜间,可有效利用在线服务出让的算力,将夜间平均CPU使用率从5%提高到了20%。随着离线作业规模的增加,夜间CPU使用率还有继续提升的空间。
后续我们将持续扩大混合部署的规模,从传统大数据集群分流更多的作业到混部集群,既能有效提升混部集群的资源使用效率,又能很好地为传统大数据集群承担峰值负载,提升其性能和稳定性。
来源:金融电子化