OpenShift 4 之Service Mesh教程(6)- 根据Header路由请求

34 篇文章 1 订阅
21 篇文章 3 订阅

OpenShift 4.x HOL教程汇总
说明:本文已经在OpenShift 4.8环境中验证

场景一

本文的请求通过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
  1. 执行命令,创建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
  1. 运行命令,然后在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-gateway
  http:
  - match:
    - headers:
        foo:
          exact: bar
    route:
    - destination:
        host: frontend
        subset: v1
  - route:
    - destination:
        host: frontend
        subset: 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]
  1. 在Kiali控制台中查看微服务调用路径。
    在这里插入图片描述

用 Gateway 的路由访问 Frontend 应用

除了使用以上VirtualService对应的路由(该路由名为frontend,是本系列第一步创建的,在my-istio-app项目中)地址访问,还可使用本步Gateway自动生成对应的route(该route会在istio-system项目中)访问Frontend应用。

  1. 查看“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: http
        number: 80
        protocol: HTTP
  selector:
    istio: ingressgateway
EOF
  1. 在创建完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控制台实现配置

  1. 确认已经部署相关的前后端应用和相关服务,同时删除所有已有的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
  1. 在Kiali控制台中进入Services的菜单,然后进入frontend。在页面中右侧点击“Actions”中进入“Request Routing”。
    在这里插入图片描述
  2. 在“Create Request Routing”对话框中先在“Request Matching”中按照下图配置,即“headers,User-Agent,prefix,curl”,最后点击“Add Match”。
    在这里插入图片描述
  3. 然后在“Route To”栏中按照下图调整frontend-v1和frontend-v2的比例,然后点击“Add Rule”。
    在这里插入图片描述
  4. 然后再回到“Request Matching”,按照下图清除“Matching Selected”的内容。
    在这里插入图片描述
  5. 再回到“Route To”栏,按照下图调整frontend-v1和frontend-v2的比例,然后点击“Add Rule”。
    在这里插入图片描述
  6. 点开对话框下方的“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"]   31s
 
NAME                                           HOST                                      AGE
destinationrule.networking.istio.io/frontend   frontend-curl.apps.apps-crc.testing   31s
 
NAME                                           AGE
gateway.networking.istio.io/frontend-gateway   31s
  1. 查看由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
  1. 使用不同的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"}]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值