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


    为了方便理解,以 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 - <
    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 - <
    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 - <
    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 - <
    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 - <
    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 - <
    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 - <
    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必读技术书籍

  • 相关阅读:
    JavaScript混淆工具大比拼:JScrambler和JShaman哪个更胜一筹?
    C++ web httpserver
    英特尔旗下Mobileye纳斯达克上市:上涨38% 市值231亿美元
    redis 必知必会
    美容院微信小程序怎么添加会员管理功能
    Linux 磁盘进入自检模式的解决方法
    Python如何远程连接设置密码的MongoDB库
    python中常用的属性访问机制:__getattribute__、__setattr__、__delattr__和__getattr__
    动手学深度学习(Pytorch版)代码实践 -卷积神经网络-15参数管理
    DeepMind CEO 最新《纽约时报》专访:AGI 将使能源变得廉价甚至免费,货币性质也将发生转变
  • 原文地址:https://www.cnblogs.com/heihaozi/p/17481862.html