news 2026/4/23 15:04:46

从手动到自动:基于 Mutating Admission Webhook 实现 Envoy Sidecar 自动注入

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从手动到自动:基于 Mutating Admission Webhook 实现 Envoy Sidecar 自动注入

前言

上一小节我们详细讨论了如何做流量劫持,并且使用initContainers来做自动劫持的配置。但是目前还有一个问题,如果我们的系统有好几百个微服务,那作为重要的代理envoy,是手动注入的,难道每个微服务都要手动编辑一次 ?这显然是不可承受的,所以这一节,我们来详细讨论一下自动注入的问题

环境准备

由于本节只讨论容器注入,所以只需要准备一个普通的deployment就行了

apiVersion: apps/v1 kind: Deployment metadata: name: backend namespace: default spec: replicas: 1 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - image: backend-service:v1 imagePullPolicy: Never name: backend ports: - containerPort: 10000 protocol: TCP resources: {} restartPolicy: Always

mutating admission webhooks

简单来说,就是当pod重启的时候,会发起一系列的过程,其中在mutating admission controller 这里,k8s提供了一个webhooks,可以回调到指定的地方去,所以我们需要创建一个server来处理该回调,添加一个容器进去,完成容器注入的工作

创建相关证书
cd /etc/kubernetes/pki

创建openssl.cnf

[ req ] distinguished_name = req_distinguished_name req_extensions = v3_req prompt = no [ req_distinguished_name ] CN = sidecar-webhook.default.svc [ v3_req ] keyUsage = keyEncipherment, dataEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [ alt_names ] DNS.1 = sidecar-webhook DNS.2 = sidecar-webhook.default DNS.3 = sidecar-webhook.default.svc

从k8s根证书中创建证书

sudo openssl req -x509 -newkey rsa:2048 \ -keyout tls.key \ -out tls.crt \ -days 365 -nodes \ -config openssl.cnf \ -extensions v3_req
创建MutatingWebhookConfiguration
mytls=`cat tls.crt | base64 | tr -d '\n'` echo 'apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: sidecar-injector webhooks: - name: sidecar.demo.io clientConfig: service: name: sidecar-webhook namespace: default path: /mutate caBundle: '$mytls' rules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE"] resources: ["pods"] admissionReviewVersions: ["v1"] sideEffects: None' | kubectl apply -f -
创建服务来接收webhook

自动注入服务

这没什么可说的,需要注意的就是注入pod的配置直接写在了代码里面,并且注入了2个部分,首先是sidecar container,其次是sidecar的volumes配置(pod级别的)

patch := []map[string]interface{}{ { "op": "add", "path": "/spec/containers/-", "value": map[string]interface{}{ "image": "registry.cn-beijing.aliyuncs.com/wilsonchai/envoy:v1.32-latest", "imagePullPolicy": "IfNotPresent", "name": "envoy", "args": []string{"-c", "/etc/envoy/envoy.yaml"}, "volumeMounts": []map[string]interface{}{ { "mountPath": "/etc/envoy", "name": "envoy-config", }, }, }, }, { "op": "add", "path": "/spec/volumes/-", "value": map[string]interface{}{ "configMap": map[string]interface{}{ "defaultMode": 420, "name": "envoy-config", }, "name": "envoy-config", }, }, }
▶ go run inject.go 2025/12/29 14:58:19 Webhook listening on :8443

打开8443端口以便接收请求

创建访问路径

我们的服务在集群外,所以创建一个endpoint指向集群之外

echo 'apiVersion: v1 kind: Service metadata: name: sidecar-webhook spec: ports: - port: 443 targetPort: 8443 protocol: TCP type: ClusterIP --- apiVersion: v1 kind: Endpoints metadata: name: sidecar-webhook namespace: default subsets: - addresses: - ip: 10.22.12.178 ports: - port: 8443 protocol: TCP' | kubectl apply -f -
验证

重启backend服务,kubectl rollout restart deploy backend

cannot bind '0.0.0.0:10000': Address already in use

出现了报错,这应该是由于envoy是监听10000端口,backend服务监听的也是10000端口,现在它们在一个net namespace,就肯定要报错了,所以改一下envoy的配置,监听另外一个端口吧,10000改成10001

listeners: - name: ingress_listener address: socket_address: address: 0.0.0.0 port_value: 10001

再次重启查看pod状态

▶ kubectl get pod -owide -l app=backend NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES backend-6bdf5d484b-5czgx 2/2 Running 0 100s 10.244.0.184 wilson <none> <none>

查看详情

自动注入了envoy容器

至此,架构图如下:

精细化注入

按照目前的配置,只要有pod create,就立刻回调集群外的注入服务,如果k8s集群的服务很多,并且频繁的create/destroy,那就会对注入服务产生较大的压力。如果在这些服务中,只有一些服务是需要使用自动注入功能的,那 就需要更精细化的注入管理

namespace打标签

首先要调整一下MutatingWebhookConfiguration

apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: sidecar-injector webhooks: - name: sidecar.demo.io namespaceSelector: matchLabels: sidecar-inject: "true" ...

加上标签sidecar-inject: "true",只有满足这个标签,才会回调到外部的注入服务,这样就可以大大减轻注入服务的压力了

再给namespace打上标签

kubectl label ns default sidecar-inject=true

default namespace里面所有的pod,都会回调至外部注入服务

pod 打标签

这次不在namespace下,而是基于某个pod label

apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: sidecar-injector webhooks: - name: sidecar.demo.io objectSelector: matchLabels: sidecar-inject-pod: "true" ...

然后再给deployment打标签,这里要注意打的是pod的标签

kubectl patch deployment backend \ --type='merge' \ -p '{ "spec": { "template": { "metadata": { "labels": { "sidecar-inject-pod": "true" } } } } }'

小结

本文详细描述了怎么做自动注入:k8s配置修改+外部注入服务。其中需要注入的pod是写死在注入服务的,这部分可以抽出来,将配置写成configmap,或者在其他的配置中心中,这样就不用频繁的修改注入服务了

另外mutating webhooks可以拦截大部分k8s支持的资源,并且发送到所配置的外部服务中进行需要的配置,这就不单单是pod自动注入,而是资源拦截。比如我需要拦截configmap

echo 'apiVersion: admissionregistration.k8s.io/v1 kind: MutatingWebhookConfiguration metadata: name: callback-configmap webhooks: - name: sidecar.demo.io clientConfig: service: name: sidecar-webhook namespace: default path: /mutate caBundle: '$mytls' rules: - apiGroups: [""] apiVersions: ["v1"] operations: ["CREATE", "UPDATE"] resources: ["configmaps"] admissionReviewVersions: ["v1"] sideEffects: None' | kubectl apply -f -

resources变更为configmap之后,就可以直接回调到外部服务。本章由于篇幅有限,就不对这个话题展开了,这个以后有需要再来详细讨论

联系我

  • 联系我,做深入的交流


至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教…

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 10:50:04

选购免维护吸湿器别只看价格,这 5 个参数才是关键

在免维护吸湿器采购市场上&#xff0c;低价产品看似诱人&#xff0c;实则可能因核心参数不达标&#xff0c;给变压器运行埋下安全隐患。不少供电公司、变压器厂曾因盲目追求低价&#xff0c;遭遇吸湿效率不足、适配性差、运维麻烦等问题。湖北鄂电科技作为深耕电力设备领域的企…

作者头像 李华
网站建设 2026/4/23 10:49:52

新源恒远充电站管理的好帮手!

为落实《北京技术创新行动计划》中“首都蓝天行动”和大兴区清洁空气行动计划&#xff0c;新源恒远大力发展新能源电动汽车充电桩事业&#xff0c;减少油车排放量从而减轻雾霾污染&#xff0c;提供更加便捷的充电方式。目前新源恒远已建成公交充电站20余座&#xff0c;社会站点…

作者头像 李华
网站建设 2026/4/23 10:50:08

激励型需求响应对配电网运行可靠性的影响Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/4/22 14:55:35

电价负荷需求响应-考虑电价变动Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华
网站建设 2026/4/23 11:38:24

【无人机三维路径规划】基于混沌增强领导者黏菌算法CELSMA多无人机协同集群避障路径规划 目标函数:最低成本:路径、高度、威胁、转角附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和数学建模资料 &#x1f34…

作者头像 李华