部署 Admission Webhook

cert-manager

您需要按照此处的指示安装 cert-manager 套件。

构建你的形象

运行以下命令以在本地构建您的镜像。

make docker-build docker-push IMG=<some-registry>/<project-name>:tag

部署 Webhooks

您需要通过 kustomize 启用 webhook 和证书管理器配置。config/default/kustomization.yaml 现在应该如下所示:

# 为所有资源添加命名空间。
命名空间: 项目系统

# 此字段的值将作为前缀添加到所有资源的名称,例如,一个名为
# "wordpress"的部署会变成"alices-wordpress"。
# 请注意,它还应与上面命名空间字段中"-"之前的前缀匹配。
namePrefix: 项目-

# 要添加到所有资源和选择器的标签。
#labels:
#- includeSelectors: true
#  pairs:
#    someName: someValue

resources:
- ../crd
- ../rbac
- ../manager
# [WEBHOOK] 要启用 webhook,请取消注释所有带有 [WEBHOOK] 前缀的部分,包括在
# crd/kustomization.yaml中的那部分。- ../webhook
# [CERTMANAGER] 要启用 cert-manager,请取消注释所有包含 'CERTMANAGER' 的部分。'WEBHOOK' 组件是必需的。- ../证书管理器
# [PROMETHEUS] 要启用 Prometheus 监控,请取消注释所有包含 'PROMETHEUS' 的部分。- ../prometheus
# [指标] 暴露控制器管理器指标服务。- metrics_service.yaml
# [网络策略] 使用 NetworkPolicy 保护 /metrics 端点和 Webhook 服务器。
# 只有运行在标记为 'metrics: enabled' 的命名空间中的 Pod 才能够收集指标。
# 只有需要 Webhook 的 CR 且应用于标记为 'webhooks: enabled' 的命名空间的 CR 才能够
# 与 Webhook 服务器进行通信。
#- ../network-policy

# 如果您启用度量,请取消注释补丁行
补丁:
# [指标] 以下补丁将使用 HTTPS 启用指标端点,端口为 :8443。
# 更多信息: https://book.kubebuilder.io/reference/metrics
- path: manager_metrics_patch.yaml
  目标:
    kind: 部署

# 如果您启用 Metrics 和 CertManager,请取消注释补丁行。- path: cert_metrics_manager_patch.yaml
  目标:
    kind: 部署

# [WEBHOOK] 要启用 webhook,请取消注释所有带有 [WEBHOOK] 前缀的部分,包括在
# crd/kustomization.yaml中的那部分。- path: manager_webhook_patch.yaml
  目标:
    kind: 部署

# [CERTMANAGER] 要启用 cert-manager,请取消注释所有带有 'CERTMANAGER' 前缀的部分。
# 取消注释以下替换,以添加 cert-manager CA 注入注释
替换项:
 - source: # 取消注释以下代码块以启用度量的证书
     类型: 服务
     version: v1
     name: 控制器管理器指标服务
     字段路径: 元数据.名称
   目标:
     - 选择:
         kind: 证书
         group: cert-manager.io
         version: v1
         name: 度量标准-证书
       字段路径:
         - spec.dnsNames.0
         - spec.dnsNames.1
       选项:
         分隔符: '.'
         索引: 0
         create: true
     - 选择: # 取消注释以下内容以在 Prometheus ServiceMonitor 中设置 TLS 配置的服务名称
         kind: 服务监控器
         group: monitoring.coreos.com
         version: v1
         name: 控制器管理器监控指标
       字段路径:
         - spec.endpoints.0.tlsConfig.serverName
       选项:
         分隔符: '.'
         索引: 0
         create: true

 - source:
     kind: 服务
     version: v1
     name: 控制器管理器指标服务
     字段路径: metadata.namespace
   目标:
     - 选择:
         kind: 证书
         group: cert-manager.io
         version: v1
         name: 度量标准-证书
       字段路径:
         - spec.dnsNames.0
         - spec.dnsNames.1
       选项:
         分隔符: '.'
         索引: 1
         create: true
     - 选择: # 取消注释以下内容以设置 Prometheus ServiceMonitor 中 TLS 的服务命名空间
         kind: 服务监控器
         group: monitoring.coreos.com
         version: v1
         name: 控制器管理器监控指标
       字段路径:
         - spec.endpoints.0.tlsConfig.serverName
       选项:
         分隔符: '.'
         索引: 1
         create: true

 - source: # 如果您有任何 webhook,请取消注释以下代码块。: 服务
     version: v1
     name: Webhook 服务
     字段路径: .metadata.name # 服务名称
   目标:
     - 选择:
         kind: 证书
         group: cert-manager.io
         version: v1
         name: 服务证书
       字段路径:
         - .spec.dnsNames.0
         - .spec.dnsNames.1
       选项:
         分隔符: '.'
         索引: 0
         create: true
 - source:
     kind: 服务
     version: v1
     name: Webhook 服务
     字段路径: .metadata.namespace # 服务的命名空间
   targets:
     - 选择:
         kind: 证书
         group: cert-manager.io
         version: v1
         name: 服务证书
       字段路径:
         - .spec.dnsNames.0
         - .spec.dnsNames.1
       选项:
         分隔符: '.'
         索引: 1
         create: true

 - source: # 如果您有一个有效的验证Webhook (--programmatic-validation),请取消注释以下代码块
     kind: 证书
     group: cert-manager.io
     version: v1
     name: serving-cert # 此名称应与 certificate.yaml 中的名称匹配
     fieldPath: .metadata.namespace # 证书 CR 的命名空间
   目标:
     - 选择:
         kind: 有效性Webhook配置
       字段路径:
         - .metadata.annotations.[cert-manager.io/inject-ca-from]
       选项:
         分隔符: '/'
         索引: 0
         create: true
 - source:
     kind: 证书
     group: cert-manager.io
     version: v1
     name: 服务证书
     字段路径: .metadata.name
   目标:
     - 选择:
         kind: 有效性Webhook配置
       字段路径:
         - .metadata.annotations.[cert-manager.io/inject-ca-from]
       选项:
         分隔符: '/'
         索引: 1
         create: true

 - source: # 如果你有一个默认的 Webhook (--defaulting),请取消注释以下代码块
     类型: 证书
     group: cert-manager.io
     version: v1
     name: 服务证书
     字段路径: .metadata.namespace # 证书 CR 的命名空间
   目标:
     - 选择:
         kind: 变更Webhook配置
       字段路径:
         - .metadata.annotations.[cert-manager.io/inject-ca-from]
       选项:
         分隔符: '/'
         索引: 0
         create: true
 - source:
     kind: 证书
     group: cert-manager.io
     version: v1
     name: 服务证书
     字段路径: .metadata.name
   目标:
     - 选择:
         kind: 变更Webhook配置
       字段路径:
         - .metadata.annotations.[cert-manager.io/inject-ca-from]
       选项:
         分隔符: '/'
         索引: 1
         create: true
#
# - 来源: # 如果您有 ConversionWebhook (--conversion),请取消注释以下块
#     类型: 证书
#     群组: cert-manager.io
#     版本: v1
#     名称: serving-cert
#     字段路径: .metadata.namespace # 证书 CR 的命名空间
#   目标: # 请勿删除或取消注释以下脚手架标记;这是生成目标 CRD 代码所需的。
# +kubebuilder:scaffold:crdkustomizecainjectionns
# - 来源:
#     类型: 证书
#     群组: cert-manager.io
#     版本: v1
#     名称: serving-cert
#     字段路径: .metadata.name
#   目标: # 请勿删除或取消注释以下脚手架标记;这是生成目标 CRD 代码所需的。
# +kubebuilder:scaffold:crdkustomizecainjectionname

现在 config/crd/kustomization.yaml 应该如下所示:

# 这个 kustomization.yaml 文件不打算单独运行,
# 因为它依赖于此 kustomize 包之外的服务名称和命名空间。
# 应通过 config/default 运行。
resources:
- bases/batch.tutorial.kubebuilder.io_cronjobs.yaml
# +kubebuilder:scaffold:crdkustomizeresource

贴片:
# [WEBHOOK] 要启用 webhook,请取消注释所有以 [WEBHOOK] 为前缀的部分。
# 此处的补丁用于为每个 CRD 启用转换 webhook
# +kubebuilder:scaffold:crdkustomizewebhookpatch

# [WEBHOOK] 要启用 webhook,请取消注释以下部分
# 以下配置是为了教 kustomize 如何对 CRD 进行自定义。
# 配置:
#- kustomizeconfig.yaml

现在您可以通过以下方式将其部署到您的集群中:

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

请稍等,直到 webhook pod 启动并且证书被配置。通常在 1 分钟内完成。

现在您可以创建一个有效的 CronJob 来测试您的 webhooks。创建过程应该成功完成。

kubectl create -f config/samples/batch_v1_cronjob.yaml

您还可以尝试创建一个无效的 CronJob(例如,使用格式不正确的调度字段)。您应该会看到创建失败并出现验证错误。