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

部署 Admission Webhooks

Kind Cluster

建议使用 kind 集群来更快速的开发 webhook。 为什么呢?

  • 你可以在 1 分钟内本地启动有多个节点的集群。
  • 你可以在几秒中内关闭它。
  • 你不需要把你的镜像推送到远程仓库。

证书管理

你要遵循这个来安装证书管理器。

构建你的镜像

运行下面的命令来本地构建你的镜像。

make docker-build

如果你使用的是 kind 集群,那么你不需要把镜像推送到远程容器仓库。你可以直接加载你本地的镜像到你的 kind 集群:

kind load docker-image your-image-name:your-tag

部署 Webhooks

你需要通过启用 webhook 和证书管理配置。config/default/kustomization.yaml 应该看起来是这样子的:

# 为所有资源添加名字空间
namespace: project-system

# 这个字段的值会加在所有资源名字的前面,比如一个叫做 "wordpress" 的 deployment 会变成 "alices-wordpress"。
# 注意它应该和上面名字空间字段的前缀匹配('-' 之前的字符串)。
namePrefix: project-

# 要给所有资源和选择器添加的标签。
#commonLabels:
#  someName: someValue

bases:
- ../crd
- ../rbac
- ../manager
# [WEBHOOK] 用于启用 webhook,取消注释所有有 [WEBHOOK] 前缀的字段,包括在 crd/kustomization.yaml 中的。
- ../webhook
# [CERTMANAGER] 用于启用证书管理,需要取消带有 'CERTMANAGER' 的所有字段的注释。'WEBHOOK' 组件是必须的。
- ../certmanager
# [PROMETHEUS] 用于启用 prometheus 监控,取消带有 'PROMETHEUS' 的左右字段的注释。
#- ../prometheus

patchesStrategicMerge:
  # 通过给 /metrics 的 endpoint 加上认证来保护它。
  # 如果你想你的 controller-manager 暴露 /metrics 的 endpoint 并且不需要任何授权,那么注释掉下面这行。
- manager_auth_proxy_patch.yaml

# [WEBHOOK] 用于启用 webhook,取消注释所有有 [WEBHOOK] 前缀的字段,包括在 crd/kustomization.yaml 中的。
- manager_webhook_patch.yaml

# [CERTMANAGER] 用于启用证书管理,需要取消带有 'CERTMANAGER' 的所有字段的注释。
# 取消在 crd/kustomization.yaml 中 'CERTMANAGER' 部分的注释可以在 admission webhook 中启用 CA 注入。
# 需要启用 'CERTMANAGER' 来使用 ca 注入。
- webhookcainjection_patch.yaml

# 下面的配置是为了教授 kustomize 如何进行变量替换。
vars:
# [CERTMANAGER] 用于启用证书管理,取消带有 'CERTMANAGER' 前缀的所有部分注释。
- name: CERTIFICATE_NAMESPACE # CR 证书的命名空间
  objref:
    kind: Certificate
    group: cert-manager.io
    version: v1alpha2
    name: serving-cert # 这个名字应该和 certificate.yaml 文件中的一个名字相匹配
  fieldref:
    fieldpath: metadata.namespace
- name: CERTIFICATE_NAME
  objref:
    kind: Certificate
    group: cert-manager.io
    version: v1alpha2
    name: serving-cert # 这个名字应该和 certificate.yaml 文件中的一个名字相匹配
- name: SERVICE_NAMESPACE # service 的命名空间
  objref:
    kind: Service
    version: v1
    name: webhook-service
  fieldref:
    fieldpath: metadata.namespace
- name: SERVICE_NAME
  objref:
    kind: Service
    version: v1
    name: webhook-service

现在你可以通过下面的命令把它部署到你的集群中了:

make deploy IMG=<some-registry>/<project-name>:tag

等一会儿,webhook 的 pod 启动并且也提供了证书认证。这个过程通常需要 1 分钟。

现在你可以创建一个有效的 CronJob 来测试你的 webhook。这个过程应该会顺利通过的。

kubectl create -f config/samples/batch_v1_cronjob.yaml

你也能试着创建一个无效的 CronJob(比如使用一个非法格式的调度字段)。你应该可以看到创建失败并且有验证错误信息。