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动态存储部署)
集群名称 | 集群域名 | 说明 |
---|---|---|
base | base.xincan.cn | 部署harbor、nfs等服务 |
master | master.xincan.cn | kubernetes主节点,做污点容忍,排除业务资源,nfs客户端等 |
slave1 | slave1.xincan.cn | kubernetes从节点,nfs客户端等 |
slave2 | slave2.xincan.cn | kubernetes从节点,nfs客户端等 |
二、总体流程:
- 当前seata版本为1.4.2
- 找一台虚拟机部署harbor、nfs服务,我这里不在赘述,请参照前面的文档;
- 在kubernetes主节点上某个目录下创建nacos-single文件夹,也可以自定义,主要保证内部kubernetes资源定义文件一样即可;
- 进入此文件夹之后,复制一下文档中列出的kubernetes资源并保存到此目录下,所有资源如下列表;
[root@master seata-single]# tree
seata-single
├── 1-seata-namespace.yaml
├── 2-seata-configmap.yaml
├── 3-seata-deployment.yaml
└── 4-seata-service.yaml
- 创建数据库
- seata参数配置
- 资源创建;
- 效果展示;
- 连接测试;
三、创建数据库
- 参照2-kubernetes-mysql-nfs单机版部署
- 开放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
- 创建seata数据库
- 导入如下数据
- sql地址:github.com/seata/seata…
/*
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;
四、seata参数配置
- 由于本节参数是放到nacos上,所以前提nacos安装,请参照6-Kubernetes-nacos-nfs单机版部署
- 在nacos的dashboard上配置自己的命名空间,如图
- 命名空间ID:seata-0001,seata配置的时候namespace对应的value值
- 命名空间:seata
- 描述:创建这个空间的说明
-
下载seata源码,将seata参数发布到nacos对应的seata的命名空间下,在配置管理下
-
当前我的nacos和seata都是1.4.2,需要将分支切换到1.4.2
-
五、修改seata源码
- 1:找到script文件夹
- 2:找到config.txt、nacos-config.sh两个文件
- 3:修改config.txt文件内容
- 4:修改naocs-config.sh文件内容
- 5:执行命令
- 修改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=自定义表名
- 修改nacos-config.sh文件
- 找到97行代码,替换掉刚才修改的config.txt配置文件的路径,这里采用相对路径
- 将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
- 执行命令,将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
- 命令执行过程中,会弹出命令窗口,执行完成自动关闭
- 查看nacos面板参数情况
- 找到配置管理下面的配置列表
- 1 切换到seata命名空间下,可以看到刚才执行命令远程上传的参数信息
- 查看属性是否是刚才配置的
- 搜索刚刚修改的store.db.url
- 发现修改正确
六、资源创建
- 创建seata的命名空间Namespace,名称为:seata
- 将所有的资源挂载到此命名空间下;
[root@master seata-single]# vim 1-seata-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: seata
labels:
app: seata
- 创建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"
}
}
- 创建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
- 创建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
- 创建资源
- 进入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]#
七、效果展示
- 通过
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]#
八、测试连接、外部地址访问
- 通过地址端口号访问
- 获取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]#
- 查看seata命名空间下,seata-service已经注册到服务上
九:结束语
至此单机版Kubernetes部署nacos单机版完成