脚手架
+kubebuilder:scaffold
标记是 Kubebuilder 脚手架系统的一个关键部分。它标记了生成文件中将注入额外代码的位置,当新的资源(如控制器、webhook 或 API)被脚手架生成时。这使得 Kubebuilder 能够无缝地将新生成的组件集成到项目中,而不影响用户定义的代码。
它是如何工作的
当您使用 Kubebuilder CLI (例如,kubebuilder create api
)搭建新的资源时,CLI 会在关键位置识别 +kubebuilder:scaffold
标记,并将其作为占位符,用于插入所需的导入和注册代码。
main.go
中的示例用法
以下是如何在典型的 main.go
文件中使用 +kubebuilder:scaffold
标记。为了说明它的工作原理,考虑下面的命令来创建一个新的 API:
kubebuilder create api --group crew --version v1 --kind Admiral --controller=true --resource=true
添加新导入
+kubebuilder:scaffold:imports
标记允许 Kubebuilder CLI 注入额外的导入,例如新的控制器或 Webhook。当我们创建一个新的 API 时,CLI 会自动在此部分添加所需的导入路径。
例如,在单组布局中创建 Admiral
API 后,CLI 将在导入中添加 crewv1 "<repo-path>/api/v1"
:
import (
"crypto/tls"
"flag"
"os"
// 导入所有 Kubernetes 客户端认证插件(例如 Azure、GCP、OIDC 等)
// 以确保 exec-entrypoint 和 run 可以使用它们。
_ "k8s.io/client-go/plugin/pkg/client/auth"
...
crewv1 "sigs.k8s.io/kubebuilder/testdata/project-v4/api/v1"
// +kubebuilder:scaffold:imports
)
注册新方案
+kubebuilder:scaffold:scheme
标记用于将新创建的 API 版本注册到运行时方案中,以确保管理器能够识别这些 API 类型。
例如,在创建 Admiral API 后,CLI 将在 init()
函数中注入以下代码以注册该方案:
func init() {
...
utilruntime.Must(crewv1.AddToScheme(scheme))
// +kubebuilder:scaffold:scheme}
设置控制器
当我们创建一个新的控制器(例如,针对 Admiral 的控制器)时,Kubebuilder CLI 会使用 +kubebuilder:scaffold:builder
标记将控制器设置代码注入到管理器中。该标记指示应在何处添加新控制器的设置代码。
例如,在创建 AdmiralReconciler
之后,CLI 将添加以下代码以在管理器中注册控制器:
if err = (&crewv1.AdmiralReconciler{
Client: mgr.GetClient(),
Scheme: mgr.GetScheme(),
}).SetupWithManager(mgr); err != nil {
setupLog.Error(err, "unable to create controller", "controller", "Admiral")
os.Exit(1)
}
// +kubebuilder:scaffold:builder
+kubebuilder:scaffold:builder
标记确保新生成的控制器正确地注册到管理器中,以便控制器可以调整资源。
+kubebuilder:scaffold
标记列表
标记 | 通常位置 | 功能 |
---|---|---|
+kubebuilder:scaffold:imports | main.go | 标记新的控制器、网络钩子或 API 应该注入的位置。 |
+kubebuilder:scaffold:scheme | main.go 中的init() | 用于在运行时向方案添加 API 版本。 |
+kubebuilder:scaffold:builder | main.go | 标记新控制器应在管理器中注册的位置。 |
+kubebuilder:scaffold:webhook | webhooks 套件测试 文件 | 标记添加了 webhook 设置函数的地方。 |
+kubebuilder:scaffold:crdkustomizeresource | config/crd | 标记添加了 CRD 自定义资源补丁的地方。 |
+kubebuilder:scaffold:crdkustomizewebhookpatch | config/crd | 标记添加了 CRD webhook 补丁的地方。 |
+kubebuilder:scaffold:crdkustomizecainjectionns | config/default | 标记添加 CA 注入补丁的位置以进行转换 webhook。 |
+kubebuilder:scaffold:crdkustomizecainjectioname | config/default | 标记添加 CA 注入补丁的位置以进行转换 webhook。 |
(不再支持) +kubebuilder:scaffold:crdkustomizecainjectionpatch | config/crd | 标记添加 CA 注入补丁的位置用于 Webhook。已被 +kubebuilder:scaffold:crdkustomizecainjectionns 和 +kubebuilder:scaffold:crdkustomizecainjectioname 替代。 |
+kubebuilder:scaffold:manifestskustomizesamples | config/示例 | 标记 Kustomize 示例清单注入的位置。 |
+kubebuilder:scaffold:e2e-webhooks-checks | 测试/e2e | 根据所搭建的 Webhook 类型,新增端到端检查。 |