k8s部署xxl-job分布式任务调度服务

一、背景

  • 什么时候需要把xxl-job部署到k8s里
    当你的java服务部署到K8S后,因为xxl-job的任务调度器需要对注册上来的执行器进行健康检测,而java服务作为执行器,注册地址是pod的Ip地址;所以,调度器想要访问执行器的网路是不通的。
    换句话说,xxl-job的任务调度器和执行器必须在同一个网络下,互相之间能够相通的。

》也就不能把执行器部署在k8s里,而把任务调度器部署在k8s外部。

本文主要详细讲解其部署过程,分为以下主要步骤:

  • 基于xxl-job的源码,制作你自己的docker镜像,并推送到私有仓库
  • 使用argocd部署,采用Helm的方式

详细的部署可以参考之前的devops系列文章,这里不会像之前那样赘述。

二、目标

  • 1、xxl-job可以部署多个Pod节点,也就是支持集群模式,对外提供的是service地址,可以是NodePort或者LB。
  • 2、替代官方推荐的集群模式,不再需要Nginx等组件代理多个xxl-job任务调度器。
  • 3、k8s内部的java服务使用同网络下的xxl-job,能够正常地执行任务调度。

三、准备工作

  • 1、拉取github源码,修改必要的文案和图标等
  • 2、编写Dockerfile
  • 3、在jenkins创建job
  • 4、编写argocd-helm-yaml
  • 5、在argocd创建Application
  • 6、创建xxl-job数据库,执行脚本语句

1、拉取xxl-job源码

修改xxl-job-admin模块下的pom.xml,增加maven插件:
为的是读取程序的版本号,在下文制作docker镜像的时候用上。

<plugin>
				<groupId>pl.project13.maven</groupId>
				<artifactId>git-commit-id-plugin</artifactId>
				<version>4.0.0</version>
				<executions>
					<execution>
						<goals>
							<goal>revision</goal>
						</goals>
					</execution>
				</executions>
				<configuration>
					<verbose>true</verbose>
					<dateFormat>yyyy-MM-dd'T'HH:mm:ssZ</dateFormat>
					<generateGitPropertiesFile>true</generateGitPropertiesFile>
					<generateGitPropertiesFilename>${project.build.outputDirectory}/git.properties</generateGitPropertiesFilename>
					<includeOnlyProperties>
						<includeOnlyProperty>^git.build.(time|version)$</includeOnlyProperty>
						<includeOnlyProperty>^git.commit.id.(abbrev|full)$</includeOnlyProperty>
					</includeOnlyProperties>
					<commitIdGenerationMode>full</commitIdGenerationMode>
					<failOnNoGitDirectory>false</failOnNoGitDirectory>
				</configuration>
			</plugin>

修改文案及图标,在xxl-job-admin/resources/templates目录下的.ftl文件。

其他的更多二次开发,有空我们在另外的文章单独讨论。

  • 支持Ldap统一身份登录
  • 注册到consul/nacos等服务注册中心
  • 本地配置调整为分布式配置,如nacos/consul等
  • 接入sentry报警
  • 接入micrometer,暴露prometheus能够采集的指标接口
  • 丰富其原本的告警机制,支持钉钉、企业微信、短信等方式
  • 任务执行的时候,采用okhttp等http框架替代现今方式
  • 日志治理

2、编写Dockerfile

我们是在Jenkins里的构建docker镜像里使用到它,所以会放这个文件在jenkins机器上。好处是不用每个要部署到K8S里的服务都关心这个问题。

由于前文,我们已有详细介绍,这里就一笔带过了。

3、在jenkins创建Job

k8s部署xxl-job分布式任务调度服务_第1张图片

k8s部署xxl-job分布式任务调度服务_第2张图片
k8s部署xxl-job分布式任务调度服务_第3张图片

4、编写argocd-helm-yaml

k8s部署xxl-job分布式任务调度服务_第4张图片

  • 从之前的devops-service目录复制一份到xx-job
  • 修改values.yaml
appName: xx-job

# endpoint
service:
  type: NodePort
  port: 8090

说白了,xx-job也是一个java应用,和devops-service最大不同,就是服务名称和端口。

5、在argocd创建Application

k8s部署xxl-job分布式任务调度服务_第5张图片

6、创建xxl-job数据库,执行脚本语句

官方的doc目录下有.sql文件,需要注意的时候及时删除log表的数据,防止过大。

四、验证

  • 查看xxl-job对外提供的端口
    k8s部署xxl-job分布式任务调度服务_第6张图片

  • 查看xxl-job的pod是否启动成功
    k8s部署xxl-job分布式任务调度服务_第7张图片

  • 访问xxl-job的健康检测接口,返回{“status”:“UP”}

  • 进入xxl-job-admin控制台,可以看到devops-service,作为执行器已自动注册到调度中心了。devops-service服务的pod地址是10.45.0.6。
    k8s部署xxl-job分布式任务调度服务_第8张图片

  • 创建xxl-job的任务
    k8s部署xxl-job分布式任务调度服务_第9张图片

  • 查看任务的调度日志
    k8s部署xxl-job分布式任务调度服务_第10张图片
    至此,本文对于K8S部署xxl-job就已结束。

你可能感兴趣的:(kubernetes,分布式,容器)