首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在 Istio 服务网格内连接外部 MySQL 数据库

在 Istio 服务网格内连接外部 MySQL 数据库

作者头像
万猫学社
发布于 2022-12-01 08:07:40
发布于 2022-12-01 08:07:40
2K00
代码可运行
举报
运行总次数:0
代码可运行

为了方便理解,以 Istio 官方提供的 Bookinfo 应用示例为例,利用 ratings 服务外部 MySQL 数据库

Bookinfo应用的架构图如下:

其中,包含四个单独的微服务:

  • productpage:调用 detailsreviews 两个服务,用来生成页面。
  • details:包含了书籍的信息。
  • reviews:包含了书籍相关的评论。它还会调用 ratings 微服务。
  • rating:包含了由书籍评价组成的评级信息。

其中,reviews 服务有 3 个版本:

  • v1 版本不会调用 ratings 服务。
  • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
  • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

准备 MySQL 数据库

创建一个名为 test 数据库,执行以下SQL创建表和数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DROP TABLE IF EXISTS `ratings`;
CREATE TABLE `ratings`  (
  `ReviewID` int() NOT NULL,
  `Rating` int() NULL DEFAULT ,
  PRIMARY KEY (`ReviewID`) USING BTREE
) ENGINE = InnoDB;

INSERT INTO ratings (ReviewID, Rating) VALUES (, );
INSERT INTO ratings (ReviewID, Rating) VALUES (, );

创建ServiceEntry

执行以下命令创建ServiceEntry:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mysqldb
spec:
  hosts:
  - mysqldb.svc.remote
  ports:
  - number: 3306
    name: mysql
    protocol: MySQL
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: 192.168.1.116
    ports:
      mysql: 3306
EOF

其中,192.168.1.116MySQL 数据库的IP,3306是 MySQL 数据库的端口。

创建ratings服务

首先,执行以下命令,获取密码的Base64编码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
echo -n 'OneMoreSociety' | base64

其中,OneMoreSociety是连接 MySQL 数据库的密码。

然后,执行以下命令,创建 ratings 服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
  name: mysql-credentials
type: Opaque
data:
  dbpasswd: T25lTW9yZVNvY2lldHk=
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v2-mysql
  labels:
    app: ratings
    version: v2-mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v2-mysql
  template:
    metadata:
      labels:
        app: ratings
        version: v2-mysql
    spec:
      containers:
      - name: ratings
        image: docker.io/istio/examples-bookinfo-ratings-v2:1.16.2
        imagePullPolicy: IfNotPresent
        env:
          - name: DB_TYPE
            value: "mysql"
          - name: MYSQL_DB_HOST
            value: mysqldb.svc.remote
          - name: MYSQL_DB_PORT
            value: "3306"
          - name: MYSQL_DB_USER
            value: root
          - name: MYSQL_DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysql-credentials
                key: dbpasswd
        ports:
        - containerPort: 9080
        securityContext:
          runAsUser: 1000
EOF

其中,T25lTW9yZVNvY2lldHk=是连接 MySQL 数据库的密码的Base64编码。

修改路由规则

执行以下命令,把对 reviews 服务的调用全部路由到 v2 版本上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
    - labels:
        version: v3
      name: v3
EOF

执行以下命令,把对 ratings 服务的调用全部路由到 v2-mysql 版本上:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v2-mysql
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: ratings
spec:
  host: ratings
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2-mysql
      name: v2-mysql
EOF

效果

访问 productpage 页面,可以看到 Reviewer1 显示2星, Reviewer2 显示4星,和数据库中的数据一致,如下图:

productpage@万猫学社

在Kiali中也可以看到对应的拓扑结构,如下图:

kiali@万猫学社

流量转移

访问 MySQL 数据库时,所有流量都路由到v1版本,具体配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: mysqldb
spec:
  hosts:
  - mysqldb.svc.remote
  ports:
  - number: 3306
    name: tcp
    protocol: TCP
  location: MESH_EXTERNAL
  resolution: STATIC
  endpoints:
  - address: 192.168.1.116
    ports:
      tcp: 3306
    labels:
      version: v1
  - address: 192.168.1.118
    ports:
      tcp: 3306
    labels:
      version: v2
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mysqldb
spec:
  hosts:
  - mysqldb.svc.remote
  tcp:
  - route:
    - destination:
        host: mysqldb.svc.remote
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mysqldb
spec:
  host: mysqldb.svc.remote
  subsets:
    - labels:
        version: v1
      name: v1
    - labels:
        version: v2
      name: v2
EOF

访问 MySQL 数据库时,把50%流量转移到v2版本,具体配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mysqldb
spec:
  hosts:
  - mysqldb.svc.remote
  tcp:
  - route:
    - destination:
        host: mysqldb.svc.remote
        subset: v1
      weight: 50
    - destination:
        host: mysqldb.svc.remote
        subset: v2
      weight: 50
EOF

访问 MySQL 数据库时,所有流量都路由到v2版本,具体配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mysqldb
spec:
  hosts:
  - mysqldb.svc.remote
  tcp:
  - route:
    - destination:
        host: mysqldb.svc.remote
        subset: v2
EOF
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 万猫学社 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
istio流量路由小试牛刀
下载https://github.com/istio/istio/releases/download/1.18.2/istio-1.18.2-osx-arm64.tar.gz
code4it
2023/07/27
2830
istio流量路由小试牛刀
Istio 入门(五):访问控制和流量管理
主要演示了使用 Istio Gateway、VirtualService 对外暴露服务的访问地址 ,以及基于 Istio 实现可观察性的 Kiali 组件。让我们回在上一章中部署的 bookinfo 示例已经学习了什么:
痴者工良
2023/07/24
1.1K0
Istio 入门(五):访问控制和流量管理
10个 Istio 流量管理 最常用的例子,你知道几个?
为了方便理解,以Istio官方提供的Bookinfo应用示例为例,引出 Istio 流量管理的常用例子。
万猫学社
2022/12/01
4350
10个 Istio 流量管理 最常用的例子,你知道几个?
istio流量路由小试牛刀
下载https://github.com/istio/istio/releases/download/1.18.2/istio-1.18.2-osx-arm64.tar.gz
code4it
2023/08/31
2790
istio流量路由小试牛刀
Istio的流量管理(实操一)(istio 系列三)
使用官方的Bookinfo应用进行测试。涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求超时,熔断处理和流量镜像。不含ingress和Egree,后续再补充。
charlieroro
2020/05/20
8740
Istio流量管理之请求路由分析
前面我们了解了 Gateway 和 VirtualService 资源对象的作用,以及它们是如何影响 Envoy 的配置的,那么这些资源对象又是如何影响流量的呢?通过 Istio 如何实现流量管理的呢?
我是阳明
2023/11/09
5370
Istio流量管理之请求路由分析
Service Mesh - Istio流量控制篇(下)
部署 httpbin 服务,同样,官方demo已经提供了该配置文件,执行如下命令应用即可:
端碗吹水
2020/12/23
1.1K0
Service Mesh - Istio流量控制篇(下)
Istio边界流量-Ingress Gateway拓展用法
该应用由四个单独的微服务构成。 这个应用模仿在线书店的一个分类,显示一本书的信息。 页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
王先森sec
2023/04/24
7400
Istio边界流量-Ingress Gateway拓展用法
Istio简单介绍
Istio是一个开放平台,提供统一的方式来集成微服务,管理跨微服务的流量,执行策略和汇总遥测数据。Istio的控制面板在底层集群管理平台(如Kubernetes,Mesos等)上提供了一个抽象层
dogfei
2020/07/31
1.9K0
5个 Istio 访问外部服务流量控制最常用的例子,你知道几个?
5 个 Istio 访问外部服务的流量控制常用例子,强烈建议收藏起来,以备不时之需。
万猫学社
2022/12/01
3860
四, 跨语言微服务框架 - Istio官方示例(超时控制,熔断器,流量复制)
基础的Istio环境已经搭建完成,我们需要开始了解Istio提供作为微服务网格的各种机制,也就是本文标题的(超时控制,熔断器,流量复制,速率控制)官方很给力的准备的实例项目也不需要大家自己编写demo来进行测试,那就来时跑跑看吧.
喵了个咪233
2019/05/26
1.1K0
Istio路由管理简介
本文以Istio 1.3.0 在Kubernetes中的部署为例,结合其bookinfo例子(https://istio.io/docs/examples/bookinfo/#deploying-the-application)对Istio的 v1apha3 路由API进行简要的介绍。其中Istio采用了Evaluation Install(https://istio.io/docs/setup/install/kubernetes/)。正文内容需要读者对Kubernetes和Istio的基本概念有基本的了解。
王录华
2019/10/23
2K2
Istio路由管理简介
mac 上学习k8s系列(36)istio part IV 内外路由和故障注入
下面以bookingo为例介绍下如何实现上述功能的。Bookinfo这个示例应用由4个独立的微服务组成
golangLeetcode
2022/08/02
3670
mac 上学习k8s系列(36)istio part IV 内外路由和故障注入
Istio v1aplha3 路由 AP
v1alpha3引入了以下这些新的配置资源来控制进入网格,网格内部和离开网格的流量路由。
py3study
2020/01/08
8570
istio 流量管理
​ Istio Bookinfo 示例包含四个独立的微服务,每个微服务都有多个版本。 其中一个微服务 reviews 的三个不同版本已经部署并同时运行。 为了说明这导致的问题,在浏览器中访问 Bookinfo 应用程序的 /productpage 并刷新几次。 您会注意到,有时书评的输出包含星级评分,有时则不包含。 这是因为没有明确的默认服务版本路由,Istio 将以循环方式请求路由到所有可用版本,此任务的最初目标是应用将所有流量路由到微服务的 v1 (版本 1)的规则。
星哥玩云
2022/09/15
6440
istio 流量管理
Istio的流量管理(概念)(istio 系列二)
istio的流量路由规则可以简单地控制不同服务间的流量以及API调用。Istio在服务层面提供了断路器,超时,重试等功能,通过这些功能可以简单地实现A/B测试,金丝雀发布,基于百分比的流量分割等,此外还提供了开箱即用的故障恢复功能,用于增加应用的健壮性,以应对服务故障或网络故障。
charlieroro
2020/05/20
1.9K0
微服务治理istio
Service Mesh 的中文译为“服务网格”,是一个用于处理服务和服务之间通信的基础设施层,它负责为构建复杂的云原生应用传递可靠的网络请求,并为服务通信实现了微服务所需的基本组件功能,例如服务发现、负载均衡、监控、流量管理、访问控制等。在实践中,服务网格通常实现为一组和应用程序部署在一起的轻量级的网络代理,但对应用程序来说是透明的。
yuezhimi
2020/09/30
1.4K0
微服务治理istio
Service Mesh · Istio · 以实践入门
本文是笔者在学习官方文档、相关博客文章和实践过程中,整理了一些知识概念和自己的思考,主要在探索 lstio 的实际应用场景, Sidecar 原理, Service Mesh 为什么出现、要解决什么问题等,帮助我们思考微服务技术架构的升级和落地的可行性。
heidsoft
2020/02/25
1.1K0
Service Mesh · Istio · 以实践入门
Service Mesh - Istio流量控制篇(上)
路由这个功能是流量控制里面非常重要,也是最常用的一个功能。在Istio里一般通过Virtual Service(虚拟服务)以及Destination Rule(目标规则)这两个API资源进行动态路由的设置。
端碗吹水
2020/12/23
1.6K0
Service Mesh - Istio流量控制篇(上)
Istio 入门(七):出入口网关 - 负载均衡和熔断等一系列功能
Istio 可以管理集群的出入口流量,当客户端访问集群内的应用时, Istio 可以将经过 istio-ingressgateway 的流量实现负载均衡和熔断等一系列功能。
痴者工良
2023/10/27
1K0
Istio 入门(七):出入口网关 - 负载均衡和熔断等一系列功能
相关推荐
istio流量路由小试牛刀
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档