尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

kube-sidecar-injector揭秘:JSON Patch如何动态注入Sidecar容器——Kubernetes准入机制深度实战

kube-sidecar-injector揭秘:JSON Patch如何动态注入Sidecar容器——Kubernetes准入机制深度实战 kube-sidecar-injector揭秘JSON Patch如何动态注入Sidecar容器——Kubernetes准入机制深度实战【免费下载链接】kube-sidecar-injectorA Kubernetes mutating webhook server that implements sidecar injection项目地址: https://gitcode.com/gh_mirrors/ku/kube-sidecar-injectorkube-sidecar-injector 是一个 Kubernetes MutatingAdmissionWebhook 服务端能在 Pod 持久化之前自动注入 Sidecar 容器如 nginx帮你彻底搞懂 JSON Patch 与准入机制的工作原理。它解决什么问题为什么需要 Sidecar 注入器在微服务架构中Sidecar 容器日志收集、服务网格代理、访问网关几乎无处不在。但让每个 Pod 都手动声明 Sidecar既繁琐又容易遗漏。kube-sidecar-injector 的思路是在 Pod 创建请求到达 etcd 之前拦截它偷偷塞进一个 Sidecar 容器。对业务方来说你提交的 YAML 里根本没有这个容器但它却真实地跑了起来。这种无感注入能力正是 Istio 等成熟服务网格的核心机制而本项目用最简洁的代码约千行 Go完整复刻了这套流程是学习 Kubernetes 准入控制Admission Control的优质教程项目。上图展示了完整链路kube-apiserver 内部的 MutatingAdmissionWebhook 插件收到 Pod 创建请求后将 AdmissionReview 请求转发给 Webhook 服务器服务器返回携带 JSON Patch 的响应apiserver 应用 Patch 后才将 Pod 写入 etcd。一键部署最快上手步骤环境要求Go 1.17、Docker 19.03、Kubernetes 1.19启用admissionregistration.k8s.io/v1API。第 1 步构建并推送镜像make docker-build docker-push IMAGEquay.io/你的用户名/sidecar-injector:latest第 2 步部署注入器到集群make deploy IMAGEquay.io/你的用户名/sidecar-injector:latest第 3 步验证运行状态kubectl -n sidecar-injector get pod部署清单集中在deploy/目录Namespace、ServiceAccount、ClusterRole、Deployment、Service 一应俱全可通过 deploy/kustomization.yaml 用 kustomize 统一管理注入容器的定义则由 deploy/configmap.yaml 中的sidecarconfig.yaml配置。启用注入开关给命名空间打一个标签Webhook 通过NamespaceSelector精确圈定作用范围——只拦截打了sidecar-injectionenabled标签的命名空间这是选择器配置的核心源码见 cmd/webhookconfig.go。kubectl create ns test-ns kubectl label namespace test-ns sidecar-injectionenabled实战演示3 分钟看到注入效果在目标命名空间部署一个最简单的应用kubectl -n test-ns run alpine --imagealpine --restartNever --command -- sleep infinity查看结果注意READY列是2/2kubectl -n test-ns get pod alpine -o jsonpath{.spec.containers[*].name} # 输出alpine sidecar-nginx你只声明了 1 个容器却跑起了 2 个——sidecar-nginx就是被 Webhook 动态注入的。这就是 JSON Patch 的魔法。核心解密JSON Patch 如何修改 Pod 对象这是本项目最值得学习的部分全部逻辑位于 cmd/webhook.go 的createPatch函数。1. Patch 的通用结构Webhook 的响应不是整个修改后的 Pod而是一个JSON PatchRFC 6902一组按路径定位的操作指令[ { op: add, path: /spec/containers, value: [ ...nginx容器定义... ] } ]每条指令只由三个字段组成见 cmd/webhook.go 中的patchOperation结构字段含义op操作类型add新增/替换、replace替换path目标字段在 Pod JSON 中的位置value要写入的值2. 一个巧妙的/-技巧当 Pod 已有容器时/spec/containers路径已存在直接add会失败。项目用了 JSON Patch 的追加语义见addContainer函数cmd/webhook.go容器列表为空 → 对整个/spec/containers执行add一次性写入数组容器列表非空 → 路径改为/spec/containers/-其中的-表示数组末尾追加。Volume 的注入逻辑addVolume与之完全对称。3. 防重注入用 Annotation 标记状态Webhook 可能对同一 Pod 被反复触发如kubectl apply更新。项目在注入时同时写入一个状态注解见 cmd/webhook.go 的updateAnnotationsidecar-injector-webhook.morven.me/status: injected后续请求只要发现statusinjected就直接放行、跳过变异避免容器被重复叠加。此外还支持.../inject: off注解对单个 Pod 关闭注入策略判断见mutationRequiredcmd/webhook.go。4. 响应中的 PatchType最终响应必须声明补丁类型cmd/webhook.goAdmissionResponse{ Allowed: true, Patch: patchBytes, PatchType: admissionv1.PatchTypeJSONPatch, }apiserver 正是根据PatchType: JSONPatch才知道该按 RFC 6902 规则应用这份补丁。幕后细节自签名证书与自动注册Webhook 通信必须走 HTTPS。本项目在启动时自动生成自签名 CA 和证书cmd/cert.go并把 CA 直接写进MutatingWebhookConfiguration的caBundle字段同时自动创建/更新该配置对象cmd/webhookconfig.go——你无需手动跑 openssl这也是它作为教程项目的优雅之处。常见问题排查清单Pod 没有被注入 Sidecar 时按序检查以下 3 点注入器状态sidecar-injectorPod 是否 Running 且无错误日志命名空间标签目标命名空间是否有sidecar-injectionenabled标签与 Webhook 配置中的选择器匹配Pod 注解被注入的 Pod 应带有sidecar-injector-webhook.morven.me/inject相关注解缺失说明 Webhook 根本没被触发。总结从本項目能学到的 4 件事准入控制全链路从MutatingWebhookConfiguration注册 → apiserver 拦截 → AdmissionReview 交互 → Patch 应用一条完整的真实路径JSON Patch 实战add/replace操作与/-数组追加技巧这是所有 Webhook 变异开发的通用技能幂等性设计用 Annotation 状态标记防止重复变异工程化细节证书自举、kustomize 部署Makefile 中make deploy一条命令完成、优雅退出prestop.sh。项目完整源码与构建说明见 Dockerfile 与 Makefile核心逻辑全部集中在 cmd/ 目录的 4 个 Go 文件中非常适合通读学习。【免费下载链接】kube-sidecar-injectorA Kubernetes mutating webhook server that implements sidecar injection项目地址: https://gitcode.com/gh_mirrors/ku/kube-sidecar-injector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表