kubefate源码分析
Posted 小车云分享
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kubefate源码分析相关的知识,希望对你有一定的参考价值。
1 概述
kubefate是vmware团队针对联邦学习开源平台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目录下,由几个子目录构成,我们分为两类去理解
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负责对数据表的增删改查,获取k8s的namespace信息,helm安装,当然这里不是直接接口,需要通过其他函数调用
3.2.3 orm
orm负责对数据库的连接,不包括对数据表的具体操作
3.2.4 service
service负责连接k8s,通过k8s的核心库k8s.io/api/core/v1实现,这个跟pkg/api/service.go不一样,容易混淆
3.2.5 utils
utils定义初始的配置,例如定义kubefate的服务端口
viper.SetDefault("serviceurl", "localhost:8080")
当然serviceurl参数也可以在config.yaml文件指定,viper库会去负责解析此配置
4 实际工作流程
4.1 控制器服务端启动
命令行:go run kubefate.go service
实现脚本:pkg/api/service.go
解释:通过gin.New()实例化一个gin类,并通过r.Run()启动gin服务,端口可以指定,默认8080
实际应用中,直接在Dockerfile中进行了指定
4.2 客户端请求集群安装
命令行:go run kubefate.go cluster install -f ./cluster.yaml
实现脚本:pkg/api/cluster.go
解释:通过路径名/cluster进行路由转发,支持的方法有POST,GET等,每个方法都对应一个具体执行函数,例如cluster.POST的执行函数是c.createCluster
在上述客户端的请求路由转发到具体任务函数后,函数会继续调用job.ClusterInstall()执行实际的安装集群的任务,
4.3 任务执行
实现脚本:pkg/job/job.go
ClusterInstall会启用go func(),调用HelmInstall()函数
4.4 helm安装应用
任务最终执行时交给helm负责
实现脚本:pkg/modules/cluster_helm.go
解释:由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源码分析的主要内容,如果未能解决你的问题,请参考以下文章