API分组
有时我们会在一个Operator项目中实现多个控制器来管理不同的API资源组。比如如果要实现一个ai-operator项目,其中可能包含模型训练相关的控制器trainjob-controller和推理服务相关的控制器atom-controller。那么如何将API分别放到apps组和batch组中呢。
首先通过Operator做一些简单工作:
operator-sdk edit --multigroup=true
这个命令的能力其实非常有限,它只是在Dockerfile文件中将api目录变成了 apis/目录,然后在 PROJECT文件 中加了一行multigroup:true
接下来手动创建
cd ~/MyOperatorProjects/application-operator
mdkir -p apis/apps
mv api/v* apis/apps/
rm -rf api/
这时旧版的API就被挪动到合适的目录了。接着还需要挪动controllers目录内的控制器相关源文件:
mkdir -p controllers/apps
mv controllers/*.go controllers/apps/
目录结构移动好了。接下来就是对应源文件内的import部分引用的更新了。如果是用IDE做的重构,这些引用应该会自动更新。import的更新非常简单,这里不再赘述,
还有一个细节就是suite_test.go中和envtest相关的代码要做一个小更新,因为将这个源文件放到了更深一层的目录中,所以这行代码如下:
# CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")],
# 更新为
CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")],
到这里就完成了API分组支持的配置。记得PROJECT文件中多出来的一行multigroup: true
配置吗?这行配置会告诉Operator后面新增的API不要放到api/目录下,而是放到 apis/目录下;另外控制器的代码也不再放到controllers目录下而是放到controllers/目录下
结尾
自此operator系列就完结了,希望整个流程会让大家对自定义资源有一个很好的入门体验。当然,kubernetes的内容还是比较多的,有兴趣的伙伴可以自己深挖一下,祝你们乘风破浪!