Skip to content

Shell 作业

场景 有一段现成的运维/胶水脚本(备份、清理、调用外部接口、跑一段一次性检查),想让它按计划自动跑,又不想为此专门包一个 Spark/Jar 程序。

能干什么

你想做的事配置成 Shell 长这样(示意)
直接写一段内联脚本脚本来源选「内联编辑」,文本框里写 bash
复用已有的脚本文件脚本来源选「资源中心脚本」,运行时自动下载执行
脚本里要用 Python镜像默认自带 python3,不用额外安装

亮点

  • 脚本不在平台进程内跑——内容经 ConfigMap 挂载进一个一次性 k8s Job pod,以 bash /ds/script.sh 的方式执行;任意 shell 都是不可信代码,进程内直跑等同 RCE,这一步是明确的安全边界。
  • 跟批作业共用同一套隔离与生命周期——同样走每空间独立 namespace + ResourceQuota,restartPolicy=NeverbackoffLimit=0(失败不自动重跑,重试交给调度层控制),ttlSecondsAfterFinished=600 跑完自动回收 pod。
  • 脚本来源二选一,来源不同但执行方式一致——内联编辑直接把文本写入 ConfigMap;选资源中心脚本则运行时从对象存储下载后同样走 ConfigMap 挂载,pod 内不用 curl、不用配任何下载凭证。
  • 体积有上限——ConfigMap 存在 etcd 里,单对象约 1MB 上限,脚本超过 512KB 会在提交时直接拒绝,提示改用资源包 + Jar 作业承载大体量逻辑。
  • 镜像复用批作业镜像——默认跟 Spark 作业同一个镜像,自带 bashpython3,不用为了跑个脚本单独拉镜像。

完整操作示例:一次真实运行

新建「Shell」作业 shell_hello_demo,脚本来源用「内联编辑」:

bash
echo "=== Shell 作业演示 ==="
echo "运行时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "运行主机: $(hostname)"
echo "解释器: $(which bash) / $(which python3)"
echo "用 python3 算一下 1..100 的和(验证镜像自带 python3):"
python3 -c "print(sum(range(1, 101)))"

保存后点「运行一次」,日志里能直接看到平台侧的执行说明("脚本经 ConfigMap 挂载……用户代码在隔离 pod 内执行,不进平台进程")和脚本自身的输出,exit=0、计算结果 5050 正确:

Shell 作业运行成功,日志含平台侧执行说明与脚本输出

想跑 Python 脚本而不是 bash,看Python 作业;想跑一个自带 fat jar 的复杂程序,看Spark Jar 作业

看全部作业类型 →