kubefate源码分析

Posted 小车云分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubefate源码分析相关的知识,希望对你有一定的参考价值。

1 概述

kubefatevmware团队针对联邦学习开源平台FATE做的云原生部署方案,可以很方便在K8S环境中,部署FATE计算集群,大大降低了部署的复杂度。

kubefate的实现代码是go语言,主要组件是kubefate控制器和mysql数据库,我们尝试对其源码进行剖析,加深对其部署原理的理解

 

2 基础库

几个关键的go框架和库是理解源码的关键

2.1 urfave/cli

go默认的命令行框架flag,但是处理不了复杂场景,例如子命令交互等,需要使用urfave/cli命令行框架

引用方法:   "github.com/urfave/cli/v2"

实例化应用:app:= &cli.App{}

例如定义多个交互子程序


然后通过serviceCommand()去实现具体任务

 

2.2 gin

gin是一个轻量级web框架,主要就是处理http的请求,并实现路径的路由

r := gin.Default()

r.GET("/ping", func(c *gin.Context) {c.JSON(200,gin.H{"message": "pong",})})

r.POST("/somePost", posting)

r.Run()

通过gin.Default()进行实例化,而r.Get或者r.POST可以针对不同的路径,调用不同的动作

最后r.Run()启动web服务,默认是8080端口

 

2.3 helm.sh/helm/v3

这个是helm的开源框架,kubefate这里强依赖这个库,实现在K8S中部署应用,用到的方法包括

helm.sh/helm/v3/pkg/chart

helm.sh/helm/v3/pkg/action

helm.sh/helm/v3/pkg/cli

helm.sh/helm/v3/pkg/repo

helm.sh/helm/v3/pkg/getter

 

2.4 gorm

gorm是一个对程序员友好的orm模型,可以对mysql和sqlite数据库的抽象

连接数据库:db,err := gorm.Open()

例如:gorm.Open(mysql.Open(dsn),&gorm.Config{Logger: newLogger})

 

2.5 uitable

目前的kubefate只支持在shell终端环境中进行FATE集群的增删改查的动作,所以需要以表格的形式在终端上显示,提高可阅读性,uitable等价于ui+table


3 目录结构

Go脚本分布在k8s-deploy/pkg目录下,由几个子目录构成,我们分为两类去理解

kubefate源码分析


3.1 前台类

3.1.1 cli目录

cli负责客户端的操作,包括显示uitable,解析命令行等


3.1.2 api目录

api负责提供统一的web访问接口,service服务端启动,集群和任务信息的查询等

 

3.2 后台类

3.2.1 job目录

job负责实际FATE集群的增删改查

 

3.2.2 modules

modules负责对数据表的增删改查,获取k8snamespace信息,helm安装,当然这里不是直接接口,需要通过其他函数调用


3.2.3 orm

orm负责对数据库的连接,不包括对数据表的具体操作

 

3.2.4 service

service负责连接k8s,通过k8s的核心库k8s.io/api/core/v1实现,这个跟pkg/api/service.go不一样,容易混淆

kubefate源码分析


3.2.5 utils

utils定义初始的配置,例如定义kubefate的服务端口

viper.SetDefault("serviceurl", "localhost:8080")

当然serviceurl参数也可以在config.yaml文件指定,viper库会去负责解析此配置

kubefate源码分析


4 实际工作流程

4.1 控制器服务端启动

命令行:go run kubefate.go service

实现脚本:pkg/api/service.go

kubefate源码分析

解释:通过gin.New()实例化一个gin类,并通过r.Run()启动gin服务,端口可以指定,默认8080

实际应用中,直接在Dockerfile中进行了指定

kubefate源码分析


4.2 客户端请求集群安装

命令行:go run kubefate.go cluster install -f ./cluster.yaml

实现脚本:pkg/api/cluster.go

kubefate源码分析

kubefate源码分析

解释:通过路径名/cluster进行路由转发,支持的方法有POSTGET等,每个方法都对应一个具体执行函数,例如cluster.POST的执行函数是c.createCluster

在上述客户端的请求路由转发到具体任务函数后,函数会继续调用job.ClusterInstall()执行实际的安装集群的任务,


4.3 任务执行

实现脚本:pkg/job/job.go

kubefate源码分析

ClusterInstall会启用go func(),调用HelmInstall()函数

kubefate源码分析

 

4.4 helm安装应用

任务最终执行时交给helm负责

实现脚本:pkg/modules/cluster_helm.go

kubefate源码分析

解释:由helm库的action类负责具体的应用安装


4.5 写入状态

执行成功后会将状态写到mysql数据库中

实现脚本:pkg/modules/job_db.go


整个安装过程基本完成


5 总结

整个kubefate的实现逻辑,就是以gin启动web服务,作为接收http请求的api server,然后客户端再访问这个api server,根据不同HTTP路径参数,区别不同的任务,FATE集群安装任务的完成由helm实现,最后再把执行结果的元信息写入到mysql数据库进行保存


上述介绍了集群安装的过程,而查询或者删除集群的过程也类似,都会调用pkg/job/job.go执行并保存元信息到mysql数据库

以上是关于kubefate源码分析的主要内容,如果未能解决你的问题,请参考以下文章

Mesos源码分析

Mybatis源码分析

Spring源码分析专题——目录

ARouter源码分析

Handler源码分析

Eureka源码分析(六) TimedSupervisorTask