📝 前言 在之前几期,我们分别介绍了关于 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 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 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 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 -slimWORKDIR /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 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 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 任务,不可能每次都到控制台来创建,在下一期我们再分享一个动态创建任务的案例~