当前位置: 首页 > article >正文

istio使用ingress gateway通过header实现对不同服务的路由

要在 Istio 中使用 Ingress Gateway 实现基于 HTTP 头的服务路由,并对请求路径进行前缀去除(例如将 /api/details/xx 重写为 /xx),可以利用 Istio 的 GatewayVirtualService 资源,通过配置路由规则和路径重写来实现。以下是详细的实现步骤和配置说明,以满足你的需求:将 /api/details/xx 路由到 demo-bookinfo 命名空间下的 details 服务,/api/ratings/xx 路由到 ratings 服务,并在路由后去除 /api/details/api/ratings 前缀。


1. 需求分析

  • 目标
    • 通过 Istio Ingress Gateway 接收外部 HTTP 请求。
    • 根据请求路径(如 /api/details/xx/api/ratings/xx)路由到 demo-bookinfo 命名空间下的对应服务(detailsratings)。
    • 在路由到目标服务之前,去除路径中的服务前缀(例如 /api/details/xx 重写为 /xx)。
  • 关键点
    • 使用 Istio 的 Gateway 定义外部流量入口。
    • 使用 VirtualService 配置路径匹配、路由目标和路径重写规则。
    • 确保路由规则基于路径前缀,并正确处理路径重写。

2. 前提条件

  • Istio 已安装:确保 Istio 已部署在 Kubernetes 集群中,且 istio-ingressgateway 服务正常运行。
  • 命名空间和目标服务demo-bookinfo 命名空间已创建,且 detailsratings 服务已部署,监听端口为 9080(Bookinfo 示例的默认端口)。
  • 服务访问:确认 detailsratings 服务可以通过 Kubernetes Service 访问,例如 details.demo-bookinfo.svc.cluster.local:9080ratings.demo-bookinfo.svc.cluster.local:9080
  • Istio Sidecar 注入demo-bookinfo 命名空间中的服务已启用 Istio Sidecar 注入(通过 kubectl label namespace demo-bookinfo istio-injection=enabled)。

3. 配置 Istio Gateway 和 VirtualService

以下是实现需求的完整配置,分为 GatewayVirtualService 两部分。

3.0 同时配置

---
# Gateway 配置
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: internal-gatewaynamespace: istio-system
spec:selector:app: istio-ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*" # 接受所有主机,或使用 "*.demo-bookinfo.svc.cluster.local"
---
# VirtualService 配置
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: internal-routingnamespace: demo-bookinfo
spec:hosts:- "*" # 匹配所有主机,或指定内部域名gateways:- istio-system/internal-gatewayhttp:- match:- headers:service:exact: ratingsroute:- destination:host: ratings.demo-bookinfo.svc.cluster.localport:number: 9080- match:- headers:service:exact: detailsroute:- destination:host: details.demo-bookinfo.svc.cluster.localport:number: 9080- route: # 默认路由(可选)- destination:host: productpage.demo-bookinfo.svc.cluster.localport:number: 9080```### 3.1 配置 GatewayGateway 定义了 Ingress Gateway 监听的端口和协议,用于接收外部流量。我们配置一个 HTTP 端口(80),并允许所有主机(`*`)的请求。```yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: bookinfo-gatewaynamespace: istio-system  # 通常与 istio-ingressgateway 所在命名空间一致
spec:selector:istio: ingressgateway  # 选择默认的 Istio Ingress Gatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*"  # 允许所有主机,生产环境中可指定具体域名

说明

  • selector: istio: ingressgateway:绑定到 Istio 默认的 Ingress Gateway。
  • hosts: ["*"]:允许任意主机名,简化测试。生产环境中应指定具体域名(如 bookinfo.example.com)。
  • 部署此配置:
kubectl apply -f bookinfo-gateway.yaml

3.2 配置 VirtualService

VirtualService 定义了具体的路由规则,包括路径匹配、目标服务路由和路径重写。我们为 /api/details/api/ratings 配置路由规则,并使用 rewrite 去除前缀。

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: bookinfo-routingnamespace: demo-bookinfo  # 与目标服务所在命名空间一致
spec:hosts:- "*"  # 匹配所有主机,生产环境中可指定具体域名gateways:- istio-system/bookinfo-gateway  # 引用 Gateway,格式为 <namespace>/<gateway-name>http:- match:- uri:prefix: /api/details  # 匹配 /api/details 开头的路径rewrite:uri: /  # 将 /api/details/xx 重写为 /xxroute:- destination:host: details.demo-bookinfo.svc.cluster.local  # 目标服务port:number: 9080- match:- uri:prefix: /api/ratings  # 匹配 /api/ratings 开头的路径rewrite:uri: /  # 将 /api/ratings/xx 重写为 /xxroute:- destination:host: ratings.demo-bookinfo.svc.cluster.local  # 目标服务port:number: 9080

说明

  • hosts: ["*"]:匹配所有主机,与 Gateway 保持一致。
  • gateways:引用 istio-system 命名空间中的 bookinfo-gateway
  • http 部分:
    • match: uri: prefix:匹配以 /api/details/api/ratings 开头的请求。
    • rewrite: uri: /:将匹配的前缀(如 /api/details/api/ratings)替换为 /,例如 /api/details/xx 重写为 /xx
    • route: destination:指定目标服务的完整域名(<service-name>.<namespace>.svc.cluster.local)和端口。
  • 部署此配置:
kubectl apply -f bookinfo-virtualservice.yaml

4. 工作原理

  1. 外部请求进入

    • 客户端发送请求到 Ingress Gateway 的外部 IP(例如 http://<INGRESS_HOST>/api/details/xx)。
    • Gateway 监听 80 端口,接收 HTTP 请求。
  2. VirtualService 匹配和处理

    • VirtualService 根据 uri: prefix 规则匹配请求路径。
    • 如果路径以 /api/details 开头:
      • rewrite: uri: / 将路径重写为 /xx(去除 /api/details)。
      • 请求路由到 details.demo-bookinfo.svc.cluster.local:9080
    • 如果路径以 /api/ratings 开头:
      • 同样重写路径为 /xx(去除 /api/ratings)。
      • 请求路由到 ratings.demo-bookinfo.svc.cluster.local:9080
  3. 服务接收请求

    • detailsratings 服务接收到的请求路径为 /xx,符合你的需求。

5. 测试配置

5.1 获取 Ingress Gateway 地址

获取 Istio Ingress Gateway 的外部 IP 和端口:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
echo "Ingress URL: http://$INGRESS_HOST:$INGRESS_PORT"

如果运行在本地(如 Minikube),可能需要使用 NodePort 或其他方式获取地址。

5.2 测试路由和路径重写

  1. 测试 details 服务:
curl -v http://$INGRESS_HOST:$INGRESS_PORT/api/details/123
  • 预期结果:请求被路由到 details 服务,服务接收到的路径为 /123
  • 检查 details 服务的日志(假设服务支持日志输出):
kubectl -n demo-bookinfo logs <details-pod-name>

确认日志中显示的请求路径为 /123,而不是 /api/details/123

  1. 测试 ratings 服务:
curl -v http://$INGRESS_HOST:$INGRESS_PORT/api/ratings/456
  • 预期结果:请求被路由到 ratings 服务,服务接收到的路径为 /456
  • 同样检查 ratings 服务的日志,确认路径为 /456

5.3 验证路径重写

如果 detailsratings 服务有特定的响应(例如返回请求的路径),可以检查响应内容或日志,确保路径已被正确重写。如果服务不支持日志,可以在服务中临时添加调试端点,或使用 Istio 的请求追踪工具(如 Kiali 或 Jaeger)验证请求路径。


6. 基于 Header 的路由(可选增强)

你的需求中提到“通过 header 路由到对应的服务”,当前配置是基于路径前缀的。如果需要基于 HTTP 头进行路由(例如根据 X-Version: v1 路由到特定版本的 details 服务),可以在 VirtualService 中添加 headers 匹配条件。以下是一个示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: bookinfo-routingnamespace: demo-bookinfo
spec:hosts:- "*"gateways:- istio-system/bookinfo-gatewayhttp:- match:- uri:prefix: /api/detailsheaders:x-version:exact: v1  # 匹配 X-Version: v1 的请求rewrite:uri: /route:- destination:host: details.demo-bookinfo.svc.cluster.localsubset: v1  # 假设 details 服务有 v1 子集port:number: 9080- match:- uri:prefix: /api/detailsheaders:x-version:exact: v2  # 匹配 X-Version: v2 的请求rewrite:uri: /route:- destination:host: details.demo-bookinfo.svc.cluster.localsubset: v2  # 假设 details 服务有 v2 子集port:number: 9080- match:- uri:prefix: /api/ratingsrewrite:uri: /route:- destination:host: ratings.demo-bookinfo.svc.cluster.localport:number: 9080

6.1 定义 DestinationRule(支持子集)

如果使用基于头的路由到服务子集(如 v1v2),需要定义 DestinationRule 来指定子集:

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: details-destinationnamespace: demo-bookinfo
spec:host: details.demo-bookinfo.svc.cluster.localsubsets:- name: v1labels:version: v1  # 匹配 Pod 的 version: v1 标签- name: v2labels:version: v2  # 匹配 Pod 的 version: v2 标签

6.2 测试基于 Header 的路由

curl -H "X-Version: v1" http://$INGRESS_HOST:$INGRESS_PORT/api/details/123
curl -H "X-Version: v2" http://$INGRESS_HOST:$INGRESS_PORT/api/details/123
  • 确认请求分别路由到 details 服务的 v1v2 子集,且路径被重写为 /123

7. 故障排查

如果路由或路径重写不生效,可以按照以下步骤排查:

  1. 检查 Gateway 和 VirtualService 配置

    • 确保 kubectl get gateway -n istio-systemkubectl get virtualservice -n demo-bookinfo 显示资源已创建。
    • 检查 VirtualServicegateways 字段是否正确引用 Gateway。
  2. 验证 Ingress Gateway 地址

    • 确保 INGRESS_HOSTINGRESS_PORT 正确,且可以通过 curl 访问。
  3. 检查服务日志

    • 查看 detailsratings 服务的日志,确认接收到的请求路径是否正确。
  4. 使用 Istio 调试工具

    • 使用 istioctl analyze 检查配置是否有错误:
      istioctl analyze -n demo-bookinfo
      
    • 使用 Kiali 或 Jaeger 跟踪请求,验证路由和路径重写。
  5. 确认服务端口

    • 确保 detailsratings 服务的 Kubernetes Service 端口为 9080,且 Pod 监听正确端口。
  6. 检查 Envoy 配置

    • 查看 Ingress Gateway 的 Envoy 配置:
      istioctl proxy-config routes -n istio-system <ingress-gateway-pod-name>
      
    • 确认路由规则和路径重写是否正确应用。

8. 参考资料


9. 总结

通过以上配置,Istio Ingress Gateway 可以实现:

  • 基于路径前缀(如 /api/details/api/ratings)将请求路由到 demo-bookinfo 命名空间的 detailsratings 服务。
  • 使用 rewrite: uri: / 去除路径前缀,确保服务接收到的请求路径为 /xx
  • 可选地,通过 headers 匹配实现基于 HTTP 头的路由(例如 X-Version)。

相关文章:

istio使用ingress gateway通过header实现对不同服务的路由

要在 Istio 中使用 Ingress Gateway 实现基于 HTTP 头的服务路由&#xff0c;并对请求路径进行前缀去除&#xff08;例如将 /api/details/xx 重写为 /xx&#xff09;&#xff0c;可以利用 Istio 的 Gateway 和 VirtualService 资源&#xff0c;通过配置路由规则和路径重写来实现…...

[论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models

REPLUG: Retrieval-Augmented Black-Box Language Models REPLUG: Retrieval-Augmented Black-Box Language Models - ACL Anthology NAACL-HLT 2024 在这项工作中&#xff0c;我们介绍了RePlug&#xff08;Retrieve and Plug&#xff09;&#xff0c;这是一个新的检索增强型…...

数图信息科技邀您共赴第二十五届中国零售业博览会

数图信息科技邀您共赴第二十五届中国零售业博览会 2025年5月8日至10日&#xff0c;数图信息科技将精彩亮相第二十五届中国零售业博览会&#xff08;CHINASHOP 2025&#xff09;&#xff0c;与行业伙伴共探零售数字化转型新机遇&#xff01; 数图展会新品抢先看 数图商品一…...

DeepSeek智能时空数据分析(三):专业级地理数据可视化赏析-《杭州市国土空间总体规划(2021-2035年)》

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…...

论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断

基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断 原论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0925400521014830 引用此论文&#xff08;GB/T 7714-2015&#xff09;&#xff1a; WANG T, ZHANG H, WU Y, …...

conda和bash主环境的清理

好的&#xff01;要管理和清理 Conda&#xff08;或 Bash&#xff09;安装的包&#xff0c;可以按照以下步骤进行&#xff0c;避免冗余依赖&#xff0c;节省磁盘空间。 &#x1f4cc; 1. 查看已安装的包 先列出当前环境的所有安装包&#xff0c;找出哪些可能需要清理&#xff…...

Webug3.0通关笔记17 中级进阶(第01-05关)

目录 第一关 出来点东西吧 1.打开靶场 2.源码分析 3.源码修正 4.文件包含漏洞渗透 第二关 提交方式是怎样的啊&#xff1f; 1.打开靶场 2.源码分析 3.渗透实战 &#xff08;1&#xff09;bp改包法 &#xff08;2&#xff09;POST法渗透 第三关 我还是一个注入 1.打开…...

django.db.utils.OperationalError: (1050, “Table ‘你的表名‘ already exists“)

这个错误意味着 Django 尝试执行迁移时&#xff0c;发现数据库中已经有一张叫 你的表名的表了&#xff0c;但这张表不是通过 Django 当前的迁移系统管理的&#xff0c;或者迁移状态和数据库实际状态不一致。 &#x1f9e0; 可能出现这个问题的几种情况&#xff1a; 1.你手动创…...

Maven 依赖范围(Scope)详解

Maven 依赖范围&#xff08;Scope&#xff09;详解 Maven 是一个强大的项目管理工具&#xff0c;广泛用于 Java 开发中构建、管理和部署应用程序。在使用 Maven 构建项目时&#xff0c;我们经常需要引入各种第三方库或框架作为项目的依赖项。通过在 pom.xml 文件中的 <depe…...

SpringBoot配置RestTemplate并理解单例模式详解

在日常开发中&#xff0c;RestTemplate 是一个非常常用的工具&#xff0c;用来发起HTTP请求。今天我们通过一个小例子&#xff0c;不仅学习如何在SpringBoot中配置RestTemplate&#xff0c;还会深入理解单例模式在Spring中的实际应用。 1. 示例代码 我们首先来看一个基础的配置…...

React自定义Hook之useMutilpleRef

概要 我们在React开发时候&#xff0c;有时候需要绑定列表中的多个元素&#xff0c;便于后面对列表中单个元素的操作&#xff0c;但是常用的hook函数useRef只能绑定一个DOM元素&#xff0c;本文提供一个可以解决该问题的自定义hook方法&#xff0c;useMutilpleRef。 代码及实…...

蛋白质大语言模型ESM介绍

ESM(Evolutionary Scale Modeling)是 Meta AI Research 团队开发的一系列用于蛋白质的预训练语言模型。这些模型在蛋白质结构预测、功能预测和蛋白质设计等领域展现出了强大的能力。以下是对 ESM 的详细介绍: 核心特点 大规模预训练:基于大规模蛋白质序列数据进行无监督学…...

从线性到非线性:简单聊聊神经网络的常见三大激活函数

大家好&#xff0c;我是沛哥儿&#xff0c;我们今天一起来学习下神经网络的三个常用的激活函数。 引言&#xff1a;什么是激活函数 激活函数是神经网络中非常重要的组成部分&#xff0c;它引入了非线性因素&#xff0c;使得神经网络能够学习和表示复杂的函数关系。 在神经网络…...

【算法笔记】贪心算法

一、什么是贪心算法&#xff1f; 贪心算法是一种在每一步选择中都采取当前看起来最优&#xff08;最“贪心”&#xff09;的策略&#xff0c;从而希望得到全局最优解的算法设计思想。 核心思想&#xff1a;每一步都做出局部最优选择&#xff0c;不回退。适用场景&#xff1a;…...

Node.js 开发项目

初始化 npm init## npm install 编辑packege.json 添加&#xff0c;以支持ES6的语法 "type": "module" 连接mysql示例 import db from ./db/ops_mysql.jsconst createTable async () > {const insert_data CREATE TABLE IF NOT EXISTS users (…...

网络准入控制系统推荐:2025年构建企业网络安全的第一道防线

随着信息技术的飞速发展&#xff0c;企业网络环境日益复杂&#xff0c;阳途网络准入控制系统作为一种先进的网络安全解决方案&#xff0c;其核心是确保网络接入的安全性。 一、网络准入控制系统的基本原理与功能 网络准入控制以“只有合法的用户、安全的终端才可以接入网络”为…...

XSS跨站--订单和Shell箱子后门

本文主要内容 手法 XSS平台使用 XSS工具使用 XSS结合其他漏洞 XSS具体使用场景 某订单系统XSS盲打_平台 某Shell箱子系统XSS盲打_工具 [1]订单系统经典案例 第一个简易攻击流程&#xff08;订单系统&#xff09;&#xff1a;通过平台完成XSS跨站之后&a…...

游戏遭遇DDoS攻击如何快速止损?实战防御策略与应急响应指南

是不是很抽象 我自己画的 一、游戏DDoS攻击特征深度解析 游戏行业DDoS攻击呈现复合型特征&#xff0c;2023年监测数据显示&#xff0c;针对游戏服务器的攻击中&#xff0c;63%采用UDP反射放大HTTP慢速攻击组合&#xff0c;攻击峰值达3.2Tbps。攻击者利用游戏协议特性&#xff…...

cocos creator使用jenkins打包流程,打包webmobile

windows电脑使用 如果你的电脑作为打包机&#xff0c;一定要锁定自己的ip,如果ip动态获取&#xff0c;可能后续会导致jenkins无法访问,还需要重新配置jenkins和http-server的端口 从jenkins官网下载windows版 Thank you for downloading Windows Stable installer 1.jenkins安…...

自动驾驶(ADAS)领域常用数据集介绍

1. KITTI 数据集 简介&#xff1a;由德国卡尔斯鲁厄理工学院与丰田研究院联合创建&#xff0c;是自动驾驶领域最经典的评测基准&#xff0c;涵盖立体视觉、光流、3D检测等任务。包含市区、乡村和高速公路场景的真实数据&#xff0c;标注对象包括车辆、行人等&#xff0c;支持多…...

C++ 部署的性能优化方法

一、使用结构体提前存放常用变量 在编写前后处理函数时&#xff0c;通常会多次用到一些变量&#xff0c;比如模型输入 tensor 的 shape&#xff0c;count 等等&#xff0c;若在每个处理函数中都重复计算一次&#xff0c;会增加部署时的计算量。对于这种情况&#xff0c;可以考…...

关于IDEA的循环依赖问题

bug描述&#xff1a;&#xff08;java: 模块循环不支持注解处理。请确保将循环 [...] 中的所有模块排除在注解处理之外&#xff09; 解决方法&#xff1a;...

如何在idea中写spark程序

在 IntelliJ IDEA 中编写 Spark 程序&#xff0c;可按以下步骤进行&#xff1a; 1. 创建新项目 打开 IntelliJ IDEA&#xff0c;选择File -> New -> Project。在左侧面板选择Maven或者Gradle&#xff08;这里以 Maven 为例&#xff09;&#xff0c;确保Project SDK选择…...

RAG工程-基于LangChain 实现 Advanced RAG(预检索优化)

Advanced RAG 概述 Advanced RAG 被誉为 RAG 的第二范式&#xff0c;它是在 Naive RAG 基础上发展起来的检索增强生成架构&#xff0c;旨在解决 Naive RAG 存在的一些问题&#xff0c;如召回率低、组装 prompt 时的冗余和重复以及灵活性不足等。它重点聚焦在检索增强&#xff0…...

关于常量指针和指向常量的指针

关于指针&#xff0c;对于常量指针和指向常量的指针也是傻傻分不清。看到定义时&#xff0c;不知道是指针不能变&#xff0c;还是指针指向的内容不能变量。 先看形式&#xff1a; const char * A; char * const B; 这两种有什么区别&#xff1f;傻傻分不清。 A这种定义&am…...

《Masked Autoencoders Are Scalable Vision Learners》---CV版的BERT

目录 一、与之前阅读文章的关系&#xff1f; 二、标题&#xff1a;带掩码的自auto编码器是一个可拓展的视觉学习器 三、摘要 四、核心图 五、结果图 六、不同mask比例对比图 七、“Introduction” (He 等, 2021, p. 1) 引言 八、“Related Work” (He 等, 2021, p. 3)相…...

高压直流输电MATLAB/simulink仿真模型+说明文档

1.模型简介 本仿真模型基于MATLAB/Simulink&#xff08;版本MATLAB 2018Ra&#xff09;软件。建议采用matlab2018 Ra及以上版本打开。&#xff08;若需要其他版本可联系代为转换&#xff09; 使用一个传输功率为1000MW&#xff08;500 kV&#xff0c;2 kA&#xff09;直流互连…...

locust压力测试

安装 pip install locust验证是否安装成功 locust -V使用 网上的教程基本上是前几年的&#xff0c;locust已经更新了好几个版本&#xff0c;有点过时了&#xff0c;在此做一个总结 启动 默认是使用浏览器进行设置的 # 使用浏览器 locust -f .\main.py其他参数 Usage: locust […...

python 线程池顺序执行

在Python中&#xff0c;线程池&#xff08;ThreadPoolExecutor&#xff09;默认是并发执行任务的&#xff0c;但若需要实现任务的顺序执行&#xff08;按提交顺序执行或按结果顺序处理&#xff09;&#xff0c;可以通过以下方案实现&#xff1a; 方案一&#xff1a;强制单线程&…...

第十二届蓝桥杯 2021 C/C++组 空间

目录 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 思路&#xff1a; 思路详解&#xff1a; 代码&#xff1a; 代码详解&#xff1a; 题目&#xff1a; 题目描述&#xff1a; 题目链接&#xff1a; 空间 - 蓝桥云课 思路&#xff1a; 思路详解&#…...