k8s实践:快速开发自己的 K8S Adminssion Webhook

准入控制器介绍

引用 K8S 官方文档的介绍:

准入 Webhook 是一种用于接收准入请求并对其进行处理的 HTTP 回调机制。 可以定义两种类型的准入 Webhook, 即验证性质的准入 Webhook变更性质的准入 Webhook。 变更性质的准入 Webhook 会先被调用。它们可以修改发送到 API 服务器的对象以执行自定义的设置默认值操作。

在完成了所有对象修改并且 API 服务器也验证了所传入的对象之后, 验证性质的 Webhook 会被调用,并通过拒绝请求的方式来强制实施自定义的策略。

kubewebhook example 准入控制器部署

我们使用 kubewebhook 库来开发自己的准入控制器,kubewebhook 库支持以下特性:

  • 简单上手、可扩展以及使用灵活

  • 支持验证类型和变更类型的 Webhook

  • 支持 K8S 原生资源和用户 CRD 资源

  • 灵活组装多个 Webhook 在同一个服务

  • 提供 Webhook metrics 指标和 Tracing 指标

部署

官方部署步骤

首先在集群中部署 kubewebhook 库的 pod-annotate 例子来验证一下功能,K8S集群版本是 v1.22,部署步骤如下所示:

  • 更新 SSL 证书:cd examples && bash create-certs.sh

  • 部署 Webhook 证书资源:kubectl apply -f ./pod-annotate/deploy/webhook-certs.yaml

  • 部署 Webhook 服务:kubectl apply -f ./pod-annotate/deploy/webhook.yaml

  • 注册 mutating webhook 配置到 apiserver:kubectl apply -f ./pod-annotate/deploy/webhook-registration.yaml

使用验证的 deployment 验证 Webhook 功能:kubectl apply -f ./pod-annotate/deploy/test-deployment.yaml,发现 pod 无法成功创建。

nginx-test replicas 事件如下:

webhook 服务日志:

问题排查

结合 Kubernetes Admission Webhook 部署和调试阳明大佬的 admission-webhook-example 项目 等资料,找到了解决方法。

创建证书的脚本 create-certs.sh 文件需要做如下调整:

1、生成 webhookCA.csr 证书文件需要引入 csr.conf 配置文件

2、使用 k8s 默认的证书管理机制颁发 webhook.crt 证书

3、获取 ca 证书方式更新

更新完 create-certs.sh 脚本文件后最终部署成功,nginx-test 应用 pod 注解也自动注入成功。

开发自己的准入控制器

以我们自己的一个需求为例:给 deployment 资源中 logkit 容器环境变量中注入一些环境信息。

更新 webhook 代码

直接照着 pod-annotate 示例代码改:

更新 webhook 配置

完整项目链接:https://github.com/wenhuwang/K8S-Learning-And-Pratice/tree/main/webhook/mutating/deployment-inject-env

Last updated