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:importsmain.go指示在此处为新控制器/Webhook/API 注入 import。
+kubebuilder:scaffold:schememain.goinit()向 runtime scheme 注册 API 版本。
+kubebuilder:scaffold:buildermain.go指示在此处向 manager 注册新控制器。
+kubebuilder:scaffold:webhookWebhook 测试相关文件指示在此处添加 Webhook 的初始化函数。
+kubebuilder:scaffold:crdkustomizeresourceconfig/crd指示在此处添加 CRD 自定义资源补丁。
+kubebuilder:scaffold:crdkustomizewebhookpatchconfig/crd指示在此处添加 CRD Webhook 补丁。
+kubebuilder:scaffold:crdkustomizecainjectionnsconfig/default指示在此处添加转换 Webhook 的 CA 注入补丁(命名空间)。
+kubebuilder:scaffold:crdkustomizecainjectionameconfig/default指示在此处添加转换 Webhook 的 CA 注入补丁(名称)。
(不再支持)+kubebuilder:scaffold:crdkustomizecainjectionpatchconfig/crd旧的 Webhook CA 注入补丁位置;现已由上面两个标记替代。
+kubebuilder:scaffold:manifestskustomizesamplesconfig/samples指示在此处注入 Kustomize 示例清单。
+kubebuilder:scaffold:e2e-webhooks-checkstest/e2e基于已生成的 Webhook 类型添加相应的 e2e 校验。