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

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

时间:2023-06-15 09:00:52浏览次数:40  
标签:ratings 服务 kubectl 数据库 网格 Istio MySQL apply

为了方便理解,以 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创建表和数据:

DROP TABLE IF EXISTS `ratings`;
CREATE TABLE `ratings`  (
  `ReviewID` int(11) NOT NULL,
  `Rating` int(11) NULL DEFAULT 0,
  PRIMARY KEY (`ReviewID`) USING BTREE
) ENGINE = InnoDB;

INSERT INTO ratings (ReviewID, Rating) VALUES (1, 2);
INSERT INTO ratings (ReviewID, Rating) VALUES (2, 4);

创建ServiceEntry

执行以下命令创建ServiceEntry:

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.116是 MySQL 数据库的IP,3306是 MySQL 数据库的端口。

创建ratings服务

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

echo -n 'OneMoreSociety' | base64

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

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

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 版本上:

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 版本上:

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@万猫学社

文章持续更新,微信搜索「万猫学社」第一时间阅读,关注后回复「电子书」,免费获取12本Java必读技术书籍。

流量转移

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

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版本,具体配置如下:

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版本,具体配置如下:

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

最后,感谢你这么帅,还给我点赞

微信公众号:万猫学社

微信扫描二维码

关注后回复「电子书」

获取12本Java必读技术书籍

标签:ratings,服务,kubectl,数据库,网格,Istio,MySQL,apply
From: https://www.cnblogs.com/heihaozi/p/17481862.html

相关文章

  • MySQL8新特性窗口函数详解
    本文博主给大家详细讲解一波MySQL8的新特性:窗口函数,相信大伙看完一定能有所收获......
  • MySQL8新特性窗口函数详解
    本文博主给大家详细讲解一波MySQL8的新特性:「窗口函数」,相信大伙看完一定能有所收获......
  • mysql 数据完整性
    一、实体完整性(表中的一行或一条数据。行级约束)1、主键约束(数据唯一且不能为NULL)添加方式createtablestu(idintprimarykey,namevarchar(20));   唯一约束自动增长列二、域完整性三、引用完整性......
  • mac安装mysql
    1.去官网下载mysqlhttps://dev.mysql.com/downloads/mysql/2.因为是从8.0才有的在安装时才能设置强密码,所以没办法设置密码,但是稍后会更改。3.打开终端,按i进入编辑模式:vim~/.bash_profile.exportPATH=$PATH:/usr/local/mysql/binexportPATH=$PATH:/usr/local/mysql/sup......
  • MySQL-ProxySQL中间件
    ProxySQL是基于MySQL的一款开源的中间件的产品,是一个灵活的MySQL代理层,可以实现读写分离,支持Query路由功能,支持动态指定某个SQL进行缓存,支持动态加载配置信息(无需重启ProxySQL服务),支持故障切换和SQL的过滤功能。相关ProxySQL的网站:https://www.proxysql.com/https://gith......
  • SQL 之 DDL(MySQL)
    创建数据库Create{database|schema}[ifnotexists]数据库名称;CREATEDATABASEifnotexistsSALARY;删除数据库dropdatabase[ifexists]数据库名称;DROPDATABASEifexistsSALARY;创建表createtableifnotexists表名(列名数据类型,);CREATETABLEDEPT......
  • Node Mysql连接池操作封装
    之前写了一个对mysql操作的封装的博客:nodemysql操作封装后面方向,当你访问量比较大的时候,直接用mysql的连接是会崩掉的,不支持这么多的连接,用连接池操作比较好,然后就操作了一下constmysql=require('mysql');module.exports={config:{host:'localhost',......
  • 阿里云服务器-mysql远程连接
    这两天买了个阿里云服务器,自己搞了一下,装了mysql,因为平时Navicat用习惯了,想着陪一下服务器的数据库,这样就方便操作了,然后搞了变天,设置bind-address,修改服务器端口,结果一番下来,还是没成功。然后今天看到了一个帖子UbuntuServer16.04下配置MySQL并开启远程连接,说是好像因为mysql结......
  • Node Mysql操作封装
    由于最近要写个签到系统,频繁的操作mysql导致代码量暴涨,就想着优化下SQL的结构,减少工作量。'usestrict';varmysql=require('mysql');//数据库配置module.exports={/***数据库配置*/config:{host:'localhost',port:3306,......
  • Windows安装多版本MySQL(命令行)
    注意:电脑上可以多个数据库版本共存,但是在初次安装执行mysqld-installmysql的时候需要将mysql替换为唯一的名字,并且环境变量只能配置一个1.windows中下载指定版本官网下载命令行版本:https://dev.mysql.com/downloads/mysql/解压到指定位置编写my.ini文件[mysqld]#设......