资源调度的最佳实践|学习笔记

简介: 快速学习资源调度的最佳实践

开发者学堂课程【云原生实践公开课资源调度的最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识

课程地址:https://developer.aliyun.com/learning/course/698/detail/12275


资源调度的最佳实践


内容介绍:

一、 调度器简介

二、 Gang Scheduling

三、 Binpack

四、 Pod Topology Spread

五、 总结


一、调度器简介

1. Scheduling Framework

Scheduling Framework前身是extender的一种扩展机制在我们使用extender进行调度拓展时,因为要在外部维护一个extender的服务所以存在:

1. 性能问题,需要通过app请求去访问 extender,影响了整个调度的性能;

2. 在维护成本的问题,需要单独维护extender,比维护Scheduling Framework

增加了许多成本;

3. Extender扩展的点有限,只能通过几个有限的点去带动调度策略,所以操作是很有限的。

image.png

如图是最新版本1.19 Scheduling Framework的整体架构,现在相对稳定。

Scheduling Framework几个重要的扩展点:

  • Fitter 进行一个过滤操作,进行一个筛选
  • Score 进行一个打分插件,将上一部步选出的节点,经行一个打分操作,选择

最优的一个调度节点

2. Multi Scheduling Profiles

  • Goals

使得kube-scheduler可以满足不同Workloads对于调度策略差异化的支持

type KubeSchedulerProfile struct {

schedulerName string

Plugins *Plugins

PluginConfig []PluginConfig

}

type PodSpec struct  {

SchedulerName string

}

image.png

代码示例:

apiVersion:kubescheduler.config.k8s.iolv1beta1kind: KubeSchedulerConfiguration

leaderElection:

leaderElect: false

clientConnection:

kubeconfig:"REPLACE_ME_WITH_KUBE_CONFIG_PATH"

profiles:

- schedulerNlame: my-schedulerplugins:

queueSort:

enabled:

- name: Coscheduling

disabled:

- name: """

preFilter:

enabled:

- name: Coscheduling

permit:

enabled:

- name: Coschedulingreserve:

enabled:

-name:Coscheduling

#optional plugin config

pluginConfig:

- name: Coscheduling

args:

permitWaitingTimeSeconds:10

podGroupGClntervalSeconds: 30

podGroupExpirationTimeSeconds: 600


二、Gang Scheduling

1. Gang Scheduling

  • 需求

对于Tensorflow和MP的作业,同一个Job下要求所有Pod同时启动才能运行

对于Spark的作业,需要至少保证启动Driver和Excuter作业满足最小数目才能运行

  • 痛点

Kubernetes初始的调度器是以Pod为单位依次调度的,不会在调度过程中考虑Pod之间的关系

当集群资源无法满足Job所有资源请求时,部分Pod无法启动已经创建的Pod又无法运行,死锁导致资源的浪费

image.png

2. Gang Scheduling

  • 解决方案

实现QueueSort插件,保证在队列中属于同一个PodGroup的Pod能够排列在一起

Permit的延迟绑定的功能,对于不满足PodGrucpMin限制的Pod进行等待,等待积累的Pod数目满足足够的数目时,再将同一个PodGucp的所有Pod创建

代码示例:

labels:

pod-group.scheduling.sigs.k8s.io/ name: nginx

pod-group.scheduling.sigs.k8s.io/min-available: "2"

  • Name标识podGroup的name
  • min-available是用来标识该PodGroup的作业能够正式运行时所需要的最小副本

3. Batch Scheduling 实践演练

apiversion:"kubeflow.orglv1"

kind: "TFJob"

metadata:

name:"tf-smoke-gpu"

spec:

tfReplicaSpecs;

PS:

replicas: 1

template:

metadata

creationTimestamp: null

labels:

pod-group.scheduling.sigs.k8s.io/name:tf-smke-gpu

pod-group.scheduling.sigs.k8s.ioymin-available: "5

spec:

containers:

- args:

- python

- tf_cnn_benchmarks.py

- --batch_size=32

- --model=resnet50

---variable_update=parameter_server

- --flush_stdout=true

- --num_gpus=1

- --local_parameter_device=cpu- --device=cpu

- --data_format=NHWC

image:registry.cn hangzhou.aliyuncs.com/kubeflow-images-public/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3

name: tensorflow

ports:

- containerPort 2222

name: tfjob-port

resources:

limits:

cpu: '1

workingDir:lopt/tfbenchmarks/scripts/tf_cnn_benchmarks

restartPolicy: OnFailure

Worker:

replicas: 4

template:

metadata:

creationTimestamp: null

labels:

pod-group.scheduling.sigs.k8s.io/name:tf-smoke-gpu

pod-group.scheduling.sigs.k8s.io/min-available:"5”

spec:

containers:- args;

- python

- tf_cnn_benchmarks.py

- --batch_size=32

- --model=resnet50

- --variable_update=parameter_server

- --flush_stdout=true

- --num_gpusm1

- --local_parameter_device=cpu

- --device=gpu

- --data_format=NHwc

image:registry.cn-hangzhou.aliyuncs.comkubeflow-images-public/t-benchmarks-gpu.v20171202-bdab599-dirty-284af3

name: tensorflow

ports:

- containerPort: 2222

name: tfjob-port

resources:

limits:

nvidia.comVgpu: 2

workingDir:lopttfbenchmarks/scripts/tf_cnn_benchmarks

restartPolicy: OnFailure


三、Binpack

1.需求

K8s默认Spreading策略,任务拿到的资源尽量打散,导致资源碎片化,饿死“大任务”,整体资源利用率下降。

Binpack 实现已经抽象成Kubernetes Scheduler Framework的Score插件

RequestedToCapacityRatio,用于优选阶段给节点打

分。将节点根据自己定义的配置进行打分。具体的实现可以分为两个部分,构建打

分函数和打分.

image.png

2.打分函数

  • 优先调度到资源空闲的节点
  • 优先打满一个节点(Binpack)
  • 灵活的分配策略

3. 自定义不同资源的权重

代码示例;

resourcetoweightmap :

"cpu" : 1

"nvidia.com/ gpu": 1

4. 完整的配置方式

apiVersion:kubescheduler.config.k8s.io/v1alpha2kind: KubeSchedulerconfiguration

clientconnection:

kubeconfig: letc/ kubernetes/scheduler.confleaderElection:

leaderElect: falseprofiles:

- schedulerName: default-scheduler

plugins :

score:

enabled:

- name: RequestedTocapacityRatio

weight: 100

disabled:

- name: LeastRequestedPriority

pluginconfig:

- name: RequestedToCapacityRatio,

args:

shape:

- utilization: 0

score: 0

- utilization: 10o

score: 10

resource:

#定义具体根据哪种资源类型进行 binpack操作,多种资源时可以设置 weight来进行比重设"nvidia.com/ gpu"": 1


四、Pod Topology Spread

1.需求

  • Pod的调度分布提供更精细的控制,以提高服务可用性以及资源利用率

2.已有的功能无法准确控制

  • podAffinity可以将无数个Pod调度到特定的某一个拓扑域,这是堆叠的体现
  • podAntiAffinity则可以控制一个拓扑域只存在一个Pod,这是打散的体现

image.png

  • NodeSelector / NodeAffinity组合使用

image.png

  • Multiple TopologySpreadConstraints

image.png


五、 总结

Kubernetes ShedulingFramework作为调度器的新架构方向,在可扩展性和定制化

方面进步很大。 

通过其强大的可扩展性,更多的数据计算类型的任务也在逐步迁移到Kubermnetes 平台。Kubernetes 可以逐步承载更多类型的应用负载一个平台一套ПT架构和技术

堆栈的愿景向前演进。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
存储 安全 数据挖掘
【工具】HxD Hex Editor 的安装、使用详细教程
【工具】HxD Hex Editor 的安装、使用详细教程
3413 0
|
5月前
|
机器学习/深度学习 自然语言处理 算法
万字长文详解|DLRover LLM Agent:大模型驱动的高效集群资源调优
本文介绍了DLRover LLM Agent,展示了基于 LLM 上下文学习能力的优化算法设计理念以及在DLRover 资源调优上的应用方法和效果。
|
TensorFlow 调度 算法框架/工具
【Hello AI】通过Docker安装并使用cGPU服务
cGPU服务可以隔离GPU资源,实现多个容器共用一张GPU卡。该服务作为阿里云容器服务Kubernetes版ACK(Container Service for Kubernetes)的组件对外提供服务,本文介绍如何通过Docker安装并使用cGPU服务。
|
算法 编译器 数据库
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
【C++ 泛型编程 高级篇】使用SFINAE和if constexpr灵活处理类型进行条件编译
1055 0
|
SQL 前端开发 Oracle
mysql合并查询(多张表) union 和 union all
简介 小序 :今天写首页动态业务的时候,用到了两张表,还需要分页查询,刚开始以为需要关联查询,后来发现关联的话不会放到一个实体,然后我就上网找方法,然后发现了一个我没学过的sql语句union,union all,卧槽 还是得好好学习啊,前端我想学,mysql我想学,真的时间不够用啊,还得给学弟学妹拍趣味编程课看的视频,真的是烦啊! 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
1514 0
mysql合并查询(多张表) union 和 union all
|
Linux 网络安全 Python
linux centos上安装python3.11.x详细完整教程
这篇文章提供了在CentOS系统上安装Python 3.11.x版本的详细步骤,包括下载、解压、安装依赖、编译配置、解决常见错误以及版本验证。
10157 3
linux centos上安装python3.11.x详细完整教程
|
10月前
|
人工智能 运维 负载均衡
智能运维新时代:AI在云资源管理中的应用与实践
智能运维新时代:AI在云资源管理中的应用与实践
956 23
|
监控 Kubernetes 网络协议
上云业务的k8s容器排障与思考
本文主要讲述了在完成业务上云后,面临因业务请求量激增导致的系统复杂故障和挑战。作者通过排查分析,发现了一个长时间处于“进行中”状态的异常任务,客户端(APP2)进程卡死,而服务端(APP3)进程正常结束。进一步分析发现,问题出在kube-proxy代理的会话超时机制,由于请求处理延迟,kube-proxy清理了会话记录,导致服务端回包异常,客户端无法识别,从而形成进程假死。 最后,作者强调了在成本控制背景下,通过分析流量增长原因、优化技术架构和调整运营策略来改善系统性能和稳定性的必要性。
820 5
上云业务的k8s容器排障与思考
|
Windows
windows端口冲突解决办法
windows端口冲突解决办法
476 1
windows端口冲突解决办法
|
存储 Kubernetes 数据安全/隐私保护
kubernetes 中pv的回收策略
在Kubernetes中,持久卷(Persistent Volume,PV)的回收策略可以通过`persistentVolumeReclaimPolicy`字段来定义。这个字段有以下几个可选值:1. `Retain`:保留持久卷,不进行自动回收。当持久卷使用完成后,需要手动进行清理和释放。2. `Delete`:删除持久卷,当持久卷不再被使用时,Kubernetes会自动删除并释放它。3. `Recycle`:回收持久卷,当持久卷不再被使用时,Kubernetes会自动进行回收操作。这种回收策略主要适用于一些旧的存储后端,它会尝试清空持久卷中的数据,但不会保证数据安全。需要注意的是,`Recy
768 0