能否在Docker Swarm或K8s上实现rclone批量复制自动化调度?
实现Docker Swarm/Kubernetes上的循环rclone任务调度
完全可以实现这个自动化流程,以下是针对Docker Swarm和Kubernetes的具体方案:
Docker Swarm 方案
核心思路是通过共享存储维护任务队列,部署10个副本的服务,每个容器从队列中取未执行的任务,完成后标记任务为已完成,直到所有任务执行完毕。
步骤1:准备任务列表和执行脚本
- 创建
tasks.txt文件,每行一组源和目标:SOURCE01: DST01: SOURCE02: DST02: ... SOURCE100: DST100: - 创建入口脚本
entrypoint.sh,负责任务队列的读取、执行和标记:#!/bin/sh # 共享存储路径,所有容器共享任务状态 SHARED_DIR="/shared" TASKS_FILE="$SHARED_DIR/tasks.txt" COMPLETED_FILE="$SHARED_DIR/completed.txt" LOCK_FILE="$SHARED_DIR/tasks.lock" # 初始化文件 touch $COMPLETED_FILE while true; do # 加锁读取未完成的第一个任务 flock -x $LOCK_FILE sh -c 'grep -vxFf "$COMPLETED_FILE" "$TASKS_FILE" | head -n1' > /tmp/current_task CURRENT_TASK=$(cat /tmp/current_task) # 无任务则退出 if [ -z "$CURRENT_TASK" ]; then echo "所有任务已完成,退出容器" exit 0 fi # 拆分源和目标并执行rclone命令 SOURCE=$(echo $CURRENT_TASK | awk '{print $1}') DST=$(echo $CURRENT_TASK | awk '{print $2}') echo "开始执行任务:rclone copy $SOURCE $DST" rclone copy $SOURCE $DST # 标记任务完成 flock -x $LOCK_FILE echo "$CURRENT_TASK" >> $COMPLETED_FILE done
步骤2:部署Swarm资源
- 创建共享存储卷(用于同步任务状态):
docker volume create rclone-shared - 创建Config存储任务列表和脚本:
docker config create rclone-tasks tasks.txt docker config create rclone-entrypoint entrypoint.sh - 部署10副本的服务:
注意:替换docker service create \ --name rclone-batch \ --replicas 10 \ --config source=rclone-tasks,target=/shared/tasks.txt \ --config source=rclone-entrypoint,target=/entrypoint.sh,mode=0755 \ --mount source=rclone-shared,destination=/shared \ --mount type=bind,source=/path/to/your/rclone/config,target=/root/.config/rclone \ bitnami/rclone \ /entrypoint.sh/path/to/your/rclone/config为本地rclone配置文件的路径,用于容器认证源和目标存储。
Kubernetes 方案
推荐使用Indexed Job(K8s 1.21+支持),利用K8s原生的任务并行调度能力,自动维持10个并行任务,直到100组任务全部完成。
步骤1:准备任务列表ConfigMap
创建rclone-tasks.yaml,存储所有100组任务:
apiVersion: v1 kind: ConfigMap metadata: name: rclone-task-list data: task-01: "SOURCE01: DST01:" task-02: "SOURCE02: DST02:" # ... 依次添加到task-100 task-100: "SOURCE100: DST100:"
执行部署:
kubectl apply -f rclone-tasks.yaml
步骤2:创建rclone配置Secret
将你的rclone配置文件(rclone.conf)转为Secret,用于容器认证:
kubectl create secret generic rclone-config --from-file=./rclone.conf
步骤3:部署Indexed Job
创建rclone-batch-job.yaml:
apiVersion: batch/v1 kind: Job metadata: name: rclone-batch-job spec: completions: 100 # 总任务数 parallelism: 10 # 同时运行的Pod数 completionMode: Indexed # 启用索引模式 template: spec: restartPolicy: OnFailure # 任务失败时自动重启 containers: - name: rclone image: bitnami/rclone command: ["sh", "-c"] args: - | # 根据Job索引获取对应任务 TASK_INDEX=$(printf "%02d" $JOB_COMPLETION_INDEX) TASK=$(cat /config/task-$TASK_INDEX) # 执行rclone命令 rclone copy $(echo $TASK | awk '{print $1}') $(echo $TASK | awk '{print $2}') volumeMounts: - name: task-config mountPath: /config - name: rclone-secret mountPath: /root/.config/rclone readOnly: true volumes: - name: task-config configMap: name: rclone-task-list - name: rclone-secret secret: secretName: rclone-config items: - key: rclone.conf path: rclone.conf
执行部署:
kubectl apply -f rclone-batch-job.yaml
关键注意事项
- 认证配置:无论Swarm还是K8s,都需要将rclone的认证配置挂载到容器中,确保能访问源和目标存储。
- 错误处理:Swarm脚本可添加重试逻辑;K8s Job通过
restartPolicy: OnFailure自动重试失败任务。 - 资源限制:可根据需要为容器添加CPU/内存资源限制,避免集群资源耗尽。
内容的提问来源于stack exchange,提问作者Jodie Kurnia
相关产品推荐
相关产品推荐

