部署 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(例如,使用格式不正确的调度字段)。您应该会看到创建失败并出现验证错误。