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 配置
Last updated