XXL-JOB部署到k8s时遇到的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XXL-JOB部署到k8s时遇到的问题相关的知识,希望对你有一定的参考价值。

参考技术A 我们的执行器和调度器都部署在k8s平台上。公司k8s平台要求所有日志都必须输出到控制台(这也是k8s的标准做法),后面再由ELK去抽取。所以执行器无法将通过XxlJobLogger.log()将日志输出到文件,调度器也无法查看任务的执行日志。

1、将核心日志写入任务结果的 ReturnT.msg 属性里,会记录到任务日志表的 “执行备注” 属性里。但是数据长度有限制。
2、可以将日志写入到k8s宿主机日志磁盘文件里,容器启停日志不会丢失。
3、自定定制Rolling Log存取逻辑,比如接入ES, “XxlJobLogger.log” 写入和查看均通过ES读写实现。

原文链接: https://github.com/xuxueli/xxl-job/issues/899

XXL-JOB分布式任务调度框架-集群部署

文章目录

1.引言

XXL-JOB有中心化的思想,一旦调度中心挂机会导致整体不可使用,所以要引入集群。
需要考虑点:

  • db配置保持一致
  • 登录账号配置保持一致
  • 集群机器时钟保持一致(单机集群可忽视)

2.集群服务启动

在是在同一台机器中,并且在上面打的包中,指定了数据库的url地址,所以只需要正常启动,就满足上述的条件了。
找到刚刚打的包,xxl-job-admin,这是一个springboot的功能,所以通过java -jar直接启动就好了,这里先启动两台。

java -jar xxl-job-admin-2.3.1.jar --server.port=8080
java -jar xxl-job-admin-2.3.1.jar --server.port=8081

操作到这里,一个基本的调度中心集群就搭建好了。
需要注意的是,XXL-JOB的集群并不是分片集群,不管部署多少台,同一时间执行调度任务的只会有一台。集群部署纯粹只是为了处理单点故障问题。

为什么会这么设计呢

如果是分片集群,在同一时间,不同的调度中心在执行同一个调度任务,会导致的重复调度问题,一般解决这种问题,可以通过分布式锁来处理,同一时间只让一个线程去处理任务。
在加上XXL-JOB的架构理念中,将调度器与执行器分离了,使用异步调用的方式来处理,从而大大降低了调度器的性能压力。
于是,就直接使用数据库的独占锁做分布式锁处理了,处理方式简单。

3.反向代理

上面我们已经获得了一个集群,但是对于生产环境来说,简单粗暴的通过调度中心所在服务器的ip访问并不是一个友好的方式,可想象的是,一旦ip发生了变化,我们所有的调度器所在服务的配置文件都需要修改。

更好的方式是通过反向代理的方式来暴露调度中心,以Windows环境为例,用以下步骤来做配置:

第一步:修改hosts文件
如果是生产环境,忽略这一步,直接使用生产环境的域名即可。本地配置hosts文件,主要是想把127.0.0.1映射到某个域名上。

127.0.0.1    ls.xxljob.cn

s.xxljob.cn 可以配置成任意自己喜欢的域名。

第二步:配置Nginx
一般来说,我们不会直接在nginx的配置文件中做配置,而是单独创建一个由某个服务独有的配置文件,方便管理。
这里我们在conf目录中创建xxl-job.conf并做以下配置:

# 负载均衡
upstream local.xxljob.cn 
    server 127.0.0.1:8080;
	server 127.0.0.1:8081;


server 
    listen       80; # nginx端口
    server_name  ls.xxljob.cn; # hosts中配置的域名

	error_page 404 /404.html;
	error_page 500 502 503 504  /50x.html;
	
	# 需要转发的uri路径
	location ~* /xxl-job-admin 
		proxy_pass  http://local.xxljob.cn; # 映射上面的upstream
		proxy_pass_header Date;
		proxy_pass_header Server;
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	


# 日志配置
log_format  xxl-job  '$remote_addr  - $upstream_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

access_log  logs/access.log  xxl-job;
error_log   logs/error.log;

配置好后,打开同级目录下nginx.conf文件,将上面的文件依赖到nginx配置中。

http 
	resolver 8.8.8.8;
    
	include       mime.types;
    default_type  application/octet-stream;
	include xxl-job.conf;
# ......此处省略其他配置


然后启动nginx,通过域名访问http://ls.xxljob.cn/xxl-job-admin/,成功展示页面则表示配置成功。

第三步:反向代理验证

在上面的nginx配置中,加入了一个日志格式化配置:- $upstream_addr,有这个配置后,我们就可以在access_log中查看负载均衡的请求详情了。
刷新几次页面,然后打开nginx目录下的log文件,看到8080和8081交替执行,表达负载均衡配置成功。

4.总结

XXL-JOB的调度中心集群部署只需要满足两个条件就可以在生产环境使用了:

  • 多个节点使用同一个数据库。
  • 多台机器的系统时间配置成一样的。

同时,只需要使用反向代理中间件,就可以让调度中心好用起来了。

建议:推荐通过nginx为调度中心集群做负载均衡,分配域名。调度中心访问、执行器回调配置、调用API服务等操作均通过该域名进行。

以上是关于XXL-JOB部署到k8s时遇到的问题的主要内容,如果未能解决你的问题,请参考以下文章

部署k8s遇到的问题

分布式任务调度平台XXL-JOB本地配置可能遇到的问题和解决方案

遇到的问题---airflow on k8s---运行时scheduler报错ImportError: libpq.so.5: cannot open shared object file: No s

遇到的问题---airflow on k8s---运行时scheduler报错ImportError: libpq.so.5: cannot open shared object file: No s

jenkins部署pm2遇到问题

6 个 K8s 日志系统建设中的典型问题,你遇到过几个?