【k8s系列3】kubernetes(k8s) scheduler backend调度的实现

智数破浪人
• 阅读 1240

背景

  随着k8s快来越火热,以及自动部署,自动伸缩等优点,我们今天来探讨一下,基于k8s的backend的调度怎么来实现

组件图

【k8s系列3】kubernetes(k8s) scheduler backend调度的实现

组件说明

整个数据流就是消费者-生产者模型

组件解释
kubernetesClient跟k8s进行交互,如:任务的提交,杀任务
podsPollingSnapshotSource从k8s中拉取pod的任务状态,存储到podSnapshotStore
podsWatchSnapshotSource监控任务的watcher,以获取任务状态,存储到podSnapshotStore
podSnapshotStorepod状态的存储
podStatepod内部状态转换
podsSnapshotpod 的状态镜像
taskPodsLifecycleManager从podSnapshotStore消费pod的状态,以便根据任务的状态进行后续操作
  • 特别说明
    对于podsWatchSnapshotSource的实现,我们是基于k8s watch机制实现的,但是存在一个问题:
    假如某一时刻,podsWatchSnapshotSource发生了故障导致了该组件发生了重启,那么问题来了,重启这段时间就会丢失event,
    这里我们采用k8s的resourceVersion机制,如果我们定时存储resourceVersion,且在重启的时候读取,就能做到断点续传的作用
    注意一点的是:该resourceVersion在 Kubernetes 服务器的保留是有限制的。使用etcd2的旧集群最多可保留1000次更改。
    默认情况下,使用etcd3的较新集群会在最近5分钟内保留更改,如果超过了该resourceVersion超过了服务器的resourceVersion的值
    则会报错

数据流程图

【k8s系列3】kubernetes(k8s) scheduler backend调度的实现

流程说明

  • backend通过被调用reviveOffer获取能获取到的backend资源.
  • 获取到资源后,通过kubernetesClient向k8s提交任务
  • 减少对应向k8s 提交任务的资源量
  • 更新backend内部的对应job状态为Running状态,如果该存在job状态为Runnnig状态,则更新对应的job状态为updated状态
  • podsWatchSnapshotSource 监控刚才提交的任务,获取任务更新的状态,存储到podSnapshotStore中,以便后续任务的处理
  • podsPollingSnapshotSource 定时拉取应用提交的所有任务,存储到podSnapshotStore中,以便进行final任务的清理
  • podSnapshotStore 对任务状态更新为内部状态,并对订阅此podSnapshotStore的snapshot进行函数回调
  • taskPodsLifecycleManager 订阅了上述的snapshot,对该snapshot进行处理:
    1.如果任务状态为podFailed或者PodSucceeded时,更新backend job的内猪状态,如果存在对应的Running的job,调用k8s api删除该pod,以及删除该pod所占用的资源(cpus,mem等),如果存在对应updated的job状态,则把updated的状态更新为Running状态,防止外界任务的更新,导致任务的资源量更新不一致
    2.调用kubernetesTaskSchedulerBackend的statusUpdate方法进行任务的更新进行处理

UML类继承图

【k8s系列3】kubernetes(k8s) scheduler backend调度的实现

和spark on k8s的区别

因为公司有自己的调度平台,所以主要从调度的粒度来进行对比:
spark on k8s调度的是executor级别的,是粗粒度调度
k8s backend 调度的是job级别,每个job一个pod container,属于细粒度的精准调度

本文由博客群发一文多发等运营工具平台 OpenWrite 发布
点赞
收藏
评论区
推荐文章
爱库里 爱库里
4年前
Kubernetes笔记:十分钟部署一套K8s环境
Kubernetes是Goole开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理——百度百科。接触K8s也有半年多了,也基于阿里云平台搭建了包含多级服务、目前运行较为稳定的K8s集群(感兴趣的可参考\k8s云集群混搭模式,可能帮你节省50%以上的服务成本\,\k8s云集群混搭模式落地分享\,但一直没来得及对其进行系统
GoCoding GoCoding
3年前
K8s 开始
是用于自动部署,扩展和管理容器化应用程序的开源系统。本文将介绍如何快速开始K8s的使用。了解K8s搭建K8s本地开发测试,需要搭建一个K8s轻量服务。实际部署时,可以用云厂商的K8s服务。本文以k3d为例,于macOS搭建K8s服务。于Ubuntu则推荐MicroK8s。其他可替代方案有:,,是Ra
Stella981 Stella981
3年前
Minikube之Win10单机部署
Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作。如果你曾经用过Docker部署容器,那么可以将Docker看成Kubernetes底层使用的组件,Kubernetes是Docker的上层封装,通过它可以很方便的进行Docker集群的管理。今天我们使用minikube在单机上进行Kubern
Stella981 Stella981
3年前
Kubernetes 学习24 helm入门
一、概述  1、我们此前在使用kubernetes中,无论我们使用无状态的应用程序,比如myapp,nginx。以及有状态的tomcat,redis,etcd,...等等,他们部署在k8s之上会有这样的问题。首先对无状态应用我们首先使用deployment控制器来实现控制以后其规模伸缩极其容易。这也是k8s带给我们的最重要的需要。但是如果是有状态的应用,
Stella981 Stella981
3年前
Kubernetes 学习笔记(二):本地部署一个 kubernetes 集群
目标是方便快捷地部署一个比较稳定的k8s集群前言前面用到过的minikube只是一个单节点的k8s集群,这对于学习而言是不够的。我们需要有一个多节点集群,才能用到各种调度/监控功能。而且单节点只能是一个加引号的“集群”。kubernetes安装方式面面观kubernetes是一个
Wesley13 Wesley13
3年前
K8S为何杀死我的应用
首发公众号:二进制社区,转载联系:binary0101@126.com导读"K8S为我们提供自动部署调度应用的能力,并通过健康检查接口自动重启失败的应用,确保服务的可用性,但这种自动运维在某些特殊情况下会造成我们的应用陷入持续的调度过程导致业务受损,本文就生产线上一个核心的平台应用被K8S频繁重启调度问题展开剖解,抽丝剥茧一
Easter79 Easter79
3年前
TiDB on Kubernetes 最佳实践
作者介绍:吴叶磊PingCAPCloud工程师。随着Kubernetes(K8s)的全面成熟,越来越多的组织开始大规模地基于K8s构建基础设施层。然而,考虑到数据库在架构中的核心地位与K8s在有状态应用编排上的短板,仍有不少组织认为在K8s上运行核心数据库会带来颇高的风险。事实上,在K8s上运行TiDB不仅能实现企业技术
Easter79 Easter79
3年前
SpringCloud Alibaba微服务实战十六
点击上方 蓝字关注我们概述好久没有更新SpringCloudAlibaba系列的文章了,今天我们来将版本升级到最新的毕业版本。并且将原来容器化部署的组件seata、nacos、sentinel拉出来单独部署,为我们后面k8s部署作准备。官方推荐版本如下:!(https://oscimg.oschina.net/oscnet/e7f
DevOpSec DevOpSec
2年前
自建k8s集群之负载均衡使用
自建k8s而非云环境,组件mysql类(部分有状态服务)部署在虚机里也即集群外,业务服务部署在k8s集群内。需求:集群内、集群外,业务服务和组件相互间通过负载均衡、高可用的形式连通。此需求拆解成两个问题进行解决,接着往下看。集群内:k8s集群集群外:k8s集群外的应用部署在虚拟机或物理机环境