Webhook 开发
概述
K8S 有 MutatingWebhook 和 ValidatingWebhook 两种类型的 Webhook,分别用于修改 Pod 的 Spec 和验证 Pod 的 Spec,本文教你如何用 kubebuilder 快速开发 Webhook。
快速创建 MutatingWebhook 和 ValidatingWebhook 脚手架代码
使用 kubebuilder 创建 Webhook 脚手架代码用 kubebuilder create webhook
,--defaulting
和 --programmatic-validation
参数分别表示 MutatingWebhook 和 ValidatingWebhook。
假如同时创建两种 Webhook,示例命令如下:
kubebuilder create webhook --group networking --version v1alpha1 --kind CLBPortPool --defaulting --programmatic-validation
创建 K8S 内置资源的 Webhook
有时候我们希望对 K8S 内置的资源进行一些校验和修改,比如为 Pod 支持一些自定义的注解,如果有设置相应注解就自动校验并创建本项目的 CRD 资源与 Pod 进行关联,再由本项目中的 controller 进行调谐。
如何实现呢?以给 Pod 添加 ValidatingWebhook 和 MutatingWebhook 为例,添加 Pod API 到项目但不创建 CRD 和控制器:
kubebuilder create api --group core --kind Pod --version v1 --controller=false --resource=false
然后再创建 Webhook:
kubebuilder create webhook --group core --version v1 --kind Pod --defaulting --programmatic-validation
最后再修改下初始化 manager 的代码,让它调用 SetupPodWebhookWithManager
。
限制 Webhook 作用范围
假如为 Pod 创建了 Webhook,但希望只针对带有特定注解或 label 的 Pod 生效,此时可以配置下匹配条件,避免对所有 Pod 生效。
如果 Pod Webhook 没配置匹配条件, 当 Manager Pod 异常(比如节点压力大被驱逐),可能导致所有 Pod 无法创建和修改,连 Manager Pod 自身也无法创建出来,导致整个集群陷入瘫痪。
- 匹配包含指定注解的 Pod
- 匹配指定 label 的 Pod
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: validating-webhook-configuration
webhooks:
- name: vpod-v1.kb.io
matchConditions:
- name: check-annotation
expression: |
'annotations' in object.metadata && 'networking.cloud.tencent.com/enable-clb-port-mapping' in object.metadata.annotations
apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
name: validating-webhook-configuration
webhooks:
- name: vpod-v1.kb.io
objectSelector:
matchExpressions:
- key: sidecar.istio.io/inject
operator: NotIn
values:
- "false"
将 Webhook 的自定义写成用于 patch 的 yaml,如 patch-match-conditions.yaml
,放在 config/webhook
目录下,然后修改该目录下的 kustomization.yaml
:
resources:
- manifests.yaml
- service.yaml
namePrefix: example-app-
configurations:
- kustomizeconfig.yaml
patches:
- path: patch-match-conditions.yaml
target:
group: admissionregistration.k8s.io
version: v1
kind: ValidatingWebhookConfiguration
name: validating-webhook-configuration