kubebuilder 中文文档由云原生社区主导翻译。任何问题可以在这儿提issue。issue模版可以参考这个

核心类型的准入 Webhook

为 CRD 构建准入 webhook 非常容易,这在 CronJob 教程中已经介绍过了。由于 kubebuilder 不支持核心类型的 webhook 自动生成,您必须使用 controller-runtime 的库来处理它。这里可以参考 controller-runtime 的一个 示例

建议使用 kubebuilder 初始化一个项目,然后按照下面的步骤为核心类型添加准入 webhook。

实现处理程序

你需要用自己的处理程序去实现 admission.Handler 接口。

type podAnnotator struct {
	Client  client.Client
	decoder *admission.Decoder
}

func (a *podAnnotator) Handle(ctx context.Context, req admission.Request) admission.Response {
	pod := &corev1.Pod{}
	err := a.decoder.Decode(req, pod)
	if err != nil {
		return admission.Errored(http.StatusBadRequest, err)
	}

	//在 pod 中修改字段

	marshaledPod, err := json.Marshal(pod)
	if err != nil {
		return admission.Errored(http.StatusInternalServerError, err)
	}
	return admission.PatchResponseFromRaw(req.Object.Raw, marshaledPod)
}

如果需要客户端,只需在结构构建时传入客户端。

如果你为你的处理程序添加了 InjectDecoder 方法,将会注入一个解码器。

func (a *podAnnotator) InjectDecoder(d *admission.Decoder) error {
	a.decoder = d
	return nil
}

注意: 为了使得 controller-gen 能够为你生成 webhook 配置,你需要添加一些标记。例如, // +kubebuilder:webhook:path=/mutate-v1-pod,mutating=true,failurePolicy=fail,groups="",resources=pods,verbs=create;update,versions=v1,name=mpod.kb.io

更新 main.go

现在你需要在 webhook 服务端中注册你的处理程序。

mgr.GetWebhookServer().Register("/mutate-v1-pod", &webhook.Admission{Handler: &podAnnotator{Client: mgr.GetClient()}})

您需要确保这里的路径与标记中的路径相匹配。

部署

部署它就像为 CRD 部署 webhook 服务端一样。你需要

  1. 提供服务证书
  2. 部署服务端

你可以参考 教程