简介
弹性资源组件提供动态资源能力,是分布式系统关键基础设施,分布式datax,分布式索引,事件引擎都需要集群和资源的弹性资源能力,提高伸缩性和作业处理能力。
本文介绍弹性资源组件的设计,包括架构设计和详细设计,指导开发人员代码开发,设计基于《flink原理源码分析(一) 集群与资源@k8s》,抽出作业管理器,包括其内部的调度器,通用化为资源消费者,标准化与资源管理器和任务管理器的交互接口;增加约束,如,组件间通讯rpc组件,高可用组件,心跳组件等,最大程度使用原flink代码,后续的迭代不断标准化,抽象化交互接口,支持不同的实现。
关键词
资源消费者/资源管理器/任务管理器 弹性资源组件关联的3个主要角色
参考资料
《flink原理源码分析(一) 集群与资源@k8s》 详细分析了flink集群与资源的源码和原理
场景视图
上图是场景视图
- 集群
集群启动,master和worker构建,k8s环境下,涉及k8s客户端的使用
- 资源管理器
资源的申请,管有资源
- 任务管理器
资源的提供,任务执行
- 功能组件
功能组件的原理和用法解释
- 资源消费者
描述弹性资源组件接入规范
技术架构
弹性资源组件的技术架构图,其中作业管理器接入系统提供,需实现与资源管理器和任务管理器的交互, 还有一些技术要求。
总体架构是master-worker,master的高可用是k8s的复制机制提供,选主机制k8s提供,作业管理器和资源管理器参与选主,作业管理器/任务管理器接入资源管理器主节点监听,获取最新资源管理器;作业管理器接入作业管理器主节点监听,获取最新的作业管理器主节点
数据架构,资源是组件的核心数据,分两条线a线 现有资源,b线 待定资源
- 4资源请求->5a 分配可用资源-> 6a 请求使用资源-> 7a 提供资源->8a 提交任务
- 4资源请求->5b 分配待定资源-> 6b 请求新worker-> 7b 启动任务管理器->8b 注册/报告资源
a线是分配现有资源;b线请求新资源,新资源注册后是现有资源,在a线分配
组件架构
上图弹性资源组件架构,作为SDK,提供RPC,slot池,心跳,高可用等组件支持,这些组件有约束的,有可选用的
集群模块
集群是资源的载体,弹性资源基础是弹性的集群,弹性资源集群架构采用master-worker,首先启动master,master包括资源消费者,资源管理器,master是弹性的决策器,控制worker的部署和释放
启动集群
管理员通过命令行或管理台,启动集群,提供环境配置和参数配置;部署k8smaster,使用kuebclient发起构建Deplolyment资源和其他资源
k8s集群管理器收到部署请求执行master启动脚本,部署和启动master,随着资源消费者的资源申请,部署和启动新的任务管理器
启动集群
Configuration配置容器
- 用户命令行执行elastic-resource.sh,主入口是ElasticResourceCli main
- ClusterClientServiceLoader SPI机制载入ClusterClientFactory,k8s环境下实现类是KubernetesClusterClientFactory
- ClusterClientFactory是ClusterClient工厂,首先创建ClusterDescriptor集群描述,该类负责部署集群,最终返回ClusterClient,k8s环境下实现类是KubernetesClusterDescriptor
- KubernetesClusterDescriptor新建集群规格ClusterSpecification,该类不是针对k8s,定义了flink master和任务管理器的内存容量等技术参数,通用于容器类的集群
- KubernetesClusterDescriptor的deploySessionCluster部署k8s集群,参看《部署k8s master》用例
- 最后返回ClusterClient,用于后续集群操作
部署k8s master
部署k8s master是集群启动的第二步,KubernetesClusterDescriptor的deployClusterInternal方法,构建部署规格,使用flink kubeclient提交到k8s集群管理器,触发部署和启动master
- 首先更新配置,主要是对外端口,更新为固定的,支持对外Service通讯
- 构建KubernetesMasterComponentParameters,该类包装Configuration和ClusterSpecification,为获取参数提供便利
- 构建CommponentPod,首先载入pod模板构建KubernetesPod,KubernetesPod是一个包装了k8s Pod对象的Resource类,然后以KubernetesPod构建CommponentPod,定义了mainContainer ,podWithoutMainContainer,其中主容器固定名称,用于运行资源消费者,任务管理器,其他容器运行相关的资源,如ConfigMap,Service等,详细分析参考kubeclient
- KubernetesMasterFactory构建部署规格,KubeClient使用部署规格部署master组件,两用例在kubeclient分析,k8s集群管理器《部署和启动master》
- 最后客户端调用createClusterClientProvider返回ClusterClient
部署和启动master
启动集群触发部署和启动master,包括资源消费者,资源管理器,其中资源消费者接入系统提供,并提供工厂实现
上图是构建和启动弹性资源master的交互图,参看构建kubeclient构建master组件的CmdMasterDecorator设置了容器初始执行脚本和参数,集群初始入口KubernetesClusterEntryPoint
- 容器初始执行elastic-resource-master.sh,ClusterEntryPoint设置为KubernetesClusterEntrypoint
2. KubernetesClusterEntrypoint继承ClusterEntrypoint,MasterComponentFactory关联接入系统提供的ResourceConsumerComponentFactory,用于构建资源消费者
3. 经过容错日志,插件文件系统初始化,进入ClusterEntrypoint的runCluster,该方法主要做两个事,initializeServices和MasterComponent
4. initializeServices构建基础服务,Rpc服务,slot池组件,ha服务,metrics服务等
5. MasterComponent master组件初始化和启动;同时也是持有者,用于后面关闭和清理
至此,master启动,资源消费者消费资源,资源管理器随着资源消费部署和启动新的任务管理器
部署和启动任务管理器
资源管理器按需启动任务管理器增加资源
- 新建任务管理器与新建master组件类似,pod装饰器CmdTaskManagerDecorator实现了pod装饰,设置shell执行命令和执行参数
设置执行脚本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