弹性资源组件elastic-resource设计(二)-集群

简介

       弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。

       本文介绍弹性资源组件的设计,包括架构设计和详细设计,指导开发人员代码开发,设计基于《flink原理源码分析(一) 集群与资源@k8s》,抽出作业管理器,包括其内部的调度器,通用化为资源消费者,标准化与资源管理器和任务管理器的交互接口;增加约束,如,组件间通讯rpc组件,高可用组件,心跳组件等,最大程度使用原flink代码,后续的迭代不断标准化,抽象化交互接口,支持不同的实现。

关键词

资源消费者/资源管理器/任务管理器  弹性资源组件关联的3个主要角色

参考资料

《flink原理源码分析(一) 集群与资源@k8s》 详细分析了flink集群与资源的源码和原理

场景视图

弹性资源组件elastic-resource设计(二)-集群_第1张图片

上图是场景视图

  • 集群

集群启动,master和worker构建,k8s环境下,涉及k8s客户端的使用

  • 资源管理器

资源的申请,管有资源

  • 任务管理器

资源的提供,任务执行

  • 功能组件

功能组件的原理和用法解释

  • 资源消费者

描述弹性资源组件接入规范

技术架构

弹性资源组件的技术架构图,其中作业管理器接入系统提供,需实现与资源管理器和任务管理器的交互, 还有一些技术要求。

总体架构是master-worker,master的高可用是k8s的复制机制提供,选主机制k8s提供,作业管理器和资源管理器参与选主,作业管理器/任务管理器接入资源管理器主节点监听,获取最新资源管理器;作业管理器接入作业管理器主节点监听,获取最新的作业管理器主节点

数据架构,资源是组件的核心数据,分两条线a线 现有资源,b线 待定资源

  1. 4资源请求->5a 分配可用资源-> 6a 请求使用资源-> 7a 提供资源->8a 提交任务
  2. 4资源请求->5b 分配待定资源-> 6b 请求新worker-> 7b 启动任务管理器->8b 注册/报告资源

a线是分配现有资源;b线请求新资源,新资源注册后是现有资源,在a线分配

组件架构

上图弹性资源组件架构,作为SDK,提供RPC,slot池,心跳,高可用等组件支持,这些组件有约束的,有可选用的

集群模块

    集群是资源的载体,弹性资源基础是弹性的集群,弹性资源集群架构采用master-worker,首先启动master,master包括资源消费者,资源管理器,master是弹性的决策器,控制worker的部署和释放

弹性资源组件elastic-resource设计(二)-集群_第2张图片

启动集群

管理员通过命令行或管理台,启动集群,提供环境配置和参数配置;部署k8smaster,使用kuebclient发起构建Deplolyment资源和其他资源

k8s集群管理器收到部署请求执行master启动脚本,部署和启动master,随着资源消费者的资源申请,部署和启动新的任务管理器

启动集群

弹性资源组件elastic-resource设计(二)-集群_第3张图片

Configuration配置容器

  1. 用户命令行执行elastic-resource.sh,主入口是ElasticResourceCli main
  2. ClusterClientServiceLoader SPI机制载入ClusterClientFactory,k8s环境下实现类是KubernetesClusterClientFactory
  3. ClusterClientFactory是ClusterClient工厂,首先创建ClusterDescriptor集群描述,该类负责部署集群,最终返回ClusterClient,k8s环境下实现类是KubernetesClusterDescriptor
  4. KubernetesClusterDescriptor新建集群规格ClusterSpecification,该类不是针对k8s,定义了flink master和任务管理器的内存容量等技术参数,通用于容器类的集群
  5. KubernetesClusterDescriptor的deploySessionCluster部署k8s集群,参看《部署k8s master》用例
  6. 最后返回ClusterClient,用于后续集群操作

部署k8s master

部署k8s master是集群启动的第二步,KubernetesClusterDescriptor的deployClusterInternal方法,构建部署规格,使用flink kubeclient提交到k8s集群管理器,触发部署和启动master

弹性资源组件elastic-resource设计(二)-集群_第4张图片

  1. 首先更新配置,主要是对外端口,更新为固定的,支持对外Service通讯
  2. 构建KubernetesMasterComponentParameters,该类包装Configuration和ClusterSpecification,为获取参数提供便利
  3. 构建CommponentPod,首先载入pod模板构建KubernetesPod,KubernetesPod是一个包装了k8s Pod对象的Resource类,然后以KubernetesPod构建CommponentPod,定义了mainContainer ,podWithoutMainContainer,其中主容器固定名称,用于运行资源消费者任务管理器,其他容器运行相关的资源,如ConfigMap,Service等,详细分析参考kubeclient
  4. KubernetesMasterFactory构建部署规格,KubeClient使用部署规格部署master组件,两用例在kubeclient分析,k8s集群管理器《部署和启动master》
  5. 最后客户端调用createClusterClientProvider返回ClusterClient

部署和启动master

启动集群触发部署和启动master,包括资源消费者资源管理器,其中资源消费者接入系统提供,并提供工厂实现

弹性资源组件elastic-resource设计(二)-集群_第5张图片

上图是构建和启动弹性资源master的交互图,参看构建kubeclient构建master组件的CmdMasterDecorator设置了容器初始执行脚本和参数,集群初始入口KubernetesClusterEntryPoint

  1. 容器初始执行elastic-resource-master.sh,ClusterEntryPoint设置为KubernetesClusterEntrypoint

    2. KubernetesClusterEntrypoint继承ClusterEntrypoint,MasterComponentFactory关联接入系统提供的ResourceConsumerComponentFactory,用于构建资源消费者

   3. 经过容错日志,插件文件系统初始化,进入ClusterEntrypoint的runCluster,该方法主要做两个事,initializeServicesMasterComponent

    4. initializeServices构建基础服务,Rpc服务,slot池组件,ha服务,metrics服务等

    5. MasterComponent  master组件初始化和启动;同时也是持有者,用于后面关闭和清理

至此,master启动,资源消费者消费资源,资源管理器随着资源消费部署和启动新的任务管理器

部署和启动任务管理器

资源管理器按需启动任务管理器增加资源

弹性资源组件elastic-resource设计(二)-集群_第6张图片

  1. 新建任务管理器与新建master组件类似,pod装饰器CmdTaskManagerDecorator实现了pod装饰,设置shell执行命令和执行参数

弹性资源组件elastic-resource设计(二)-集群_第7张图片

设置执行脚本KUBERNETES_TASK_MANAGER_SCRIPT_PATH= "elastic-source-worker.sh"

主入口KubernetesTaskExecutorRunner main

    2. 任务管理器启动比较简单,主要启动rpc服务和高可用组件,高可用组件触发注册任务管理器/报告资源

NEXT

弹性资源组件elastic-resource设计(三)-资源管理器

弹性资源组件elastic-resource设计(四)-任务管理器

弹性资源组件elastic-resource设计(五)-资源消费者接入规范

弹性资源组件elastic-resource设计(六)-功能组件,rpc,心跳,slotpool,metrics,kubeclient

你可能感兴趣的:(弹性资源组件设计与实现,flink,kubernetes,分布式)