在 Istio 服务网格内连接外部 MySQL 数据库
2023/6/15 11:53:43
本文主要是介绍在 Istio 服务网格内连接外部 MySQL 数据库,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
为了方便理解,以 Istio 官方提供的 Bookinfo 应用示例为例,利用 ratings 服务外部 MySQL 数据库。
Bookinfo应用的架构图如下:
其中,包含四个单独的微服务:
-
productpage
:调用details
和reviews
两个服务,用来生成页面。 -
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星,和数据库中的数据一致,如下图:
在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必读技术书籍
这篇关于在 Istio 服务网格内连接外部 MySQL 数据库的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-07MySQL读写分离入门:轻松掌握数据库读写分离技术
- 2024-12-07MySQL读写分离入门教程
- 2024-12-07MySQL分库分表入门详解
- 2024-12-07MySQL分库分表入门指南
- 2024-12-07MySQL慢查询入门:快速掌握性能优化技巧
- 2024-12-07MySQL入门:新手必读的简单教程
- 2024-12-07MySQL入门:从零开始学习MySQL数据库
- 2024-12-07MySQL索引入门:新手快速掌握MySQL索引技巧
- 2024-12-06BinLog学习:MySQL数据库BinLog入门教程
- 2024-12-06Binlog学习:MySQL数据库的日志管理入门教程