基于Ack集群调度的方案设计

名词说明:本文提到的
k8s集群特指阿里云ack(Alibaba Cloud Container Service for Kubernetes)集群
概述
Kubernetes解决了应用的编排、生命周期、自我健康检查和恢复等问题,随着应用容器化(云原生化)的不断完善和落地,方方面面需要考虑的问题也就随之而来
其中应用的调度不乏重要,其关乎着应用的稳定性、资源利用率的完整性与合理性
原生调度原则
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原生提供的调度能力,根据业务特性配置合理的调度策略,能有效提高集群中的资源利用率
调度流程
原生的调度流程整体上分为以下三步
-
预选(过滤)——选出可以调度的节点
-
优选(打分)——对选出的节点进行排序
-
选定— —按照
pod优先级选定调度的节点
调度策略
常见的原生调度策略整体上也分为以下几种类型
-
Topology——拓扑域调度:例如域(
Region)、可用区(Zone)进行拓扑划分 -
nodeName——选定节点调度:直接指定
Node主机名进行调度(点对点) -
NodeSelector——节点选择器调度:节点标签选择器调度
-
NodeAffinity——节点亲和性调度:针对
pod和node之间的调度关系,分为硬亲和和软亲和 -
podAffinity——Pod亲和性调度:针对
pod和pod之间的调度关系,也分为硬亲和、软亲和和反亲和 -
Taint、Toleration——污点和容忍调度:节点拒绝
Pod调度(污点)和Pod能接纳节点污点(容忍)两个维度
应用和服务概况
应用按照服务用途维度划分主要分为两类:普通service类型和worker类型,其中分别包含
普通service类型
- 有状态服务:少数服务,如
mysql、redis - 无状态服务:多数服务
worker类型
- 普通
worker服务 gpu型worker服务
按照应用使用的资源类别划分,可对应用大致分为以下几类
- 通用计算
CPU计算密集型:大量计算,消耗CPU资源IO密集型:网络、磁盘IO要求高- 通用型:对
CPU和IO要求相对适中
- 异构计算
GPU计算型:深度学习训练GPU虚拟化型:图形和图像处理
- 某些特殊领域和用途的服务:例如高主频、高内存等等
阿里云集群概况
集群概况
本文的kubernetes集群都是由阿里云ack托管的,其中包含了ACK Pro版和边缘 Pro 版两种类型的集群
边缘 Pro 版主要是涉及云上云下的GPU节点混合部署的集群
本文仅讨论ACK Pro集群(其中Master节点由阿里云容器服务创建并托管)
node节点的规划
1.1 阿里云ecs介绍
选择服务器的硬件资源配置就和我们购买办公或个人PC、笔记本一样,主要需要考虑主板、CPU、内存、硬盘等硬件配置
CPU与内存通信,主要通过地址、数据、控制三大总线
先简单了解一下CPU核数与内存的配比主要要遵守的基本原则
- 频率要同步:内存的核心频率要等于或稍大于
CPU的外频 - 带宽要匹配:内存的数据带宽跟
CPU前端总线的带宽尽量相等 - 主板要调控:当以上两个条件有时是不可能同时能满足时就要靠主板通过异步设置来调控
通常CPU和内存的配比是1:2、1:4、1:8,至于为什么,这也是一个值得讨论的话题
阿里云ack将集群的master节点托管了,因此只需要考虑如何规划node节点。由于是“花钱”买服务,当然要本着较高“性价比”的原则去合理搭配node节点的选型和配比
节点即虚拟机,在阿里云也叫做ECS,先来看下目前阿里云通用的x86节点有哪些种类,在阿里云官网将ECS实例分为很多种:通用型、计算型、内存型、大数据型、本地SSD