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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 快速学习资源调度的最佳实践

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

课程地址: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架构和技术

堆栈的愿景向前演进。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
6月前
|
弹性计算 运维 安全
一文读懂云上大规模资源管理的最佳实践
阿里云弹性计算团队十三位产品专家和技术专家共同分享云上运维深度实践,详细阐述如何利用CloudOps工具实现运维提效、弹性降本。
131972 5
一文读懂云上大规模资源管理的最佳实践
|
6月前
|
弹性计算 运维 监控
|
4月前
|
弹性计算 运维 Kubernetes
实践篇:灵活调度,高效编排,容器化管理云上应用
【7月更文第8天】阿里云容器服务Kubernetes版(ACK)作为业界领先的容器管理和编排服务,凭借其强大的技术实力和丰富的云服务生态,为企业级用户提供了一系列卓越的优势,助力现代化应用的快速构建、部署与运维。
103 1
|
6月前
|
运维 Kubernetes Cloud Native
构建高效云原生运维体系:Kubernetes最佳实践
【5月更文挑战第9天】 在动态和快速演变的云计算环境中,高效的运维是确保应用稳定性与性能的关键。本文将深入探讨在Kubernetes环境下,如何通过一系列最佳实践来构建一个高效且响应灵敏的云原生运维体系。文章不仅涵盖了容器化技术的选择与优化、自动化部署、持续集成/持续交付(CI/CD)流程的整合,还讨论了监控、日志管理以及灾难恢复策略的重要性。这些实践旨在帮助运维团队有效应对微服务架构下的复杂性,确保系统可靠性及业务的连续性。
|
4月前
|
运维 监控 调度
《<灵活调度,高效编排,容器化管理云上应用>解决方案测评》
在这次测评中,聚焦于技术细节、引导帮助、代码示例、容器托管优势及云产品体验五大方面。技术细节展示出色但需深化复杂场景的优化策略;文档和引导能满足基本需求,但关键步骤应增强提示;代码示例有价值,但遇到实际使用问题;容器化托管带来快速部署、资源隔离和自动化管理的优势,受到高度评价;云产品功能齐全,性能良好,但高级功能配置和手册可读性有待提升。总体而言,解决方案有亮点,期待持续改进。
169 13
《<灵活调度,高效编排,容器化管理云上应用>解决方案测评》
|
6月前
|
Kubernetes Cloud Native 持续交付
探索云原生架构的未来:如何优化资源管理和服务部署
【5月更文挑战第6天】 随着云计算的快速发展,云原生技术已成为企业数字化转型的关键驱动力。此篇文章深入探讨了云原生架构的核心组件及其在资源管理和服务部署方面的优化策略。通过分析容器化、微服务及自动化管理的实践案例,本文旨在为读者提供一套系统的方法论,以利用云原生技术实现更高效、灵活且可靠的IT基础设施。
109 2
|
6月前
|
运维 监控 Kubernetes
构建高效稳定的云基础设施:自动化运维在企业级应用中的关键实践Kubernetes集群监控与性能优化策略
【5月更文挑战第27天】 随着云计算技术的不断成熟和企业数字化转型的深入,构建一个高效、稳定且可扩展的云基础设施已成为众多组织的核心诉求。本文将重点探讨自动化运维在实现这一目标中的重要作用,通过案例分析展示自动化工具和策略如何优化资源管理、提升服务响应速度以及降低运营成本。文章还将讨论自动化过程中面临的挑战,如安全性、复杂性管理和人员技能提升,并提供针对性的解决方案。
|
6月前
|
运维 监控 安全
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(3)
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(3)
460 1
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(3)
|
6月前
|
SQL 弹性计算 运维
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(2)
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(2)
295 1
|
6月前
|
弹性计算 运维 安全
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(1)
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(1)
455 0
带你读《云上自动化运维宝典》——一文读懂云上大规模资源管理的最佳实践(1)