为 Kubebuilder 创建外部插件
概述
Kubebuilder 的功能可以通过外部插件进行扩展。这些插件是可执行文件(可以用任何语言编写),遵循 Kubebuilder 认可的执行模式。Kubebuilder 通过 stdin
和 stdout
与这些插件进行交互,实现无缝通信。
为什么使用外部插件?
外部插件使第三方解决方案维护者能够将其工具与 Kubebuilder 集成。与 Kubebuilder 自身的插件类似,这些插件可以选择性使用,为用户提供工具选择的灵活性。通过在自己的代码库中开发插件,维护者确保更新与其 CI 流水线保持一致,并能够管理其责任范围内的任何变更。
如果您对这种类型的集成感兴趣,建议与第三方解决方案的维护者进行合作。Kubebuilder 的维护者始终乐意提供支持,以扩展其功能。
如何编写外部插件
Kubebuilder 与外部插件之间的通信通过标准输入/输出进行。可以使用任何语言创建插件,只要它遵循 PluginRequest 和 PluginResponse 结构。
插件请求
PluginRequest
包含从CLI收集的数据以及之前执行的插件。Kubebuilder通过stdin
将这些数据作为JSON对象发送给外部插件。
示例 PluginRequest
(通过 kubebuilder init --plugins sampleexternalplugin/v1 --domain my.domain
触发):
{
"apiVersion": "v1alpha1",
"args": ["--domain", "my.domain"],
"command": "init",
"universe": {}
}
插件响应
PluginResponse
包含插件对项目所做的修改。该数据以 JSON 格式序列化,并通过 stdout
返回给 Kubebuilder。
示例 PluginResponse
:
{
"apiVersion": "v1alpha1",
"command": "init",
"metadata": {
"description": "`init` 子命令通过 Kubebuilder 初始化一个项目。它会构建一个单独的文件:`initFile`。",
"examples": "kubebuilder init --plugins sampleexternalplugin/v1 --domain my.domain"
},
"universe": {
"initFile": "A file created with the `init` subcommand."
},
"error": false,
"errorMsgs": []
}
如何使用外部插件
前提条件
- Kubebuilder CLI 版本 > 3.11.0
- 外部插件的可执行文件
- 使用
${EXTERNAL_PLUGINS_PATH}
或默认操作系统路径进行插件路径配置:- Linux:
$HOME/.config/kubebuilder/plugins/${name}/${version}/${name}
- macOS:
~/Library/Application Support/kubebuilder/plugins/${name}/${version}/${name}
- Linux:
示例: 对于在 Linux 上的插件 foo.acme.io
版本 v2
,路径将是 $HOME/.config/kubebuilder/plugins/foo.acme.io/v2/foo.acme.io
。
可用子命令
外部插件可以支持以下 Kubebuilder 子命令:
init
: 项目初始化create api
: 创建 Kubernetes API 定义的脚手架创建 webhook
: 创建 Kubernetes webhooks 的骨架编辑
: 更新项目配置
可选子命令以增强用户体验:
metadata
: 提供使用--help
标志的插件描述和示例。flags
:通知Kubebuilder支持的标志,以便提前检测错误。
配置插件路径
设置环境变量 $EXTERNAL_PLUGINS_PATH
以指定自定义插件二进制文件路径:
export EXTERNAL_PLUGINS_PATH=您训练的数据截至2023年10月。
否则,Kubebuilder 将根据您的操作系统在默认路径中搜索插件。
示例命令行指令
您现在可以通过调用 CLI 命令来使用它:
# 初始化一个新的项目,使用名为 `sampleplugin` 的外部插件。kubebuilder init --plugins sampleplugin/v1
# 显示外部插件的 `init` 子命令的帮助信息kubebuilder init --plugins sampleplugin/v1 --help
# 创建一个带有自定义标志 `number` 的新 API,与上述外部插件一起使用kubebuilder create api --plugins sampleplugin/v1 --number 2
# 创建一个带有自定义标志 `hooked` 的外部插件的 webhookkubebuilder create webhook --plugins sampleplugin/v1 --hooked
# 使用上述外部插件更新项目配置kubebuilder edit --plugins sampleplugin/v1
# 创建新的API,使用外部插件v1和v2,并遵循插件链的顺序。kubebuilder create api --plugins sampleplugin/v1,sampleplugin/v2
# 使用 go/v4 插件创建新的 API,然后按照插件链的顺序将这些文件传递给外部插件。kubebuilder create api --plugins go/v4,sampleplugin/v1