[seata]Mac环境内,使用K8s部署Seata+Nacos时遇到注册异常

2024-02-04 124 views
3
Ⅰ. Issue Description

我使用Mac进行本地的服务开发,因为整体的服务治理使用K8s+Istio,所以在引入Seata时,也就引入了Nacos配合开展工作。

在我在本地部署时遇到一个奇怪的问题。我使用官方的K8s部署指引参考链接,向nacos进行注册时,发现启动的Seata pod日志内,压根不向nacos发起注册申请。

Ⅱ. Describe what happened

我的配置文件如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: seata-server
  namespace: ltgw
  labels:
    k8s-app: seata-server
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: seata-server
  template:
    metadata:
      labels:
        k8s-app: seata-server
    spec:
      containers:
        - name: seata-server
          image: docker.io/seataio/seata-server:1.6.1
          imagePullPolicy: IfNotPresent
          env:
            - 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
      volumes:
        - name: seata-config
          configMap:
            name: seata-server-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: seata-server-config
  namespace: ltgw
data:
  registry.conf: |
    registry {
        type = "nacos"
        nacos {
          application = "seata-server"
          server-addr = "nacos:8848"
          group = "SEATA_GROUP"
          namespace = ""
          cluster = "default"
          username = "nacos"
          password = "nacos"
          context-path = ""
        }
    }
    config {
      type = "file"
    }

我又重新使用Docker进行部署,经过一番尝试,我部署成功了。在Docker内,Seata正常注册到Nacos中。

然后我又重新回来折腾K8s部署,可无论如何修改还是无济于事。最终,我使用文件挂载的方式,不使用ConfigMap,直接将Docker关联的配置resources挂载到pod中,这种方式成功了!

但这仅仅是我单机开发环境,还可以凑合这样用,我还是希望能使用ConfigMap方式挂载,这样的话,我未来才好进行远程云化部署。

Just paste your stack trace here!

因为是个部署问题,所以暂时不贴大量日志于此。

Ⅲ. Describe what you expected to happen

我希望得到一个可用的K8s通过ConfigMap部署的指导方案。

Ⅳ. How to reproduce it (as minimally and precisely as possible)
  1. Mac环境,安装Docker Desktop,并且成功启动K8s
  2. 在K8s按照参考链接进行K8s部署
  3. 应该会观察到Seata并未向Nacos发起注册
Ⅴ. Anything else we need to know? Ⅵ. Environment:
  • JDK version(e.g. java -version): 1.8
  • Seata client/server version: 1.6.2
  • Database version:
  • OS(e.g. uname -a):Darwin MacBook-Pro.local 22.1.0 Darwin Kernel Version 22.1.0: Sun Oct 9 20:14:54 PDT 2022; root:xnu-8792.41.9~2/RELEASE_X86_64 x86_64
  • Others: Nacos 2.2.3

回答

6

这个问题和mac无关,只要是k8s中部署seata-server,系统参数 SEATA-CONFIG-NAME 就不会生效。 实际验证的结果,1.4.2版本是好的。从1.5.0版本开始,一直到最新的1.6.1版本,都存在这个问题。

8

感谢您的回复。不知道官方是否有解决方案,按理说应该会有不少在K8s上部署使用的场景吧

4

这个BUG已经很久了,你去搜索issue,也能找到类似的问题(比如 #5385 #4820)。官方没有修复,也没有回应。我猜测有两个可能性: 1、官方希望统一使用spring-boot对 application.yml的加载优先级的原理来自定义配置项,并废弃原来独立的 registry.conf配置文件,但忘记了更新文档。 2、官方无意废弃 registry.conf 文件,但从1.5.0以后,无意中引入了BUG。

不管是哪一种原因,反正是没有修复,也没有回应。你还是先利用 spring-boot 对 application.yml 文件的加载优先级的原理,外置自定义配置信息来解决问题吧。

你先自定义一个application.yml配置,比如:

server:
  port: 7091

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:
    # support: file, nacos, consul, apollo, zk, etcd3
    type: nacos
    nacos:
      server-addr: nacos.dev.svc.cluster.local:8848
      group : "SEATA_GROUP"
      namespace: "seata"
      username: ""
      password: ""
  registry:
    # support: file, nacos, eureka, redis, zk, consul, etcd3, sofa
    type: nacos
    nacos: 
      application: seata-server
      server-addr: nacos.dev.svc.cluster.local:8848
      group : "SEATA_GROUP"
      namespace: "seata"
      cluster: default
      username: ""
      password: ""
  store:
    # support: file 、 db 、 redis  
    mode: redis
  server:
    service-port: 8091 #If not configured, the default is '${server.port} + 1000'
  security:
    secretKey: SeataSecretKey0c382ef121d778043159209298fd40bf3850a017
    tokenValidityInMilliseconds: 1800000
    ignore:
      urls: /,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/api/v1/auth/login

然后将该文件所在目录,挂载到pod的 /seata-server/config 目录下:

        - name: dataroot                  # 磁盘卷名称,自定义文件application.yml 在该卷的 config 子目录下
          mountPath: /seata-server/config   #容器内挂载路径
          subPath: config
          readOnly: false
1

补充说明一下,一定要将自定义application.yml 文件挂载到pod的 /seata-server/config 路径下的原因,是按照 spring-boot 的加载优先级,该路径下的 application.yml ,优先级高于镜像自带的默认配置: /seata-server/resources/application.yml。

0

@fredworks 你猜测的2点都是对的,第一点是我们升级1.5的时候就是想着废弃conf,但是现在回过头感觉影响了大家的平滑k8s和docker升级seata-server,所以https://github.com/seata/seata/pull/5668 这个pr就是为了解决conf挂载后不生效的问题而存在