《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
- 执行命令,创建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-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]
- 在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: http
number: 80
protocol: HTTP
selector:
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"] 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
- 查看由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"}]