rancher
项目结构
./
| -- pkg
| -- api // api的初始化、导入
| -- apis // api(crd)的定义
| -- client/generated // norman生成
| -- codegen // 代码生成程序
| -- controllers // 控制器的业务代码逻辑
| -- generated // wrangler生成
| -- schemas // api的Schema描述配置
CRD 定义
k8s的资源:主要分core族(/api/{version}/前缀)、apis族(/apis/{group}/{version}前缀),每种资源属于某个族下面的组(core族不区分组,只有版本),并且可以有不同的版本。
https://github.com/rancher/rancher/blob/release/v2.6/pkg/apis/management.cattle.io/v3/cluster_types.go
以pkg/apis/management.cattle.io/v3这个包为例。rancher的代码生成分两部分,
-
crd的新增和导入,包括api的schema(请求参数/访问路由/数据校验/…)定义,
-
controller基础代码。两者依赖normal和wrangler。
crd定义crd_types.go
资源级别
CRD 具有以下 2 个字段以使其成为集群级资源
1 |
|
CRD 具有这两个字段以使其成为项目级资源
1 |
|
schema 定义 api response
pkg/schemas/*
https://github.com/rancher/rancher/blob/release/v2.6/pkg/schemas/management.cattle.io/v3/schema.go
schema
1 |
|
定义好以后初始化
1 |
|
生成代码
包括crd新增导入,api定义,controller基础代码
1 |
|
初始化配置 shema/validators/ formatters/action/link
https://github.com/rancher/rancher/blob/release/v2.6/pkg/api/norman/server/managementstored/setup.go
定义shema把串联起来
1 |
|
创建crd
1 |
|
validators,stores,formatters用于按序处理请求
validators
API 请求转发到 Kubernetes 之前检查其输入,那么您可能需要使用验证器。验证器的另一个用途是阻止一种请求。值得一提的是,验证器仅适用于 Post 和 Put 请求。
包含验证器的文件位于 pkg/api/norman/customization/ 文件夹中在
https://github.com/rancher/rancher/blob/release/v2.6/pkg/api/norman/customization/cluster/validator.go
1 |
|
这是个校验参数的例子
关于必填项norman:”required”,一定要配合json的omitempty使用,不然就会越过校验,noreman只是检查是否存在key,不关心value是否为空
1 |
|
Formatters
用于改变api response的schema输出。和validators的创建和分配差不多。是唯一可以编辑link的地方
Action Handlers
处理除了create, update, delete, get, watch的操作的api
Store
Stores can transform and filter requests, similar to formatters and validators. Unlike validators, stores can be used for Delete, Watch, List, and ByID, in addition to Create and Update.
controller
这里以cluster为例。
- 业务controller放在目录”pkg/controllers/management/cluster“。
- 初始化controller需要在文件”pkg/controllers/management/controller.go” 调用 cluster.Register(ctx, management)注册监听
Contexts分类
- one ScaledContext per management server (3)
- one ManagementContext per management server master (1)
- one UserContext per downstream cluster. When referring to contexts a ‘user’ means a single downstream cluster.
放在pkg/controllers
- management controllers 用 ManagementContext and handles actions 管理master server,例如全局变化
- user controllers use the UserContext and handle actions 管理下游集群,
AddHandler vs AddClusterScopedHandler vs AddLifecycle
AddHandler
为您的控制器提供其正在侦听的资源的所有实例的更新
AddClusterScopedHandler
更新本集群内所有实例
AddLifecycle
比AddHandler
复杂, 按照不同事件区分Create/Update/Delete方法更新
V1
定义shema
1 |
|
生成代码
运行
1 |
|
生成pkg/apis/ui.cattle.io/zz_*.go,pkg/generated/controllers/ui.cattle.io/interface.go 和对应的controller
绑定crd
pkg/crds/dashboard/crds.go
1 |
|
设置无create crd的v1
pkg/codegen/main.go
创建v1/xx_types
然后其他步骤和上面一样
展示
create功能的v1 crd
启用
选用go version 1.17,使用高版本codegen会报错
调试运行需要安装集群和docker,环境配置。
1 |
|
观察启动日志,可看到新定义的crd导入。所有api的浏览链接 https://localhost:8443/v3 OR https://localhost:8443/v1
一个比较麻烦的地方,第一次启动需要翻墙因为默认从官网获取UI,第一次启动后可以在全局设置修改UI获取方式改成local
然后从对应版本的rancher镜像,docker cp出对应的UI文件放在本地。
https://github.com/rancher/rancher/blob/release/v2.6/pkg/settings/setting.go
1 |
|
目录在这里有两个目录
building
参考这个https://rancher.com/docs/rancher/v2.6/en/contributing/ ,最好在翻墙情况下完成
1 |
|
validate 主要是静态检查,test就是跑测试的
package时候要把.dockerignore去掉,这样才会引用到build的结果
1 |
|