OpenShift 4 之Service Mesh教程(6)- 根据Header路由请求
《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.8环境中验证
文章目录
- 场景一
- 用 VirtualService 访问 Frontend 应用
- 用 Gateway 的路由访问 Frontend 应用
- 场景二
- 用Kiali控制台实现配置
场景一
本文的请求通过Gateway进入Istio,并通过VirtualService对不同header的请求分别发给frontend-v1和frontend-v2微服务。
有关Gateway可以查看https://istio.io/docs/reference/config/networking/gateway/
用 VirtualService 访问 Frontend 应用
本文可在完成《OpenShift 4 之Service Mesh教程(2)- 用Kiali监控微服务运行》后进行操作。在开始正式操作前需要运行以下命令将运行应用的my-istio-app项目里的内容清空即可(注意需要将脚本中的“USERID“替换为本文中的”my-istio-app“)。
$ source scripts/teardown.sh
- 执行命令,创建frontend-v1和frontend-v2微服务和相关资源,并删除所有VirtualService和DestinationRule对象。
$ oc apply -n my-istio-app -f ocp/frontend-v1-deployment.yaml
$ oc apply -n my-istio-app -f ocp/frontend-v2-deployment.yaml
$ oc apply -n my-istio-app -f ocp/frontend-service.yaml
$ oc apply -n my-istio-app -f ocp/frontend-route.yaml
$ oc apply -n my-istio-app -f ocp/backend-v1-deployment.yaml
$ oc apply -n my-istio-app -f ocp/backend-service.yaml
$ oc delete -n my-istio-app istio-io --all
- 运行命令,然后在Kiali的控制台查看请求的微服务调用路径。
$ source scripts/run-50.sh
4. 执行命令创建Virtual Service和Destination Rule,其中VirtualService定义了基于header的路由条件。
$ oc apply -n my-istio-app -f istio-files/destination-rule-frontend-v1-v2.yaml
$ cat << EOF | oc apply -n my-istio-app -f -
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: frontend
spec:hosts:- '*'gateways:- frontend-gatewayhttp:- match:- headers:foo:exact: barroute:- destination:host: frontendsubset: v1- route:- destination:host: frontendsubset: v2
EOF
5.用缺省和指定header访问frontend路由(其中“FRONTEND_URL”是本系列第一节创建的route对象),确认是流经了不同的Frontend。
$ curl $FRONTEND_URL -w "\n"
Frontend version: 2.0.0 => [Backend: http://backend:8080, Response: 200, Body: Backend version:v1, Response:200, Host:backend-v1-f4dbf777f-wl7vn, Status:200, Message: Hello, Quarkus]
$ curl -H foo:bar $FRONTEND_URL -w "\n"
Frontend version: 1.0.0 => [Backend: http://backend:8080, Response: 200, Body: Backend version:v1, Response:200, Host:backend-v1-f4dbf777f-5qjqw, Status:200, Message: Hello, Quarkus]
- 在Kiali控制台中查看微服务调用路径。
用 Gateway 的路由访问 Frontend 应用
除了使用以上VirtualService对应的路由(该路由名为frontend,是本系列第一步创建的,在my-istio-app项目中)地址访问,还可使用本步Gateway自动生成对应的route(该route会在istio-system项目中)访问Frontend应用。
- 查看“istio-files/gateway.yaml”文件,然后将以下“hosts”的内容替换一个可用的主机名,例如“frontend-header-my-istio-app.apps.apps-crc.testing”。
$ cat << EOF | oc apply -n my-istio-app -f -
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: frontend-gateway
spec:servers:- hosts:- 'frontend-istio-USERID.apps.DOMAIN'port:name: httpnumber: 80protocol: HTTPselector:istio: ingressgateway
EOF
- 在创建完Gateway对象后,会在Istio的控制项目中(本文是istio-system项目)创建一个对应的route,其中该route的访问地址就是上一步Gateway中由“hosts”定义的地址。
$ GATEWAY_URL=$(oc -n istio-system get route $(oc get route -n istio-system | grep my-istio-app | awk '{print $1}') -o jsonpath='{.spec.host}')
$ curl -H foo:bar $GATEWAY_URL -w "\n"
Frontend version: 1.0.0 => [Backend: http://backend:8080, Response: 200, Body: Backend version:v1, Response:200, Host:backend-v1-f4dbf777f-5qjqw, Status:200, Message: Hello, Quarkus]
$ curl $GATEWAY_URL -w "\n"
Frontend version: 2.0.0 => [Backend: http://backend:8080, Response: 200, Body: Backend version:v1, Response:200, Host:backend-v1-f4dbf777f-5qjqw, Status:200, Message: Hello, Quarkus]
场景二
用Kiali控制台实现配置
- 确认已经部署相关的前后端应用和相关服务,同时删除所有已有的VirtualService、DestinationRule、Gateway。
$ oc apply -n my-istio-app -f ocp/frontend-v1-deployment.yaml
$ oc apply -n my-istio-app -f ocp/frontend-v2-deployment.yaml
$ oc apply -n my-istio-app -f ocp/frontend-service.yaml
$ oc apply -n my-istio-app -f ocp/frontend-route.yaml
$ oc apply -n my-istio-app -f ocp/backend-v1-deployment.yaml
$ oc apply -n my-istio-app -f ocp/backend-v1-deployment.yaml
$ oc apply -n my-istio-app -f ocp/backend-service.yaml
$ oc delete -n my-istio-app istio-io --all
- 在Kiali控制台中进入Services的菜单,然后进入frontend。在页面中右侧点击“Actions”中进入“Request Routing”。
- 在“Create Request Routing”对话框中先在“Request Matching”中按照下图配置,即“headers,User-Agent,prefix,curl”,最后点击“Add Match”。
- 然后在“Route To”栏中按照下图调整frontend-v1和frontend-v2的比例,然后点击“Add Rule”。
- 然后再回到“Request Matching”,按照下图清除“Matching Selected”的内容。
- 再回到“Route To”栏,按照下图调整frontend-v1和frontend-v2的比例,然后点击“Add Rule”。
- 点开对话框下方的“Show Advanced Options”,先进入“Gateways”。在打开“Add Gateway”后按照下图配置Gateway,其中为“Gateway Hosts”配置为"frontend-curl.apps.apps-crc.testing",注意:“apps-crc.testing”为OpenShift集群的域名,可以通过以下命令获得。
$ oc whoami --show-console | awk -F'apps.' '{print $2}'
8. 确认“Hosts”栏中的“VirtualService Hosts”也自动为上一步的“Gateway Hosts”地址。
9. 查看VirtualService、DestinationRule和Gateway。
$ oc get istio-io -n my-istio-app
NAME GATEWAYS HOSTS AGE
virtualservice.networking.istio.io/frontend ["my-istio-app/frontend-gateway"] ["frontend-curl.apps.apps-crc.testing"] 31sNAME HOST AGE
destinationrule.networking.istio.io/frontend frontend-curl.apps.apps-crc.testing 31sNAME AGE
gateway.networking.istio.io/frontend-gateway 31s
- 查看由frontend-gateway的Gateway自动生成的Route。
$ oc get route -n istio-system -l maistra.io/gateway-name=frontend-gateway
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
my-istio-app-frontend-gateway-a43e9c0ad2061665 frontend-curl.apps.apps-crc.testing istio-ingressgateway http2 None
- 使用不同的header访问Gateway对应的Route地址,确认是由不同的frontend响应的。
$ GATEWAY_URL=$(oc get route -n istio-system | grep my-istio-app | awk '{print $2}')
$ curl -H 'User-Agent: curl' ${GATEWAY_URL}
Frontend version: 1.0.0 => [Backend: http://backend:8080, Response: 200, Body: Backend version:v2, Response:200, Host:backend-v2-5758c6c584-d244h, Status:200, Message: { "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Host": "httpbin.org", "User-Agent": "Java/11.0.12", "X-Amzn-Trace-Id": "Root=1-6149c4c8-770539d858da509a18baa482", "X-B3-Parentspanid": "99841a4c4bdfe8a4", "X-B3-Sampled": "1", "X-B3-Spanid": "240d772083c6373a", "X-B3-Traceid": "3507c659dceb09c06a3375a7dcdfd38e" }, "origin": "116.228.156.11", "url": "https://httpbin.org/delay/5"}] $ curl -H 'User-Agent: foo' ${GATEWAY_URL}
Frontend version: 2.0.0 => [Backend: http://backend:8080, Response: 200, Body: Backend version:v2, Response:200, Host:backend-v2-5758c6c584-d244h, Status:200, Message: { "args": {}, "data": "", "files": {}, "form": {}, "headers": { "Accept": "text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2", "Host": "httpbin.org", "User-Agent": "Java/11.0.12", "X-Amzn-Trace-Id": "Root=1-6149c4de-5c80147a460c13c355e9becb", "X-B3-Parentspanid": "bd328e330e03e829", "X-B3-Sampled": "1", "X-B3-Spanid": "751e13b0a1f6331c", "X-B3-Traceid": "4ed25401bd63c5922f8f061657b4a83f" }, "origin": "116.228.156.11", "url": "https://httpbin.org/delay/5"}]
OpenShift 4 之Service Mesh教程(6)- 根据Header路由请求相关推荐
- OpenShift 4 之Service Mesh教程(5)- 断路器Circuit Breaker
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 本文将模拟一个运行了backend-v1的Pod出问题,并在发给backend-v1微 ...
- OpenShift 4 之Service Mesh教程(4)- 跟踪访问后端服务超时
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 本文说明如何在Istio中的VirtualService中设置访问的timeout特性 ...
- OpenShift 4 之Service Mesh教程(1)- 创建ServiceMesh环境,部署Istio的微服务
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 文章目录 创建ServiceMesh环境 部署Istio的微服务 参考 创建Servi ...
- OpenShift 4 之Service Mesh教程(3)- 访问流量管理
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 文章目录 按比例分发流量 流量镜像 按比例分发流量 本节要配置Fontend微服务的流 ...
- OpenShift 4 之Service Mesh教程(2)- 用Kiali监控微服务运行
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 获得Kiali访问地址,然后用浏览器访问并登陆. $ oc get route kia ...
- OpenShift 4 - 创建Service Mesh运行环境
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.10环境中验证 文章目录 安装 OpenShift Service Mesh 和相关依赖 Opera ...
- OpenShift 4 之通过命令创建Service Mesh环境
<OpenShift 4.x HOL教程汇总> 本文使用命令行方式在OpenShift 4上创建Service Mesh运行环境,然后进行验证. 图形化方式创建Service Mesh运行 ...
- 蚂蚁金服 Service Mesh 实践探索
作者 | 敖小剑 本文整理自蚂蚁金服高级技术专家在 QCon 上海 2018 上的演讲. 大家好,我是来自蚂蚁金服中间件团队的敖小剑,目前是蚂蚁金服 Service Mesh 项目的PD.我同时也是 ...
- 从蚂蚁金服实践入手,带你深入了解 Service Mesh
本文整理自蚂蚁金服高级技术专家敖小剑在 QCon 上海 2018 上的演讲. 我是来自蚂蚁金服中间件团队的敖小剑,目前是蚂蚁金服 Service Mesh 项目的 PD.我同时也是 Serviceme ...
最新文章
- 客户端相关知识学习(四)之H5页面如何嵌套到APP中
- SpringMVC-自定义转换器
- 区块链随想:共识不等于信用
- 【pyqt5学习】——进度条progressBar
- [转载]--- 开箱即用的springboot分库分表sharding-JDBC
- java 网页正文抽取算法_GitHub - hfut-dmic/ContentExtractor: 自动抽取网页正文的算法,用JAVA实现...
- 必须要掌握的七种谈话技巧
- servlet的doPost 和doGet和web文件结构
- 蓝桥杯 ALGO-116算法训练 最大的算式
- 微软纸牌服务器慢,微软为何设计纸牌和扫雷?真是用心良苦
- Stm32串口通信基础实验
- 忘记Mac开机密码处理方法
- Take me to your heart(English Song)
- 设计一个圆形的类即Circle类。
- 【LeetCode】Day51-打家劫舍 III变形
- 20170711 通过阿里云与国家气象局合作的api读取历史辐照数据
- 受邀参加2009中国电子商务创新发展高峰论坛
- NLP学习笔记-FastText文本分类(四)
- 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第五集
- 世界一流企业,谁不是靠模仿起家的?
热门文章
- android 内存分析 郭霖_android 内存泄漏(OOM)问题总结
- python多重继承super父类参数_多重继承如何处理super()和不同的参数?
- gitlab php自动化测试,自动化发布-GitLab WEB Hooks 配置
- java 一个线程运行_Java并发(基础知识)—— 创建、运行以及停止一个线程
- python中socket怎么用_Python 之socket的应用
- python数据结构实验目的_图的基本操作实现(数据结构实验)
- nmos导通流向_技术参数详解,MOS管知识最全收录!
- 计算机系毕业生自我评价,计算机系应届毕业生自我评价范文
- 资源分享|平面设计师可参考的素材网站
- UI设计素材模板|完美日期选择器