如何在Istio服务网格中注入自定义Sidecar实现双JWT验证?
自定义Sidecar注入Istio环境的实现步骤
首先明确:Istio完全支持部署自定义Sidecar,无需依赖默认的Envoy Sidecar,以下是具体操作方向:
1. 禁用默认Sidecar自动注入
先确保目标Pod不会被自动注入Istio默认Sidecar,有两种生效方式:
- 给应用所在命名空间打标签,全局禁用该命名空间的自动注入:
kubectl label namespace <你的命名空间> istio-injection=disabled - 或在Deployment的Pod模板中添加注解,仅对当前Deployment生效:
apiVersion: apps/v1 kind: Deployment metadata: name: <你的应用部署名> spec: template: metadata: annotations: sidecar.istio.io/inject: "false" # ... 其他Pod配置内容
2. 将自定义Sidecar加入Deployment
把你开发的Sidecar容器直接定义到应用Pod的容器列表中,同时配置流量拦截规则,确保请求先经过自定义Sidecar再转发到应用容器:
apiVersion: apps/v1 kind: Deployment metadata: name: <你的应用部署名> spec: replicas: 1 selector: matchLabels: app: <你的应用标签> template: metadata: labels: app: <你的应用标签> annotations: sidecar.istio.io/inject: "false" spec: containers: # 自定义JWT验证Sidecar - name: custom-jwt-sidecar image: <你的自定义Sidecar镜像地址> ports: - containerPort: 8080 # Sidecar用于接收外部请求的监听端口 env: - name: APP_TARGET_PORT value: "9090" # 应用容器的监听端口 # 可选:通过iptables自动拦截Pod入口流量,转发到Sidecar command: ["/bin/sh", "-c"] args: - | iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080; exec /path/to/your/sidecar/entrypoint; # 业务应用容器 - name: app-container image: <你的应用镜像地址> ports: - containerPort: 9090
3. 配置服务与流量路由(可选)
如果需要通过Istio Gateway暴露服务,需确保VirtualService指向你的应用Service,且Service的端口对应自定义Sidecar的监听端口:
apiVersion: v1 kind: Service metadata: name: <你的应用服务名> spec: selector: app: <你的应用标签> ports: - name: http port: 80 targetPort: 8080 # 指向自定义Sidecar的监听端口 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: <你的虚拟服务名> spec: hosts: - <你的访问域名> gateways: - <你的Gateway名称> http: - route: - destination: host: <你的应用服务名> port: number: 80
备选优化方案:基于Istio Envoy扩展实现双JWT验证
如果你不想维护完整的自定义Sidecar,也可以利用Istio的Envoy Filter机制,通过WASM或Lua插件扩展Envoy原生能力,实现双JWT验证逻辑——这种方式复用Istio的流量管理体系,无需从零开发Sidecar组件。
内容的提问来源于stack exchange,提问作者Ankit Ostwal
相关产品推荐
相关产品推荐

