7-Kubernetes-seata-nfs单机版部署

205 阅读8分钟

Kubernetes-seata-nfs单机版部署

背景

简单的在kubernetes上部署单例的seata,并将seata作为服务注册到nacos,由nacos统筹管理seata配置文件

一、环境准备,安装kubernetes集群

​ 当前节点base、master、slave1、slave2

kubernetes安装不在此赘述,请参考参考资料进行安装

kubernetes安装nfs不在此赘述,请参考参考资料进行安装

​ 参考资料

1-Kubernetes基于Centos7构建基础环境(一)

2-Kubernetes基于Centos7构建基础环境(二)

3-Kubernetes基于Centos7构建基础环境(三)

4-Kubernetes-基于Centos7安装面板及监控(四)

1-kubernetes-nfs动态存储部署)

集群名称集群域名说明
basebase.xincan.cn部署harbor、nfs等服务
mastermaster.xincan.cnkubernetes主节点,做污点容忍,排除业务资源,nfs客户端等
slave1slave1.xincan.cnkubernetes从节点,nfs客户端等
slave2slave2.xincan.cnkubernetes从节点,nfs客户端等

二、总体流程:

  1. 当前seata版本为1.4.2
  2. 找一台虚拟机部署harbor、nfs服务,我这里不在赘述,请参照前面的文档;
  3. 在kubernetes主节点上某个目录下创建nacos-single文件夹,也可以自定义,主要保证内部kubernetes资源定义文件一样即可;
  4. 进入此文件夹之后,复制一下文档中列出的kubernetes资源并保存到此目录下,所有资源如下列表;
[root@master seata-single]# tree
seata-single
├── 1-seata-namespace.yaml
├── 2-seata-configmap.yaml
├── 3-seata-deployment.yaml
└── 4-seata-service.yaml

  1. 创建数据库
  2. seata参数配置
  3. 资源创建;
  4. 效果展示;
  5. 连接测试;

三、创建数据库

  1. 参照2-kubernetes-mysql-nfs单机版部署
  2. 开放mysql service端口,当前开放端口为30336
[root@master mysql-single]# kubectl -n mysql get pod,svc
NAME                        READY   STATUS    RESTARTS   AGE
pod/mysql-88b8cd69b-xn8qz   1/1     Running   0          80s

NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/mysql-service   NodePort   10.101.230.59   <none>        3306:30336/TCP   80s
  1. 创建seata数据库

image-20210628185204543

  1. 导入如下数据
/*
 Navicat Premium Data Transfer

 Source Server         : mysql-single-172.16.124.140
 Source Server Type    : MySQL
 Source Server Version : 50728
 Source Host           : 172.16.124.140:30336
 Source Schema         : seata

 Target Server Type    : MySQL
 Target Server Version : 50728
 File Encoding         : 65001

 Date: 28/06/2021 18:13:10
*/

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for branch_table
-- ----------------------------
DROP TABLE IF EXISTS `branch_table`;
CREATE TABLE `branch_table` (
  `branch_id` bigint(20) NOT NULL,
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `resource_group_id` varchar(32) DEFAULT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `branch_type` varchar(8) DEFAULT NULL,
  `status` tinyint(4) DEFAULT NULL,-- -------------------------------- The script used when storeMode is 'db' --------------------------------
-- the table to store GlobalSession data
CREATE TABLE IF NOT EXISTS `global_table`
(
    `xid`                       VARCHAR(128) NOT NULL,
    `transaction_id`            BIGINT,
    `status`                    TINYINT      NOT NULL,
    `application_id`            VARCHAR(32),
    `transaction_service_group` VARCHAR(32),
    `transaction_name`          VARCHAR(128),
    `timeout`                   INT,
    `begin_time`                BIGINT,
    `application_data`          VARCHAR(2000),
    `gmt_create`                DATETIME,
    `gmt_modified`              DATETIME,
    PRIMARY KEY (`xid`),
    KEY `idx_gmt_modified_status` (`gmt_modified`, `status`),
    KEY `idx_transaction_id` (`transaction_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store BranchSession data
CREATE TABLE IF NOT EXISTS `branch_table`
(
    `branch_id`         BIGINT       NOT NULL,
    `xid`               VARCHAR(128) NOT NULL,
    `transaction_id`    BIGINT,
    `resource_group_id` VARCHAR(32),
    `resource_id`       VARCHAR(256),
    `branch_type`       VARCHAR(8),
    `status`            TINYINT,
    `client_id`         VARCHAR(64),
    `application_data`  VARCHAR(2000),
    `gmt_create`        DATETIME(6),
    `gmt_modified`      DATETIME(6),
    PRIMARY KEY (`branch_id`),
    KEY `idx_xid` (`xid`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;

-- the table to store lock data
CREATE TABLE IF NOT EXISTS `lock_table`
(
    `row_key`        VARCHAR(128) NOT NULL,
    `xid`            VARCHAR(128),
    `transaction_id` BIGINT,
    `branch_id`      BIGINT       NOT NULL,
    `resource_id`    VARCHAR(256),
    `table_name`     VARCHAR(32),
    `pk`             VARCHAR(36),
    `gmt_create`     DATETIME,
    `gmt_modified`   DATETIME,
    PRIMARY KEY (`row_key`),
    KEY `idx_branch_id` (`branch_id`)
) ENGINE = InnoDB
  DEFAULT CHARSET = utf8;
  `client_id` varchar(64) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime(6) DEFAULT NULL,
  `gmt_modified` datetime(6) DEFAULT NULL,
  PRIMARY KEY (`branch_id`),
  KEY `idx_xid` (`xid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of branch_table
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for global_table
-- ----------------------------
DROP TABLE IF EXISTS `global_table`;
CREATE TABLE `global_table` (
  `xid` varchar(128) NOT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `status` tinyint(4) NOT NULL,
  `application_id` varchar(32) DEFAULT NULL,
  `transaction_service_group` varchar(32) DEFAULT NULL,
  `transaction_name` varchar(128) DEFAULT NULL,
  `timeout` int(11) DEFAULT NULL,
  `begin_time` bigint(20) DEFAULT NULL,
  `application_data` varchar(2000) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`xid`),
  KEY `idx_gmt_modified_status` (`gmt_modified`,`status`),
  KEY `idx_transaction_id` (`transaction_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of global_table
-- ----------------------------
BEGIN;
COMMIT;

-- ----------------------------
-- Table structure for lock_table
-- ----------------------------
DROP TABLE IF EXISTS `lock_table`;
CREATE TABLE `lock_table` (
  `row_key` varchar(128) NOT NULL,
  `xid` varchar(128) DEFAULT NULL,
  `transaction_id` bigint(20) DEFAULT NULL,
  `branch_id` bigint(20) NOT NULL,
  `resource_id` varchar(256) DEFAULT NULL,
  `table_name` varchar(32) DEFAULT NULL,
  `pk` varchar(36) DEFAULT NULL,
  `gmt_create` datetime DEFAULT NULL,
  `gmt_modified` datetime DEFAULT NULL,
  PRIMARY KEY (`row_key`),
  KEY `idx_branch_id` (`branch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of lock_table
-- ----------------------------
BEGIN;
COMMIT;

SET FOREIGN_KEY_CHECKS = 1;

image-20210629143742134

四、seata参数配置

  1. 由于本节参数是放到nacos上,所以前提nacos安装,请参照6-Kubernetes-nacos-nfs单机版部署
  2. 在nacos的dashboard上配置自己的命名空间,如图
    • 命名空间ID:seata-0001,seata配置的时候namespace对应的value值
    • 命名空间:seata
    • 描述:创建这个空间的说明

image-20210629150612594

  1. 下载seata源码,将seata参数发布到nacos对应的seata的命名空间下,在配置管理下

image-20210629151207799

五、修改seata源码

  • 1:找到script文件夹
  • 2:找到config.txt、nacos-config.sh两个文件
  • 3:修改config.txt文件内容
  • 4:修改naocs-config.sh文件内容
  • 5:执行命令

image-20210629151520183

  1. 修改config.txt(可以不修改,采用默认即可,但是要和后续的程序对应上)
    • 修改seata服务,提供事务分组信息
    • 修改自定义分组对应的服务名称
# 原值,代码15行
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091


# 修改后的值
service.vgroupMapping.my_test_tx_group=default
service.default.grouplist=127.0.0.1:8091
  • 修改数据存储方式,当前采用mysql存储
# 原值,代码35行
store.mode=file


# 修改后的值
store.mode=db
  • 配置mysql数据库信息,当前数据库安装在kubernetes上
  • 修改数据库链接地址、端口号、用户名称、登录密码,数据库名称根据自己需要可以修改,或者不修改
# 原值,代码43~55行
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=username
store.db.password=password
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000


# 修改后的值
store.db.datasource=druid
store.db.dbType=mysql
store.db.driverClassName=com.mysql.jdbc.Driver
store.db.url=jdbc:mysql://mysql-service.mysql:3306/seata?useUnicode=true&rewriteBatchedStatements=true
store.db.user=root
store.db.password=123456
store.db.minConn=5
store.db.maxConn=30
store.db.globalTable=global_table
store.db.branchTable=branch_table
store.db.queryLimit=100
store.db.lockTable=lock_table
store.db.maxWait=5000
  • 配置日志表名称,后续每个业务表中必须有这张表、提供seata事务日志记录
  • 此处步骤可以根据自己需要,是否修改这张表名
# 原值,79行
client.undo.logTable=undo_log


# 修改后的值
client.undo.logTable=自定义表名
  1. 修改nacos-config.sh文件
    • 找到97行代码,替换掉刚才修改的config.txt配置文件的路径,这里采用相对路径
    • (dirname"(dirname "PWD") 替换成 ..
# 源代码,97行代码

for line in $(cat $(dirname "$PWD")/config.txt | sed s/[[:space:]]//g); do
  (( count++ ))
	key=${line%%=*}
    value=${line#*=}
	addConfig "${key}" "${value}"
done


# 修改后的代码
for line in $(cat ../config.txt | sed s/[[:space:]]//g); do
  (( count++ ))
	key=${line%%=*}
    value=${line#*=}
	addConfig "${key}" "${value}"
done
  1. 执行命令,将config.txt中配置的seata参数属性推送到nacos上
    • 打开idea下面的Terminal
    • 切换到nacos-config.sh同级目录下
    • 执行如下命令
    • -h nacos服务器地址
    • -p nacos服务器端口号
    • -t nacos命名空间ID,注意次数并不是nacos的命名空间,而是命名空间ID
    • -g 基于上述,在nacos面板上配置参数必填的分组名称
    • -u nacos登录用户名称
    • -w nacos登录用户密码
nacos-config.sh -h 192.168.1.81 -p 30716 -t seata-0001 -g SEATA_GROUP -u nacos -w nacos

image-20210629155241447

  1. 命令执行过程中,会弹出命令窗口,执行完成自动关闭
  2. 查看nacos面板参数情况
    • 找到配置管理下面的配置列表
    • 1 切换到seata命名空间下,可以看到刚才执行命令远程上传的参数信息

image-20210629155355448

  1. 查看属性是否是刚才配置的
    • 搜索刚刚修改的store.db.url
    • 发现修改正确

image-20210629155610381

六、资源创建

  1. 创建seata的命名空间Namespace,名称为:seata
    • 将所有的资源挂载到此命名空间下;
[root@master seata-single]# vim 1-seata-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: seata
  labels:
    app: seata
  1. 创建seata的配置资源ConfigMap,名称为:seata-config
    • application 当前服务名称为seata-service,此名称后续会注册到nacos上
    • serverAddr nacos服务地址,当前nacos部署在kubernetes上,所以地址为服务名称.命名空间:端口号,nacos-service.nacos:8848
    • namespace 指的是nacos上创建的命名空间ID,并不是命名空间名称
    • group 分组名称
[root@master seata-single]# vim 2-seata-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-server-config
  namespace: seata
data:
  registry.conf: |
    registry {
      type = "nacos"
      nacos {
        application = "seata-service"
        serverAddr = "nacos-service.nacos:8848"
        namespace = "seata-0001"
        group = "SEATA_GROUP"
        username = "nacos"
        password = "nacos"
      }
    }
    config {
      type = "nacos"
      nacos {
        serverAddr = "nacos-service.nacos:8848"
        namespace = "seata-0001"
        group = "SEATA_GROUP"
        username = "nacos"
        password = "nacos"
      }
    }
  1. 创建seata实例资源Deployment,名称为:seata
[root@master seata-single]# vim 3-seata-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata
  namespace: seata
  labels:
    app: seata
spec:
  replicas: 1
  selector:
    matchLabels:
      app: seata
  template:
    metadata:
      labels:
        app: seata
    spec:
      containers:
        - name: seata
          image: base.hatech.com.cn/library/seata-server:v1.4.2
          imagePullPolicy: IfNotPresent
          env:
            - name: SEATA_MODE
              value: "nacos"
            - name: SEATA_PORT
              value: "8091"
            - name: SEATA_CONFIG_NAME
              value: file:/root/seata-config/registry
          ports:
            - name: http
              containerPort: 8091
              protocol: TCP
          volumeMounts:
            - name: seata-config
              mountPath: /root/seata-config
            - name: localtime
              mountPath: /etc/localtime
      volumes:
        - name: seata-config
          configMap:
            name: seata-server-config
        - name: localtime
          hostPath:
            type: File
            path: /etc/localtime
  1. 创建seata对外暴露资源Service,名称为:seata-service
[root@master seata-single]# vim 4-seata-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: seata-service
  namespace: seata
  labels:
    app: seata
spec:
  type: NodePort
  ports:
    - port: 8091
      nodePort: 31180
      protocol: TCP
      name: http
  selector:
    app: seata
  1. 创建资源
    • 进入seata-single执行命令:kubectl apply -f ../seata-single/
    • 删除所有资源命令:kubectl delete -f ../seata-single/
[root@master nacos-single]# kubectl apply -f ../nacos-single/
namespace/nacos created
configmap/nacos-server-config created
deployment.apps/nacos created
service/nacos-service created
[root@master nacos-single]#


[root@master nacos-single]# kubectl delete -f ../nacos-single/
namespace "nacos" deleted
configmap "nacos-config" deleted
deployment.apps "nacos" deleted
service "seata-service" deleted
[root@master redis-single]#

七、效果展示

  1. 通过kubectl -n seata get cm,pod,svc,查询seata命名空间下对应资源,pv(persistentvolume)数据挂载资源,pvc等等资源
[root@master seata-single]# kubectl -n seata get cm,pod,svc
NAME                            DATA   AGE
configmap/kube-root-ca.crt      1      23m
configmap/seata-server-config   1      23m

NAME                         READY   STATUS    RESTARTS   AGE
pod/seata-8549bb44ff-vt4qc   1/1     Running   0          23m

NAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/seata-service   NodePort   10.99.96.211   <none>        8091:30091/TCP   23m
[root@master seata-single]#

八、测试连接、外部地址访问

  1. 通过地址端口号访问
    • 获取NodePort端口
    • 登录名称:nacos
    • 登录密码:nacos
[root@master seata-single]# kubectl -n nacos get svc
NAME            TYPE       CLUSTER-IP    EXTERNAL-IP   PORT(S)          AGE
nacos-service   NodePort   10.98.50.71   <none>        8848:30265/TCP   38m
[root@master seata-single]#
  1. 访问地址:http://192.168.1.81:31150/nacos

image-20210628190925161

  1. 查看seata命名空间下,seata-service已经注册到服务上

image-20210629162643350

九:结束语

至此单机版Kubernetes部署nacos单机版完成