跳到主要内容

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 自身也无法创建出来,导致整个集群陷入瘫痪。

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

将 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