部署 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(比如使用一个非法格式的调度字段)。你应该可以看到创建失败并且有验证错误信息。