基于Ack集群调度的方案设计
名词说明:本文提到的
k8s
集群特指阿里云ack
(Alibaba Cloud Container Service for Kubernetes)集群
1、概述
Kubernetes
解决了应用的编排、生命周期、自我健康检查和恢复等问题,随着应用容器化(云原生化)的不断完善和落地,方方面面需要考虑的问题也就随之而来
其中应用的调度不乏重要,其关乎着应用的稳定性、资源利用率的完整性与合理性
2、原生调度原则
Kubernetes API Server
接受客户端提交Pod
对象创建请求后的操作过程中,一个重要的步骤是由调度器程序kube-scheduler
从当前集群中选择一个可用的最佳节点来接收井运行它,通常是默认的调度器default-scheduler
负责执行此类任务
KIND: Deployment
VERSION: apps/v1
FIELD: schedulerName <string>
DESCRIPTION:
If specified, the pod will be dispatched by specified scheduler. If not
specified, the pod will be dispatched by default scheduler.
设计调度需要考虑的因素:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等
k8s
调度机制是k8s
原生提供的一种高效优雅的资源分配机制,它的核心功能是为每个Pod
找到最适合它的节点,通过合理利用k8s
原生提供的调度能力,根据业务特性配置合理的调度策略,能有效提高集群中的资源利用率
2.1 调度流程
原生的调度流程整体上分为以下三步
-
预选(过滤)——选出可以调度的节点
-
优选(打 分)——对选出的节点进行排序
-
选定——按照
pod
优先级选定调度的节点
2.2 调度策略
常见的原生调度策略整体上也分为以下几种类型
-
Topology——拓扑域调度:例如域(
Region
)、可用区(Zone
)进行拓扑划分 -
nodeName——选定节点调度:直接指定
Node
主机名进行调度(点对点) -
NodeSelector——节点选择器调度:节点标签选择器调度
-
NodeAffinity——节点亲和性调度:针对
pod
和node
之间的调度关系,分为硬亲和和软亲和 -
podAffinity——Pod亲和性调度:针对
pod
和pod
之间的调度关系,也分为硬亲和、软亲和和反亲和 -
Taint、Toleration——污点和容忍调度:节点拒绝
Pod
调度(污点)和Pod
能接纳节点污点(容忍)两个维度
3、应用和服务概况
应用按照服务用途 维度划分主要分为两类:普通service
类型和worker
类型,其中分别包含
普通service
类型
- 有状态服务:少数服务,如
mysql
、redis
- 无状态服务:多数服务
worker
类型
- 普通
worker
服务 gpu
型worker
服务
按照应用使用的资源类别划分,可对应用大致分为以下几类
- 通用计算
CPU
计算密集型:大量计算,消耗CPU
资源IO
密集型:网络、磁盘IO
要求高- 通用型:对
CPU
和IO
要求相对适中
- 异构计算
GPU
计算型:深度学习训练GPU
虚拟化型:图形和图像处理
- 某些特殊领域和用途的服务:例如高主频、高内存等等
4、阿里云集群概况
4.1 集群概况
本文的kubernetes
集群都是由阿里云ack
托管的,其中包含了ACK Pro
版和边缘 Pro
版两种类型的集群
边缘 Pro
版主要是涉及云上云下的GPU
节点混合部署的集群
本文仅讨论ACK Pro
集群(其中Master
节点由阿里云容器服务创建并托管)