作为更进一步的云计算形态,云原生正在成为云时代的技术新标准,通过重塑整个软件生命周期,成为释放云价值的最短路径。
在企业内部,将云原生基础架构作为企业内部的统一架构已成为大势所趋。与此同时,也必然带来了由各种基础平台整合带来的兼容性问题,特别是规模越大、历史沉淀越多的企业,这种“技术债务”体现得越明显。
本文分享的经验来自于阿里巴巴过去数年来在混合调度方面积累的生产实践积累,具有很强的生产实用价值。内容由浅入门,逐渐深入到调度器内幕,讲述在大规模容器调度场景下,阿里巴巴针对云原生应用设计的统一基础设施 ASI(Alibaba Serverless infrastructure)调度器如何管理阿里巴巴如此复杂、繁忙的资源调度任务;并尝试通过一些具体的案例让您得以充分理解,相信会为有类似问题的读者打开设计思路,并提供落地借鉴。通过本文,相信您将系统地理解阿里巴巴复杂任务场景下的资源混合调度。
调度器总览
ASI 在阿里集团内部引领着容器全面上云的实施,承担了包括阿里集团内部轻量级容器架构演进、运维体系云原生化等职责,并进一步加速促进了新兴的技术包括 Mesh、Serverless、Faas 等在阿里集团内的落地;支撑了包括淘宝、天猫、优酷、高德、饿了么、UC、考拉等几乎所有经济体内部业务、阿里云云产品众多场景及生态。
ASI 的核心基于 Kubernetes,并提供完整的云原生技术栈支持。如今的 ASI 也已成功实现与阿里云容器服务 ACK(Alibaba Cloud Container Service for Kubernetes)的会师;而 ACK 既保留了云上的各种能力,也能成功应对阿里集团复杂的业务环境。
ASI 调度器是 ASI 云原生的核心组件之一。在 ASI 云原生的发展历程中,调度器的作用至关重要。最直观的认知是:阿里巴巴规模庞大的在线电商交易容器,例如购物车、订单、淘宝详情等,每一台容器的分布,包括容器编排、单机计算资源、内存资源,均由调度器分配和调度;特别是在 双11 零点峰值场景下,少数容器编排错误都有可能给业务带来致命影响,调度器需负责把控峰值时每一台容器计算的质量,其重要性可想而知。
ASI 调度器起源于 2015 年在线电商交易容器调度,这一年最早的调度器仅涵盖在线交易 T4(阿里早期基于LXC和Linux Kernel定制的容器技术)和 Alidocker 场景,出生即责任重大,并在 2015 年扛住 双11 流量峰值中发挥作用。
ASI 调度器的演进之路也伴随着云原生发展的全过程。它经历了最早期的在线交易容器调度器、Sigma 调度器、Cerebulum 调度器、ASI 调度器;到如今我们正在建设的下一代调度器 Unified-Scheduler,它将进一步吸收并融合过去数年阿里巴巴 ODPS(伏羲)、Hippo 搜索、在线调度在各个领域的先进经验。各阶段的调度解读如下图:
在 ASI 调度器的演进过程中有非常多的挑战需要解决,主要体现在:
- 调度器调度的任务种类丰富多样,有海量的在线长生命周期容器和 POD 实例、Batch 任务、众多形态的 BestEffort 任务等不同 SLO 等级的任务;有计算型、存储型、网络型、异构型等众多不同资源类型的任务,不同任务的诉求和场景又千差万别。
- 调度之上的宿主资源各异。调度管理着阿里集团内部数量庞大的宿主资源,包括众多机型的存量非云物理机、云上神龙、ECS、异构机型如 GPU/FPGA 等。
- 调度器服务场景广泛。例如:最典型的泛交易场景;最复杂的中间件场景;Faas/Serverless/Mesh/Job 等众多新兴计算场景;饿了么、考拉、神马等新兴生态场景;公共云上伴随着多租安全隔离的调度诉求;还有全球范围内都非常具有挑战性的 ODPS(伏羲)、Hippo、蚂蚁、ASI 统一调度场景。
- 在基础设施层的职责众多。调度器部分承担着基础设施机型定义、计算存储网络资源整合、收敛硬件形态、透明化基础设施等众多职责。
关于阿里云原生详细的发展历程,有兴趣的同学可以通过《一个改变世界的“箱子”》这篇文章来了解。下面,我们重点来分享 ASI 调度器是如何管理着阿里如此庞大规模、如此复杂繁忙的计算资源调度任务。
调度器初探
1. 调度器是什么
调度器在 ASI 众多组件中的作用非常核心。调度器是云原生容器平台调度系统内众多核心组件之一;调度器是资源交付的基石。调度器是 ASI 云原生的大脑。调度器的价值主要体现在:
- 能力强大 & 场景丰富的资源交付(计算、存储)
- 成本最优的资源交付
- 业务运行时稳定最优的资源交付
更通俗地讲,调度器要做的是:
- 一次作业调度的最优:在集群内选择一台最合适的宿主机,并在这台宿主机上,以最佳的资源使用姿势,做到最少的相互干扰(如 CPU 分布、IO 争抢)来运行用户提交的计算作业。
- 集群全局调度的最优:确保全局资源编排最优(如碎片等)、资源运行最稳定、全局成本最优。
在 ASI 云原生体系中,中心调度器所在的位置如下图(其中标红的框框所示):
2. 广义的调度器
在大部分时候,业界讲到调度器指的是“中心调度器”,例如社区的 K8s kube-scheduler。但真实的调度场景复杂,每一次调度都是一个复杂又灵活的综合体协同。作业提交后,它需要中心调度器、单机调度、内核调度多层次调度共同协调,并进一步在 K8s 组件 kubelet、controller 等配合下完成执行;在线调度场景,又有着批量编排调度器;而重调度下的多次调度则确保集群总是保持最优。
ASI 广义的调度器理解为:中心调度器、单机调度、内核调度、重调度、规模化编排调度、多层调度 一体的综合体。
1)中心调度器
中心调度器负责计算每一个(或一批)作业的资源编排计算,它确保一次调度最优。中心调度器为这个具体的任务计算确定诸如集群、地域、执行节点(宿主机)等信息,更进一步细化节点上的 CPU 分配、存储、网络资源分配。
中心调度器在 K8s 生态组件协同下,管理着大部分任务的生命周期。
ASI 云原生的演进之路中,中心调度器即上文描述的 Sigma 调度器、Cerebulum 调度器、ASI 调度器等等。
2)单