为 Kubebuilder 创建外部插件

概述

Kubebuilder 的功能可以通过外部插件进行扩展。这些插件是可执行文件(可以用任何语言编写),遵循 Kubebuilder 认可的执行模式。Kubebuilder 通过 stdinstdout 与这些插件进行交互,实现无缝通信。

为什么使用外部插件?

外部插件使第三方解决方案维护者能够将其工具与 Kubebuilder 集成。与 Kubebuilder 自身的插件类似,这些插件可以选择性使用,为用户提供工具选择的灵活性。通过在自己的代码库中开发插件,维护者确保更新与其 CI 流水线保持一致,并能够管理其责任范围内的任何变更。

如果您对这种类型的集成感兴趣,建议与第三方解决方案的维护者进行合作。Kubebuilder 的维护者始终乐意提供支持,以扩展其功能。

如何编写外部插件

Kubebuilder 与外部插件之间的通信通过标准输入/输出进行。可以使用任何语言创建插件,只要它遵循 PluginRequestPluginResponse 结构。

插件请求

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 上的插件 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

进一步的资源