k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 + mysql 数据库

k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 + mysql 数据库

大纲

  • 1 镜像制作
  • 2 准备configmap
  • 3 准备deploy 部署文件
  • 4 部署seata到k8s

镜像制作

下载seata 选择1.6.0。下载后得到 seata-server-1.6.0.zip 已经上传到百度云盘

下载地址:http://seata.io/zh-cn/blog/download.html

使用unzip 解压 seata-server-1.6.0.zip

unzip seata-server-1.6.0.zip

解压后得到如下文件夹

在这里插入图片描述

seata文件夹内部包含

  • Dockerfile 创建docker镜像的文件
  • LICENSE
  • bin seata启动脚本
  • conf seata配置
  • ext 性能监控
  • lib 依赖的jar包
  • logs 日志放置位置
  • script 一些脚本 例如数据库脚本 k8s脚本
  • target seata程序所在包 脚本最终会执行 seata-server.jar

可以直接Dockerfile来创建镜像

docker build -t my-seata-server .
docker tag my-seata-server registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0
docker push registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0

在这里插入图片描述

创建好镜像后推送到私库备用

准备configmap

注意:

  • 1 也可以不使用configmap 因为seata1.6.0无法reload配置文件
  • 2 假定mysql数据库配置以及nacos配置以完成,

关于nacos 与 mysql配置可参考
可参考 《seata1.6.0 单机,集群搭建 基于nacos注册中心 mysql数据库》

如果要实现配置文件修改后自动重启,可以使用linux-inotify监听文件变化后重启
可参考 《linux-inotify工具监控文件状态变化总结》
《k8s 部署nginx 实现集群统一配置,自动更新nginx.conf配置文件 总结》

准备两个configmap

  • 1 保存seata application 配置文件 (configmap-for-server.yaml)
  • 2 保存seata logback 配置文件 (configmap-for-logger.yaml)

主要是把 application.yml logback-spring.xml 和 logback文件夹中的配置文件交由configmap管理

在这里插入图片描述

configmap-for-server.yaml 内容如下 保存server相关配置文件

# 将配置放置在configmap中统一管理
apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-server-config
data:
  application.yml: |
    server:
      port: 17091 #修改控制台端口
    
    spring:
      application:
        name: seata-server
    
    logging:
      config: classpath:logback-spring.xml
      file:
        path: ${user.home}/logs/seata
      extend:
        logstash-appender:
          destination: 127.0.0.1:4560
        kafka-appender:
          bootstrap-servers: 127.0.0.1:9092
          topic: logback_to_logstash
    
    console:
      user:
        username: seata
        password: seata
    
    seata:
      config:
        type: nacos
        nacos:
          server-addr: 192.168.0.206:8248
          namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4
          group: DEFAULT_GROUP
          data-id: seata.properties      
          #username:  
          #password: 
      registry:
        type: nacos
        nacos:  
          application: seata-server
          server-addr: 192.168.0.206:8248
          namespace: 8422b4bf-8b04-406e-8295-39d4968b2ec4
          group: DEFAULT_GROUP
          cluster: default
          #username:  
          #password: 
      security:
        secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
        tokenValidityInMilliseconds: 1800000
        ignore:
          urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

  logback-spring.xml: | 
    <?xml version="1.0" encoding="UTF-8"?>
    <configuration scan="true" scanPeriod="60 seconds" debug="false">
        <!-- Context listeners -->
        <contextListener class="io.seata.server.logging.listener.SystemPropertyLoggerContextListener"/>
    
        <!-- The conversion rules are copied from `defaults.xml` in the `spring-boot-xxx.jar` -->
        <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
        <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
        <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
        <!-- The custom conversion rules -->
        <conversionRule conversionWord="wEx2" converterClass="io.seata.server.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    
        <!-- common properties -->
        <springProperty name="PORT" source="server.port" defaultValue="7091"/>
        <springProperty name="APPLICATION_NAME" source="spring.application.name" defaultValue="seata-server"/>
    
    
        <!-- console-appender -->
        <include resource="logback/console-appender.xml"/>
    
        <!-- file-appender -->
        <include resource="logback/file-appender.xml"/>
    
        <!-- logstash-appender: off by default -->
        <!--<include resource="logback/logstash-appender.xml"/>-->
    
        <!-- kafka-appender: off by default -->
        <!--<include resource="logback/kafka-appender.xml"/>-->
    
        <root level="INFO">
            <!-- console-appender -->
            <appender-ref ref="CONSOLE"/>
    
            <!-- file-appender -->
            <appender-ref ref="FILE_ALL"/>
            <appender-ref ref="FILE_WARN"/>
            <appender-ref ref="FILE_ERROR"/>
    
            <!-- logstash-appender: off by default -->
            <!--<appender-ref ref="LOGSTASH"/>-->
    
            <!-- kafka-appender: off by default -->
            <!--<appender-ref ref="KAFKA"/>-->
        </root>
    </configuration>

configmap-for-logger.yaml 内容如下 保存logback相关配置文件 (注意 kafka-appender.xml logstash-appender.xml 并没有使用 这里为了演示统一也加入了管理

# 将配置放置在configmap中统一管理
apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-server-log-config
data:  
  console-appender.xml: |  
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- console-appender properties -->
        <springProperty name="CONSOLE_LOG_PATTERN" source="logging.pattern.console"
                        defaultValue="%clr(%d{HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%25.25t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx2"/>
    
        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
            <encoder>
                <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    </included>  
    
    
    
  file-appender.xml: |
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- file-appender properties -->
        <springProperty name="LOG_FILE_PATH" source="logging.file.path"
                        defaultValue="${user.home}/logs/seata"/>
        <springProperty name="FILE_LOG_PATTERN" source="logging.pattern.file"
                        defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p --- [%30.30t] %-40.40logger{39} : %m%n%wEx2"/>
    
        <!--ALL-->
        <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.all.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.all.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>2GB</maxFileSize>
                <MaxHistory>7</MaxHistory>
                <totalSizeCap>7GB</totalSizeCap>
                <cleanHistoryOnStart>true</cleanHistoryOnStart>
            </rollingPolicy>
            <encoder>
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!--WARN-->
        <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>WARN</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.warn.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.warn.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>2GB</maxFileSize>
                <MaxHistory>7</MaxHistory>
                <totalSizeCap>7GB</totalSizeCap>
                <cleanHistoryOnStart>true</cleanHistoryOnStart>
            </rollingPolicy>
            <encoder>
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    
        <!--ERROR-->
        <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <filter class="ch.qos.logback.classic.filter.LevelFilter">
                <level>ERROR</level>
                <onMatch>ACCEPT</onMatch>
                <onMismatch>DENY</onMismatch>
            </filter>
            <file>${LOG_FILE_PATH}/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.error.log</file>
            <append>true</append>
            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                <fileNamePattern>${LOG_FILE_PATH}/history/${APPLICATION_NAME:-seata-server}.${RPC_PORT}.error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                <maxFileSize>2GB</maxFileSize>
                <MaxHistory>7</MaxHistory>
                <totalSizeCap>7GB</totalSizeCap>
                <cleanHistoryOnStart>true</cleanHistoryOnStart>
            </rollingPolicy>
            <encoder>
                <Pattern>${FILE_LOG_PATTERN}</Pattern>
                <charset>UTF-8</charset>
            </encoder>
        </appender>
    </included>      
    
    
  kafka-appender.xml: |
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- kafka-appender properties -->
        <springProperty name="KAFKA_BOOTSTRAP_SERVERS" source="logging.extend.kafka-appender.bootstrap-servers"
                        defaultValue="127.0.0.1:9092"/>
        <springProperty name="KAFKA_TOPIC" source="logging.extend.kafka-appender.topic"
                        defaultValue="logback_to_logstash"/>
    
        <appender name="KAFKA" class="com.github.danielwegener.logback.kafka.KafkaAppender">
            <encoder>
                <!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS}|%p|${APPLICATION_NAME:-seata-server}|${RPC_PORT:-0}|%t|%logger|%X{X-TX-XID:-}|%X{X-TX-BRANCH-ID:-}|%m|%wex</pattern>-->
                <pattern>{
        "@timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
        "level":"%p",
        "app_name":"${APPLICATION_NAME:-seata-server}",
        "PORT": ${RPC_PORT:-0},
        "thread_name": "%t",
        "logger_name": "%logger",
        "X-TX-XID": "%X{X-TX-XID:-}",
        "X-TX-BRANCH-ID": "%X{X-TX-BRANCH-ID:-}",
        "message": "%m",
        "stack_trace": "%wex"
    }
                </pattern>
            </encoder>
            <topic>${KAFKA_TOPIC}</topic>
            <keyingStrategy class="com.github.danielwegener.logback.kafka.keying.NoKeyKeyingStrategy"/>
            <deliveryStrategy class="com.github.danielwegener.logback.kafka.delivery.AsynchronousDeliveryStrategy"/>
            <producerConfig>bootstrap.servers=${KAFKA_BOOTSTRAP_SERVERS}</producerConfig>
            <producerConfig>acks=0</producerConfig>
            <producerConfig>linger.ms=1000</producerConfig>
            <producerConfig>max.block.ms=0</producerConfig>
        </appender>
    </included>   
    

  logstash-appender.xml: |   
    <?xml version="1.0" encoding="UTF-8"?>
    <included>
        <!-- logstash-appender properties -->
        <springProperty name="LOGSTASH_DESTINATION" source="logging.extend.logstash-appender.destination"
                        defaultValue="127.0.0.1:4560"/>
    
        <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <!-- the TCP address of the logstash -->
            <destination>${LOGSTASH_DESTINATION}</destination>
    
            <!--<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">-->
            <encoder charset="UTF-8" class="io.seata.server.logging.logback.appender.EnhancedLogstashEncoder">
                <!-- the global custom fields -->
                <customFields>
                    {
                        "app_name": "${APPLICATION_NAME:-seata-server}"
                    }
                </customFields>
    
                <!-- Exclude the provider of data `@version` -->
                <excludeProvider>net.logstash.logback.composite.LogstashVersionJsonProvider</excludeProvider>
                <!-- Exclude providers that are not currently needed, reduce some performance loss. -->
                <excludeProvider>net.logstash.logback.composite.loggingevent.JsonMessageJsonProvider</excludeProvider>
                <excludeProvider>net.logstash.logback.composite.loggingevent.TagsJsonProvider</excludeProvider>
                <excludeProvider>net.logstash.logback.composite.loggingevent.LogstashMarkersJsonProvider</excludeProvider>
                <excludeProvider>net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider</excludeProvider>
            </encoder>
        </appender>
    </included>  

准备deploy 部署文件

准备部署两个seata服务来实现集群

由于业务服务部署在k8s集群外部无法访问k8s集群内部ip,seata注册到nacos需要使用独立的主机ip, 所以需要两个Deployment来部署seata 无法直接使用 --replicas=2

如果业务服务,nacos ,seata 都在k8s集群内部 ,则直接使用一个Deployment 指定–replicas=2

deploy.yaml 内容如下

# deploy1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-server-deploy-1
  labels:
    k8s-app: seata-server-1
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-seata-node1: node1
  template:
    metadata:
      labels:
        k8s-seata-node1: node1
        k8s-app: seata-server
    spec:
      imagePullSecrets:
        - name: myaliyunsecret
      containers:
        - name: seata-server-run
          image: registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0  #使用开始创建的镜像
          env: 
            - name: SEATA_IP   #环境变量中配置一个IP 用于注册中心
              value: "192.168.0.54"
            - name: SERVER_NODE  #指定seata-server节点ID, 默认为 根据ip生成 (可以不配置)
              value: "1"
            - name: SEATA_PORT   
              value: "5959"  #注意环境变量中是数字也需要使用“”
          volumeMounts:
            - name: seata-config
              mountPath: /seata-server/conf   #使用configMap挂载配置文件
            - name: seata-log-config
              mountPath: /seata-server/conf/logback  #使用configMap挂载配置文件
      volumes:
        - name: seata-config
          configMap:
            name: seata-server-config
        - name: seata-log-config
          configMap:
            name: seata-server-log-config     


---


# deploy2
apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-server-deploy-2
  labels:
    k8s-app: seata-server-2
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-seata-node2: node2
  template:
    metadata:
      labels:
        k8s-seata-node2: node2
        k8s-app: seata-server
    spec:
      imagePullSecrets:
        - name: myaliyunsecret
      containers:
        - name: seata-server-run
          image: registry.cn-hangzhou.aliyuncs.com/jimliu/my-seata-server:1.6.0  #使用开始创建的镜像
          env: 
            - name: SEATA_IP   #环境变量中配置一个IP 用于注册中心
              value: "192.168.0.124"
            - name: SERVER_NODE  #指定seata-server节点ID, 默认为 根据ip生成 (可以不配置)
              value: "2"
            - name: SEATA_PORT   
              value: "5959"  #注意环境变量中是数字也需要使用“”
          volumeMounts:
            - name: seata-config
              mountPath: /seata-server/conf   #使用configMap挂载配置文件
            - name: seata-log-config
              mountPath: /seata-server/conf/logback  #使用configMap挂载配置文件
      volumes:
        - name: seata-config
          configMap:
            name: seata-server-config
        - name: seata-log-config
          configMap:
            name: seata-server-log-config
            
 
---  
            

# service 
apiVersion: v1
kind: Service
metadata:
  name: seata-server
  labels:
    k8s-app: seata-server
spec:
  type: NodePort
  ports:
    - port: 5959
      nodePort: 5959
      targetPort: 5959
      protocol: TCP
      name: http1
    - port: 17091
      nodePort: 17091  #for seata 控制台
      targetPort: 17091
      protocol: TCP
      name: http2  
  selector:
    k8s-app: seata-server

部署seata到k8s

kubectl apply -f configmap-for-logger.yaml
kubectl apply -f configmap-for-server.yaml
kubectl apply -f deploy.yaml

在这里插入图片描述

在nacos上可以看到 seata已经成功注册

在这里插入图片描述

控制台可以正常访问

在这里插入图片描述

启动seata 容器时注意关注k8s内是否有LimitRange限制,seata默认启动使用1G内存

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 答: 部署K8S集群中的Seata需要按照以下步骤进行:1)准备好所需的资源,包括存储空间、网络资源等;2)利用Kubernetes的配置管理工具Helm将Seata部署Kubernetes集群中;3)根据需要进行Seata的配置;4)启动Seata集群;5)部署测试程序,验证Seata集群是否正常工作。 ### 回答2: Kubernetes(简称K8s)是一个开源的容器编排平台,它能够自动化地部署、扩展和管理应用程序容器。Seata是一种用于解决分布式事务问题的开源框架,可以保证分布式事务的一致性和隔离性。 在Kubernetes部署Seata集群需要以下步骤: 1. 准备Kubernetes集群:首先需要搭建一个稳定运行的Kubernetes集群。可以选择自建集群或使用云服务提供商的托管服务(如GKE、EKS等)。 2. 创建Seata集群所需的命名空间(Namespace):在Kubernetes中,命名空间用于隔离不同的应用。可以使用kubectl命令或者在yaml文件中定义命名空间。 3. 创建Seata集群所需的持久化存储:Seata集群需要使用持久化存储来保存事务数据和日志。可以选择使用Kubernetes提供的存储卷(Persistent Volume)或者外部存储(如云存储)。 4. 创建Seata集群所需的配置文件:Seata集群需要配置文件来指定各个组件的参数。可以在Kubernetes中使用ConfigMap或Secret来存储和管理配置文件。 5. 配置Seata Server:在Kubernetes中,可以使用Deployment来创建和管理Seata Server的实例。在Deployment中可以指定应用容器的镜像、资源限制以及其他参数。 6. 配置Seata Registry:Seata集群需要使用Registry来进行服务发现和注册。可以选择使用Kubernetes的Service或者其他服务注册中心(如Etcd、Consul等)作为Registry。 7. 配置Seata Client:在应用程序中使用Seata时,需要配置Seata Client来连接Seata集群。可以使用ConfigMap或者环境变量来指定Seata集群的地址和其他参数。 8. 部署应用程序:最后,在Kubernetes部署应用程序,并将应用程序与Seata集群连接起来。可以使用Deployment或者其他资源对象(如Pod、ReplicaSet)来管理应用程序。 通过以上步骤,就可以在Kubernetes上成功部署Seata集群。这样就可以使用Seata来保证分布式事务的一致性和隔离性,并且通过Kubernetes的自动化和扩展能力,可以实现高可用和高性能的分布式事务处理。 ### 回答3: k8sKubernetes)是一个开源的容器编排平台,可用于部署和管理容器化的应用程序。seata是一种分布式事务解决方案,可以帮助开发者实现基于微服务架构的分布式事务管理。在k8s部署seata集群需要以下步骤: 1. 准备seata配置文件:在部署seata之前,需要准备seata的配置文件。这些配置文件通常包括seata的事务协调器(TC)配置、存储模式、数据库连接配置等。 2. 创建k8s部署文件:根据seata的配置文件,创建k8s部署文件。这些部署文件通常包括seata事务协调器的Deployment、Service配置,以及其他相关的资源配置。 3. 部署seata集群:使用kubectl命令将seata集群部署文件应用到k8s集群中。kubectl命令可以创建、更新、删除k8s资源。 4. 验证seata集群部署:使用kubectl命令查看seata集群的运行状态,确保seata事务协调器部署成功。 5. 测试分布式事务功能:通过在微服务中添加seata的相关代码,实现分布式事务功能,并进行测试。可以模拟跨多个微服务的事务操作,验证seata的分布式事务管理能力。 总结:在k8s部署seata集群需要准备seata配置文件,创建k8s部署文件,部署seata集群,并测试分布式事务功能。通过k8s的弹性扩展和自动化管理能力,可以更方便地部署和管理seata集群,提高系统的可靠性和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寂寞的4角钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值