Scaffold(脚手架)
+kubebuilder:scaffold 标记是 Kubebuilder 脚手架体系中的关键部分。它标注了在生成文件中的插入位置:当你脚手架出新的资源(例如控制器、Webhook 或 API)时,Kubebuilder 会在这些位置注入相应代码。
借助该机制,Kubebuilder 能够将新组件无缝集成到项目中,同时不影响用户自定义的代码。
工作原理(How It Works)
当你使用 Kubebuilder CLI(如 kubebuilder create api)来生成新资源时,CLI 会在关键位置寻找 +kubebuilder:scaffold 标记,并把它们当作占位点来插入必要的 import 或注册代码。
main.go 中的示例(Example Usage in main.go)
以下展示了 +kubebuilder:scaffold 在典型 main.go 文件中的用法。为便于说明,假设执行:
kubebuilder create api --group crew --version v1 --kind Admiral --controller=true --resource=true
添加新的导入(Imports)
+kubebuilder:scaffold:imports 标记允许 Kubebuilder CLI 注入额外的 import(例如新控制器或 Webhook 所需的包)。当我们创建新 API 时,CLI 会在此位置自动添加所需的导入路径。
以单组布局中新建 Admiral API 为例,CLI 会在 import 段落中添加 crewv1 "<repo-path>/api/v1":
import (
"crypto/tls"
"flag"
"os"
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
// to ensure that exec-entrypoint and run can make use of them.
_ "k8s.io/client-go/plugin/pkg/client/auth"
...
crewv1 "sigs.k8s.io/kubebuilder/testdata/project-v4/api/v1"
// +kubebuilder:scaffold:imports
)
注册新的 Scheme(Register a New Scheme)
+kubebuilder:scaffold:scheme 标记用于将新创建的 API 版本注册到 runtime scheme,确保这些类型能被 manager 识别。
例如,在创建 Admiral API 之后,CLI 会在 init() 函数中注入如下代码:
func init() {
...
utilruntime.Must(crewv1.AddToScheme(scheme))
// +kubebuilder:scaffold:scheme
}
设置控制器(Set Up a Controller)
当我们创建新的控制器(如 Admiral)时,Kubebuilder CLI 会借助 +kubebuilder:scaffold:builder 标记将控制器的初始化代码注入到 manager。这一标记指示了新控制器的注册位置。
例如,在创建 AdmiralReconciler 后,CLI 会添加如下代码将控制器注册到 manager:
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 标记确保新生成的控制器能正确注册至 manager,从而开始对资源进行调谐。
+kubebuilder:scaffold 标记列表
| 标记 | 常见位置 | 作用 |
|---|---|---|
+kubebuilder:scaffold:imports | main.go | 指示在此处为新控制器/Webhook/API 注入 import。 |
+kubebuilder:scaffold:scheme | main.go 的 init() | 向 runtime scheme 注册 API 版本。 |
+kubebuilder:scaffold:builder | main.go | 指示在此处向 manager 注册新控制器。 |
+kubebuilder:scaffold:webhook | Webhook 测试相关文件 | 指示在此处添加 Webhook 的初始化函数。 |
+kubebuilder:scaffold:crdkustomizeresource | config/crd | 指示在此处添加 CRD 自定义资源补丁。 |
+kubebuilder:scaffold:crdkustomizewebhookpatch | config/crd | 指示在此处添加 CRD Webhook 补丁。 |
+kubebuilder:scaffold:crdkustomizecainjectionns | config/default | 指示在此处添加转换 Webhook 的 CA 注入补丁(命名空间)。 |
+kubebuilder:scaffold:crdkustomizecainjectioname | config/default | 指示在此处添加转换 Webhook 的 CA 注入补丁(名称)。 |
(不再支持)+kubebuilder:scaffold:crdkustomizecainjectionpatch | config/crd | 旧的 Webhook CA 注入补丁位置;现已由上面两个标记替代。 |
+kubebuilder:scaffold:manifestskustomizesamples | config/samples | 指示在此处注入 Kustomize 示例清单。 |
+kubebuilder:scaffold:e2e-webhooks-checks | test/e2e | 基于已生成的 Webhook 类型添加相应的 e2e 校验。 |
