脚手架

+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:importsmain.go标记新的控制器、网络钩子或 API 应该注入的位置。
+kubebuilder:scaffold:schememain.go中的init()用于在运行时向方案添加 API 版本。
+kubebuilder:scaffold:buildermain.go标记新控制器应在管理器中注册的位置。
+kubebuilder:scaffold:webhookwebhooks 套件测试 文件标记添加了 webhook 设置函数的地方。
+kubebuilder:scaffold:crdkustomizeresourceconfig/crd标记添加了 CRD 自定义资源补丁的地方。
+kubebuilder:scaffold:crdkustomizewebhookpatchconfig/crd标记添加了 CRD webhook 补丁的地方。
+kubebuilder:scaffold:crdkustomizecainjectionnsconfig/default标记添加 CA 注入补丁的位置以进行转换 webhook。
+kubebuilder:scaffold:crdkustomizecainjectionameconfig/default标记添加 CA 注入补丁的位置以进行转换 webhook。
(不再支持) +kubebuilder:scaffold:crdkustomizecainjectionpatchconfig/crd标记添加 CA 注入补丁的位置用于 Webhook。已被 +kubebuilder:scaffold:crdkustomizecainjectionns+kubebuilder:scaffold:crdkustomizecainjectioname 替代。
+kubebuilder:scaffold:manifestskustomizesamplesconfig/示例标记 Kustomize 示例清单注入的位置。
+kubebuilder:scaffold:e2e-webhooks-checks测试/e2e根据所搭建的 Webhook 类型,新增端到端检查。