使用阿里云ACS部署XXL-JOB指南(实战三)

📝 前言

在之前几期,我们分别介绍了关于 XXL-JOB 的以下内容:

这期我们再来介绍一下如何在生产环境阿里云ACS(Kubernetes)中部署XXL-JOB并将我们的执行器任务也部署上去,篇幅有点长不想拆分了,感兴趣的还请耐心看完~

🧭 背景介绍

XXL-JOB 是一款开源的轻量级分布式任务调度平台,支持多语言执行器、任务失败重试、任务日志可视化等功能。对于需要统一定时任务管理,或微服务架构中调度拆分的场景,非常适合。

阿里云容器服务 Serverless Kubernetes(ACS)是无需管理服务器资源包括集群控制面的全托管 K8s 平台,非常适合部署轻量服务与事件驱动任务。

📋 前提条件

开始部署前,请确保你已完成以下准备:

  • 已开通阿里云 Serverless 容器服务 ACS
  • 已创建 ACS 集群,并开启 公网 API 访问
  • 已准备好 MySQL 数据库(RDS 或 ACS 内自行部署)
  • 已配置 kubectl 并能访问该集群
  • 拥有一个可使用的 域名

🚀 部署步骤

1️⃣ 初始化 MySQL 数据库

XXL-JOB Admin 需要持久化任务元数据到数据库中。

使用阿里云 RDS(推荐)

快速创建数据库

1
2
3
4
5
# 下载SQL初始化脚本
wget https://raw.githubusercontent.com/xuxueli/xxl-job/3.1.1/doc/db/tables_xxl_job.sql

# 导入脚本
mysql -h <RDS地址> -u <数据库用户名> -p < tables_xxl_job.sql

PS:另外也可以直接在ACS集群中部署MySQL,但不建议这么做,生产环境数据库尽量使用云服务或虚拟机/物理机部署。

2️⃣ 创建 XXL-JOB Admin 部署文件

如果想要将 xxl-job 部署到ACS集群,我们还需要创建一个k8s的manifest yaml部署文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# xxl-job.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
name: xxl-job-admin
labels:
app: xxl-job-admin
spec:
replicas: 1
selector:
matchLabels:
app: xxl-job-admin
template:
metadata:
labels:
app: xxl-job-admin
spec:
containers:
- name: xxl-job-admin
image: xuxueli/xxl-job-admin:3.1.1
ports:
- containerPort: 8080
env:
- name: PARAMS
value: "--xxl.job.accessToken=default_token"
- name: SPRING_DATASOURCE_URL
value: "jdbc:mysql://<数据库连接地址>:3306/xxl_job?allowPublicKeyRetrieval=true&useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai"
- name: SPRING_DATASOURCE_USERNAME
value: "<数据库用户名>"
- name: SPRING_DATASOURCE_PASSWORD
value: "<数据库密码>"

---
apiVersion: v1
kind: Service
metadata:
name: xxl-job-admin
spec:
type: ClusterIP
selector:
app: xxl-job-admin
ports:
- port: 8080
targetPort: 8080

执行部署:

1
2
3
kubectl apply -f xxl-job.yaml
# 查看部署进度
kubectl get pods

PS:这里需要提前配置好 kubectl 的 kubeconfig,确保能正常使用 kubectl 访问集群。

配置教程参看官方文档:《获取集群kubeconfig并通过kubectl工具连接集群》

3️⃣ 部署执行器和任务程序

修改配置文件,这里以上一期的Python Demo为例,由于生产环境与本地环境不一样,我们需要修改ExecutorConfig的连接配置,改为以下内容:

1
2
3
4
5
6
7
# 如果xxl-admin可以直连executor的ip,可以不填写executor_listen_host
# xxl_admin_baseurl 我们可以改为连接xxl-job-admin的服务名称地址
config = ExecutorConfig(
xxl_admin_baseurl="http://xxl-job-admin:8080/xxl-job-admin/api/",
executor_app_name="python-send-notify-executor",
access_token="default_token",
)

创建 Dockerfile 文件,并构建为镜像。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM registry.cn-heyuan.aliyuncs.com/lusyoe/python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

RUN sed -i 's|http://security.debian.org/debian-security|http://mirrors.aliyun.com/debian-security|g' /etc/apt/sources.list.d/debian.sources && \
sed -i 's|http://deb.debian.org/debian|http://mirrors.aliyun.com/debian|g' /etc/apt/sources.list.d/debian.sources

# 复制后端代码
COPY main.py /app/main.py

# 运行执行器
CMD ["python", "main.py"]

PS:如何构建和上传镜像,限于篇幅这里就不过多介绍了。

还有记得在XXL-JOB控制台创建执行器和任务,可参看上一期文章。

创建部署文件 xxl-job-python-demo.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
apiVersion: apps/v1
kind: Deployment
metadata:
name: xxl-job-python-demo
labels:
app: xxl-job-python-demo
spec:
replicas: 1
selector:
matchLabels:
app: xxl-job-python-demo
template:
metadata:
labels:
app: xxl-job-python-demo
spec:
containers:
- name: xxl-job-python-demo
image: registry-vpc.cn-heyuan.aliyuncs.com/lusyoe/xxl-job-demo:latest
ports:
- containerPort: 9999

---
apiVersion: v1
kind: Service
metadata:
name: xxl-job-python-demo
spec:
type: ClusterIP
selector:
app: xxl-job-python-demo
ports:
- port: 9999
targetPort: 9999

执行部署:

1
2
3
kubectl apply -f xxl-job-python-demo.yaml
# 查看部署进度
kubectl get pods

4️⃣ 创建 ALB 负载均衡(首次)

首次创建 ACS 集群时,如果我们需要将自己的服务暴露在公网,可以借助 ALB 负载均衡器,这里官方要求实例至少是**标准版**。

可自行到控制台应用型负载均衡 ALB 完成创建,实例网络类型选择**公网,另外不要勾选加入共享带宽**。

PS:也可以通过ALB Controller自动创建。

5️⃣ 配置集群 ALB Controller(首次)

我们需要将ALB Controller关联ALB负载均衡器,然后通过ingress对公网暴露服务。

在创建集群时,勾选上安装 ALB Ingress:

待集群部署完成后,我们再来配置 ALB Controller,创建以下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# reuse-alb.yaml

apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: <ALB-实例ID>
forceOverride: false
listenerForceOverride: false
listeners:
- port: 80
protocol: HTTP

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: alb
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: ingress.k8s.alibabacloud/alb
parameters:
apiGroup: alibabacloud.com
kind: AlbConfig
name: reuse-alb

这里我们没有开启监听443,是因为开启后 ALB Controller 会完全接管ALB负载的监听,很难做到将流量再转发到集群外部,比如我自己的ECS。

执行部署:

1
kubectl apply -f reuse-alb.yaml

6️⃣ 创建 ALB Ingress 访问配置(可选)

如果想要将 XXL-JOB 对公网暴露,我们在配置完 ALB Controller 之后还需要再创建一个Ingress资源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# xxl-job-ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: xxl-job-admin
spec:
rules:
- host: xxljob.<你的域名>
http:
paths:
- path: /xxl-job-admin
pathType: Prefix
backend:
service:
name: xxl-job-admin
port:
number: 8080

执行部署:

1
kubectl apply -f xxl-job-ingress.yaml

7️⃣ 配置 ALB 监听和域名解析(可选)

在创建完 Ingress 之后,我们回到ALB负载均衡,可以看到已经自动创建出了一个80的监听,如下:

由于之前只监听了80,这里也是自动创建了80监听配置并通过80端口访问,如果需要443,我们需要将其手动配置到 https 的监听。

进入ALB实例 → 监听,若没有找到443,可自己创建并配置证书。

再点击转发规则 → 插入新的规则 → 转发条件:域名 → 转发动作:转发至 → 服务器类型 → 选择自动创建出来的服务。

最后到域名解析中配置该域名的解析地址为ALB 实例的**DNS名称**即可。

✅ 总结

通过本指南,你已经完成在阿里云 Serverless 容器服务(ACS)上部署 XXL-JOB 的全过程。相比传统 VM 或 ACK 集群,ACS 无需运维节点,资源按量计费,更适合任务调度场景。

最后由于我们的产品 nCalendar 需要动态创建 XXL-JOB 任务,不可能每次都到控制台来创建,在下一期我们再分享一个动态创建任务的案例~