《OpenShift 4.x HOL教程汇总》
说明:本文已经在OpenShift 4.13环境中验证
部署Istio微服务,并验证访问
- 确认当前环境中有名为istio-app的项目,该项目在前面已经被加入到Service Mesh Member Roll的Member。
$ ISTIO_SYSTEM=istio-system
$ ISTIO_APP=istio-app
$ oc get project ${ISTIO_APP}
- 执行以下命令部署Istio微服务资源。
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/catalog/kubernetes/catalog-service-template.yml
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/partner/kubernetes/partner-service-template.yml
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/gateway/kubernetes/gateway-service-template.yml
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/catalog/kubernetes/Service.yml
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/partner/kubernetes/Service.yml
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/gateway/kubernetes/Service.yml
- 完成后应该可以看到3个pod,每个pod包括2个container,其中一个是微服务,一个是微服务对应的istio-proxy。
$ oc get pod -n ${ISTIO_APP}
NAME READY STATUS RESTARTS AGE
catalog-v1-6b576ffcf8-g6b48 2/2 Running 0 1m
partner-v1-68b4854c79-s5vnd 2/2 Running 0 2m
gateway-7b6bb9dcf7-zb8br 2/2 Running 0 1m
$ oc get svc -n ${ISTIO_APP}
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
catalog ClusterIP 172.30.112.255 <none> 8080/TCP 9m9s
gateway ClusterIP 172.30.110.18 <none> 8080/TCP 8m6s
partner ClusterIP 172.30.104.58 <none> 8080/TCP 4m1s
注意:如果READY只显示“1/1”,说明没有自动注入运行istio-proxy的sidecar容器。需要确认在对应的Deployment中有为Pod声明sidecar.istio.io/inject: "true"的annotations,然后在手动更新一下Deployment。
- 执行命令创建Gateway和VirtualService对象,构建微服务访问通道。注意:该访问通道是通过运行在istio-system项目中的istio-ingressgateway实现的。
$ oc -n ${ISTIO_APP} apply -f https://raw.githubusercontent.com/liuxiaoyu-git/OpenShift-HOL/master/service-mesh-gw.yaml
- 查找gateway的访问地址GATEWAY_URL,然后访问。返回会显示微服务的访问路径,可以看到当前访问的v1版的catalog微服务。
$ GATEWAY_URL=$(oc get route istio-ingressgateway -n ${ISTIO_SYSTEM} -o jsonpath='{.spec.host}')
$ curl ${GATEWAY_URL}
gateway => partner => catalog v1 from '6b576ffcf8-g6b48': 1
- 执行命令,持续访问应用。
$ while true; do curl ${GATEWAY_URL}; sleep 1;done
gateway => partner => catalog v1 from '56c9c9846d-svwdn': 2
gateway => partner => catalog v1 from '56c9c9846d-svwdn': 3
gateway => partner => catalog v1 from '56c9c9846d-svwdn': 4
gateway => partner => catalog v1 from '56c9c9846d-svwdn': 5
- 在第二个Terminal窗口执行命令,获取Kiali控制台的访问地址KIALI_URL。
$ oc get route kiali -n ${ISTIO_SYSTEM} -o template --template='{{.spec.host}}'
- 用浏览器访问Kiali控制台,然后使用OpenShift相同的管理员用户和密码登录。在Namespace选择istio-tutorial,然后选择Service graph的Graph,即可看到如下Kiali跟踪到的微服务访问路径。注意:如果图像区域显示 “Empty Graph”,可以将右上方的统计时间选为 Last 5m。
- 终止 6 步的脚本运行。
Istio 动态路由、灰度发布、流量镜像
部署v2版的catalog微服务,然后配置Gateway引流,将请求发给v1和v2。
- 执行命令,创建v2版的catalog微服务。该为服务也有2个container,其中一个是微服务,一个是微服务对应的istio-proxy。
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/catalog-v2/kubernetes/catalog-service-template.yml
$ oc get pod -l application=catalog -n ${ISTIO_APP}
NAME READY STATUS RESTARTS AGE
catalog-v1-6b576ffcf8-g6b48 2/2 Running 0 31m
catalog-v2-7764964564-hj8xl 2/2 Running 0 49s
- 在第一个Terminal中执行以下命令,持续访问GATEWAY_URL。可以看到是catalog轮流用v1和v2的微服务响应请求。
$ while true; do curl ${GATEWAY_URL}; sleep 1; done
- 在第二个Terminal中执行以下命令,创建DestinationRule和VirtualService对象,然后查看确认请求被全部路由到v2版的catalog上。
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/istiofiles/destination-rule-catalog-v1-v2.yml
$ oc -n ${ISTIO_APP} create -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/istiofiles/virtual-service-catalog-v2.yml
- 还可通过Kiali控制台中查看 Versioned app graph,并在 Display 中显示 Response Time 和 Traffic Animation。确认所有请求都发到v2版的catalog微服务上了。
- 在第二个Terminal中执行以下命令,修改VirtualService对象配置,然后查看确认请求被全部路由到v1版的catalog上。
$ oc -n ${ISTIO_APP} replace -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/istiofiles/virtual-service-catalog-v1.yml
- 在第二个Terminal中执行以下命令,删除VirtualService对象配置,然后查看确认请求被平均发到v1和v2版的catalog上。
$ oc delete VirtualService catalog -n ${ISTIO_APP}
- 在Kiali中的Versioned app graph视图,并显示Requ Distribution和Triffic Animation,可以看到请求平均发到catalog的v1和v2上。
- 在第二个Terminal中执行以下命令,使用mirror的VirtualService策略,将请求发给v1的同时通过mirror发给v2。这种策略可以用来在不影响现有v1使用的时候测试v2版本的catalog微服务。
$ oc -n ${ISTIO_APP} apply -f https://raw.githubusercontent.com/liuxiaoyu-git/ocp-service-mesh-foundations/master/istiofiles/virtual-service-catalog-v1-mirror-v2.yml
- 可以进入OpenShift控制台,在istio-tutorial项目中找到catalog-v1和catalog-v2的Pod,然后查看Logs。可以看到2个Pod都有日志输出,说明请求被mirror到2个版本的微服务中了。
- 另外也可以在Kiali控制台查看微服务调用过程,通过Animation可以看到一个请求会发给所有catalog服务的mirror目标。
更新微服务
如果更新微服务代码,可以通过以下过程编译代码、构建镜像和重新部署镜像。
- 获取微服务代码。
$ git clone https://github.com/gpe-mw-training/ocp-service-mesh-foundations
- 修改微服务代码后执行以下命令编译代码。
$ cd ocp-service-mesh-foundations/partner/java/springboot
$ ls
Dockerfile mvnw mvnw.cmd pom.xml src target
$ mvn clean install
- 构建镜像,然后推送到 Image Registry上(例如quay.io)。
$ podman build -t quay.io/ACCOUNT-NAME/partner-service:1.0 .
$ podman login quay.io -u REGISTRY-USERNAME -p PASSWORD
$ podman push quay.io/ACCOUNT-NAME/partner-service:1.0
- 如果从Image Registry拉镜像需要认证,则执行命令创建对应的Secret对象。
$ oc create secret docker-registry quay-secret --docker-server=quay.io --docker-username=REGISTRY-USERNAME --docker-password=PASSWORD --docker-email=YOUR-EMAIL
$ oc secrets link default quay-secret --for=pull
- 修改Deployment文件,使用最新的镜像“quay.io/ACCOUNT-NAME/partner-service:1.0”。
- 删除原有的Deployment,然后根据修改后的Deployment文件重新部署即可生效。
参考
https://github.com/gpe-mw-training/ocp-service-mesh-foundations
https://cloud.ibm.com/docs/solution-tutorials?topic=solution-tutorials-openshift-service-mesh
https://access.redhat.com/documentation/zh-cn/openshift_container_platform/4.6/html/service_mesh/deploying-applications-ossm