kubernetes webhook 必须使用 tls 且证书由集群信任 ca 签发,admissionreview 必须用 v1 版本,策略应解耦于代码外置配置或规则引擎,删除拦截需配合 annotation 绕过机制。

Webhook服务必须用TLS,否则API Server直接拒绝通信
Kubernetes apiserver 强制要求所有 Webhook 通信走 HTTPS。哪怕本地测试,也不能用 HTTP —— 否则你会看到类似 admission webhook "xxx" does not support the version of AdmissionReview 或更常见的 Failed to connect to webhook 错误,实际根本没发出去请求。
- 证书必须由集群信任的 CA 签发(不能是自签且未注入到
apiserver的 root CA) -
clientConfig.caBundle字段填的是 Base64 编码后的 CA 证书内容,不是路径也不是 PEM 文本 - Go 服务启动时要用
http.ListenAndServeTLS,且证书文件需挂载进 Pod,路径要和配置一致(如/etc/webhook/certs/tls.crt) - 别在 handler 里硬写
http.Redirect或忽略 TLS —— 这会让整个准入链路静默失败
AdmissionReview 解析必须严格匹配 v1 版本,v1beta1 已废弃
从 Kubernetes 1.26 起,v1beta1 版本的 AdmissionReview 已被彻底移除。如果你还在用老教程里的 admissionregistration.k8s.io/v1beta1 配置或 Go 结构体(比如 admissionv1beta1.AdmissionReview),服务会收到空 body 或 panic: json: cannot unmarshal object into Go struct field AdmissionReview.request of type admissionv1beta1.AdmissionRequest。
- 导入正确包:
admissionv1 "k8s.io/api/admission/v1",不是v1beta1 - 解析时先检查
review.Request.Kind.Group和.Version,避免对未知资源类型 panic - 返回响应必须用
admissionv1.AdmissionResponse,且Allowed和Result字段不可同时为空 - 日志里打不出 request body?试试
io.ReadAll(r.Body)后重放bytes.NewReader(),否则 client-go 会报body closed
校验逻辑别写死在 Webhook 里,否则策略变更要重启服务
把“禁止特权容器”“只允许特定镜像仓库”这类规则硬编码进 Go 的 if/else 里,等于把策略和代码耦合死。一次策略调整就得改代码、打包、发布、滚动更新 —— 违背了 Webhook “动态防护” 的设计初衷。
- 推荐做法:Webhook 只做路由和协议适配,策略判断交给外部 OPA 或轻量级规则引擎(如 Rego 文件挂 ConfigMap)
- 若坚持纯 Go 实现,至少把规则抽成 JSON/YAML 配置,通过
ConfigMap挂载并监听fsnotify热重载 - 注意 RBAC:Webhook Pod 的 ServiceAccount 必须有权限读取对应命名空间下的
configmaps - 别在 handler 里同步调用远程 API 做鉴权(比如查数据库)—— 超时会拖垮整个 apiserver 请求链路
删除操作拦截必须配合客户端注解,否则破坏 CI/CD 流程
单纯在 Validating Webhook 里拦截所有 DELETE 请求,会导致 Helm upgrade --cleanup-on-fail、Argo CD 自动同步、甚至 kubectl apply --prune 全部卡死。运维和自动化工具不是“误操作”,它们需要可编程的绕过机制。
- 标准解法:要求删除请求携带特定 annotation,例如
safe-delete/force: "true" - 客户端工具(如
kubectl-safe-delete)负责加注解;Webhook 只校验存在性和值合法性 - 不要校验 annotation 的时间戳或签名 —— 大部分 CI 系统无法生成 JWT,过度设计反而阻碍落地
- 对
Namespace删除要额外小心:它触发级联删除,Webhook 收到的是 Namespace 对象本身,不是其下属 Pod —— 别指望靠拦截 Pod 删除来防误删
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











