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

本系列演示的场景使用了基于Java实现的三个微服务:Customer、Preference、Recommendation,它们的调用关系是Customer ⇒ Preference ⇒ Recommendation,其中Recommendation有多个版本。本章节主要部署这三个微服务并能从外部访问它们。

  1. 首先将教程中使用到的代码下载到本地。由于我修改过部分代码,因此建议不要使用上游项目。
$ git clone https://github.com/redhat-developer-demos/istio-tutorial
$ cd istio-tutorial
  1. 以Customer微服务为例,我们可以查看customer/kubernetes/Deployment.yml文件。此文件定义了如何部署Customer微服务,其中部署的容器镜像是“quay.io/rhdevelopers/istio-tutorial-customer:v1.1”;而将“sidecar.istio.io/inject”设为“true”是为了实现自动注入微服务的Sidecar。
  2. 执行以下命令,部署Customer、Preference、Recommendation微服务并创建对应的Service。
$ oc apply -n tutorial -f customer/kubernetes/Deployment.yml
$ oc apply -n tutorial -f customer/kubernetes/Service.yml
$ oc apply -n tutorial -f preference/kubernetes/Deployment.yml
$ oc apply -n tutorial -f preference/kubernetes/Service.yml
$ oc apply -n tutorial -f recommendation/kubernetes/Deployment.yml
$ oc apply -n tutorial -f recommendation/kubernetes/Service.yml
  1. 查看运行微服务的Pod运行状态,完成后在tutorial中应该运行了3个Pod。在“READY”状态中可以看到每个Pod中运行2个Container,其中一个运行的是微服务,另一个运行的是对应的Sidecar。
$ oc get pod -n tutorial
NAME                                 READY   STATUS    RESTARTS   AGE
customer-77dc47d7f8-hbxcn            2/2     Running   0          32h
preference-v1-55476494cf-xm4dq       2/2     Running   0          32h
recommendation-v1-67976848-4l4s7     2/2     Running   0          32h

注意:如果此时看到的Pod中只要1个容器,通常是由于没有将运行servicemesh应用的项目名"tutorial"添加到OpenShift Service Mesh Operator的Service MesMemberRoll中的members。另外还有可能没有为部署的pod提供自动注入的“annotations”(或没生效),可以确认在每个Deployments中有以下部分:sidecar.istio.io/inject: "true"

apiVersion: apps/v1
kind: Deployment
。。。template:metadata:labels:app: customerversion: v1annotations:sidecar.istio.io/inject: "true"
  1. 运行命令,查看Customer微服务运行Pod中包括容器的情况,其中一个运行微服务的容器customer,另一个容器运行sidecar的容器istio-proxy。
$ oc get pods -o jsonpath="{.items[*].spec.containers[*].name}" -l app=customer -n tutorial
customer istio-proxy
$ oc describe pod $(oc get pod -n tutorial | grep customer | awk '{print $1}') -n tutorial
...
Containers:customer:Container ID:   cri-o://bb459fef3e4080f703d83c61ff88c56c2ee2c5c424bab6071e2cd0f3a149b7a6Image:          quay.io/rhdevelopers/istio-tutorial-customer:v1.1Image ID:       quay.io/rhdevelopers/istio-tutorial-customer@sha256:d1b0054dc21406b6b5fc172e8ffd35cc4f447550e26cbafdc8f6a1f7d9184661Ports:          8080/TCP, 8778/TCP, 9779/TCPHost Ports:     0/TCP, 0/TCP, 0/TCPState:          RunningStarted:      Sun, 12 Jan 2020 18:36:23 +0800Last State:     TerminatedReason:       OOMKilledExit Code:    137Started:      Sun, 12 Jan 2020 14:32:19 +0800Finished:     Sun, 12 Jan 2020 18:36:22 +0800Ready:          TrueRestart Count:  2Limits:cpu:     500mmemory:  40MiRequests:cpu:      200mmemory:   20MiLiveness:   exec [curl localhost:8080/health/live] delay=5s timeout=1s period=4s #success=1 #failure=3Readiness:  exec [curl localhost:8080/health/ready] delay=6s timeout=1s period=5s #success=1 #failure=3Environment:JAVA_OPTIONS:  -Xms15m -Xmx15m -Xmn15mMounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-qt9vl (ro)istio-proxy:Container ID:  cri-o://41803682d3d2d6828e4077a3e6e3e338d886025dfa030fc7d7f02229cca88ad6Image:         registry.redhat.io/openshift-service-mesh/proxyv2-rhel8:1.0.3Image ID:      registry.redhat.io/openshift-service-mesh/proxyv2-rhel8@sha256:7f01dec612f36a48cd548a81f8f47a54b9f1b1c76366e40aefb56abe39cf167ePort:          15090/TCPHost Port:     0/TCPArgs:proxysidecar--domain$(POD_NAMESPACE).svc.cluster.local--configPath/etc/istio/proxy--binaryPath/usr/local/bin/envoy--serviceClustercustomer.$(POD_NAMESPACE)--drainDuration45s--parentShutdownDuration1m0s--discoveryAddressistio-pilot.istio-system:15010--zipkinAddresszipkin.istio-system:9411--connectTimeout10s--proxyAdminPort15000--concurrency2--controlPlaneAuthPolicyNONE--statusPort15020--applicationPorts8080,8778,9779State:          RunningStarted:      Sun, 12 Jan 2020 14:25:44 +0800Ready:          TrueRestart Count:  0Limits:cpu:     500mmemory:  128MiRequests:cpu:      100mmemory:   128MiReadiness:  http-get http://:15020/healthz/ready delay=1s timeout=1s period=2s #success=1 #failure=30Environment:POD_NAME:                      customer-77dc47d7f8-hbxcn (v1:metadata.name)POD_NAMESPACE:                 tutorial (v1:metadata.namespace)INSTANCE_IP:                    (v1:status.podIP)ISTIO_META_POD_NAME:           customer-77dc47d7f8-hbxcn (v1:metadata.name)ISTIO_META_CONFIG_NAMESPACE:   tutorial (v1:metadata.namespace)ISTIO_META_INTERCEPTION_MODE:  REDIRECTISTIO_METAJSON_ANNOTATIONS:    {"openshift.io/scc":"restricted","sidecar.istio.io/inject":"true"}ISTIO_METAJSON_LABELS:         {"app":"customer","pod-template-hash":"77dc47d7f8","version":"v1"}Mounts:/etc/certs/ from istio-certs (ro)/etc/istio/proxy from istio-envoy (rw)/var/run/secrets/kubernetes.io/serviceaccount from default-token-qt9vl (ro)
...
  1. 为了访问Customer微服务,还要创建Gateway和VirtualService对象。可以查看customer/kubernetes/Gateway.yml文件中定义的Gateway(gw)和VirtualService(vs)对象,其中名为customer-gateway的VirtualService包括了一个名为customer-gateway的Gateway。customer-gateway的Gateway监听在80端口,当名为customer的VirtualService收到对于“/customer"路径请求后就发给名为customer的service,该service的监听端口是8080。
    VirtualService对象:
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:                               name: customer-gateway     # VirtualService name
spec:                                   hosts:                                - "*"                                 gateways:                             - customer-gateway        # gateway name           http:                                 - match:                              - uri:                              exact: /customer                        rewrite:uri: /               # 将"/customer"改写为"/"route:                              - destination:                      host: customer        # service url, can long service url or short service url.          port:                           number: 8080        # service port

Gateway对象:

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:                                                name: customer-gateway
spec:                                                    selector:                                              istio: ingressgateway     # 通过 istio=ingressgateway 的Label定位于ServiceMeshControlPlane中运行ingressgateway的podservers:                                               - port:                                                number: 80                                         name: http                                         protocol: HTTP                                     hosts:                                               - "*"
  1. 执行命令创建Gateway和VirtualService对象,然后查看它们的状态。注意:“istio-io”代表所有和网络相关的对象,包括Gateway、VirtualService、DestinationRule等对象。
$ oc apply -f customer/kubernetes/Gateway.yml -n tutorial
gateway.networking.istio.io/customer-gateway created
virtualservice.networking.istio.io/customer-gateway created$ oc get istio-io -n tutorial
NAME                                           AGE
gateway.networking.istio.io/customer-gateway   7sNAME                                                  GATEWAYS               HOSTS   AGE
virtualservice.networking.istio.io/customer-gateway   ["customer-gateway"]   ["*"]   7s
  1. 通过绑定到名为istio-ingressgateway路由的Gateway入口发起访问,返回结果显示微服务customer依次调用了preference和recommendation微服务。可以看到调用计数器会增加,且“67976848-4l4s7”为微服务运行pod的id。
$ export INGRESS_GATEWAY=$(oc get route istio-ingressgateway -n ${ISTIO_SYSTEM} -o 'jsonpath={.spec.host}')
$ ./scripts/run.sh $INGRESS_GATEWAY/customer
customer => preference => recommendation v1 from 'recommendation-v1-dd8544f7c-s64sx': 1
customer => preference => recommendation v1 from 'recommendation-v1-dd8544f7c-s64sx': 2
customer => preference => recommendation v1 from 'recommendation-v1-dd8544f7c-s64sx': 3

注意:在实际操作过程中出现“Application is not available”的错误,发现是 ServiceMeshControlPlane 自动创建的负责流量入口的pod在日志中报错。此时可手动删除有问题的istio-ingressgateway-xxxxxx的pod,系统自动生成新的pod,从运行日志中(下图)确认新的pod运行正常。

至此,我们就在OpenShift 4的Serivice Mesh环境中部署好了3个微服务,并且已经可以从外部访问到它们了。

OpenShift 4 - Istio-Tutorial (2) 部署三个微服务相关推荐

  1. 【转】Rancher部署Træfik实现微服务的快速发现

    Rancher部署Træfik实现微服务的快速发现 原文链接:http://dwz.cn/6rhDAz 原创 2017-08-28 洪晓露 RancherLabs Træfik 是什么? Træfik ...

  2. Java架构师-微服务:微服务架构【单体部署 --改造--> 微服务架构】【分布式:分散压力;微服务:分散能力】【RESTFul+Docker+K8S、SpringCloud】

    一.微服务概述 微服务架构是团队面对互联网产品爆发式增长的最优选择,要解决的是快速迭代.高可靠和高可用等问题,把复杂度很高的产品拆分成一些较小的模块,并遵循康威定律,每一个模块用5-9个小团队来维护, ...

  3. openshift 部署_在OpenShift上部署Java EE微服务

    openshift 部署 我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客. 您学习了如何使用Maven构建所谓的"胖子",还使用Maven Doc ...

  4. 在OpenShift上部署Java EE微服务

    我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客. 您学习了如何使用Maven构建一个所谓的"胖子",还使用Maven Docker插件对我们的微服 ...

  5. centos部署python flask_python 微服务框架之nameko实践

    大纲: 1.本篇关键技术点及其释义 2.实际需求和目标 3.可行的三大解决方案 4.微服务与传统服务的差别 5.代码大纲:安装依赖及nameko五个完整的代码示例 6.附录:docker的在线安装方式 ...

  6. Rancher部署Traefik实现微服务的快速发现

    Traefik 是什么? Traefik 是一个为了让部署微服务更加便捷而诞生的现代HTTP反向代理.负载均衡工具.它支持多种后台 (Rancher.Docker.Swarm.Kubernetes.M ...

  7. 「微服务架构」基于NGINX的三种微服务参考架构

    作者注:本博文是系列文章的第一篇: Introducing the NGINX Microservices Reference Architecture (this post) MRA, Part 2 ...

  8. SpringCloud笔记(三)微服务应用

    微服务应用 前面我们已经完成了SpringCloudAlibaba的学习,我们对一个微服务项目的架构体系已经有了一定的了解,那么本章我们将在应用层面继续探讨微服务. 分布式权限校验 虽然完成前面的部分 ...

  9. 微服务架构下的核心话题 (三):微服务架构的技术选型

    前期回顾: 微服务架构下的核心话题 (一):微服务架构下各类项目的顺势崛起 微服务架构下的核心话题 (二):微服务架构的设计原则和核心话题 一.前言 为了实现基于微服务开发的产品,或者说为了将单体应用 ...

最新文章

  1. MySQL中函数CONCAT及GROUP_CONCAT
  2. Java1.5语言新特性简单总结
  3. thinkpad笔记本散热风扇_十代酷睿笔记本低至2999元 你可以入手了_笔记本新闻
  4. 2021牛客暑期多校训练营3A-Guess and lies【dp】
  5. Linux 退出保存/不保存
  6. 解决:Request header field Content-Type is not allowed by Access-Control-Allow-Headers
  7. android居中不父布局,在父级中,TextView不会垂直居中_android_开发99编程知识库
  8. 使用信号灯法,标志位解决测试生产者消费者问题(源码解析、建议收藏)
  9. 通过 JavaScript调用Asp.net(C#)后台方法
  10. springboot修改项目不需要重启服务器
  11. ThinkPHP学生管理系统
  12. python的string与Unicode转换,gbk字符串编码
  13. cncert阅读报告
  14. Live555本地保存H264/PCM视频音频帧附加SPS/PPS
  15. python列表推导式去除m3u8中的广告视频地址下载视频
  16. 总结2018,规划2019
  17. (附源码)小程序 图书管理系统 毕业设计 250858
  18. 如何选择一个适合自己的创业项目,赚取人生的第一桶金
  19. mysql_0n-常见函数-211116
  20. 宏用于所有的excel文件

热门文章

  1. linux链接时报未定义的引用,g ++链接或引用不与本地安装的库一起使用:未定义的引用...
  2. macos 判断走无线网还是有线网_“第一次约会,就想发生关系”:怎样判断男人对你走心还是走肾?...
  3. mybatis mapper配置 bigint_Mybatis-Plus入门
  4. 华中数控机器人编程循环三次_华中数控:公司在数控技术上不断创新突破 在技术方面处于国内领先水平...
  5. strcpy用于调用的参数太少_JVM:虚拟机方法调用(理解重载和重写的本质)
  6. python中if的输入格式_Python基础之输出格式和If判断
  7. java foreach顺序_Java中的LongStream forEachOrdered()方法
  8. fgetcsv php,PHP - fgetcsv - 分隔符被忽略?
  9. 设计灵感|文字排版海报有多少种可能?
  10. UI素材干货|听说UI设计师更喜欢Sketch