主题
Shell 作业
场景 有一段现成的运维/胶水脚本(备份、清理、调用外部接口、跑一段一次性检查),想让它按计划自动跑,又不想为此专门包一个 Spark/Jar 程序。
能干什么
| 你想做的事 | 配置成 Shell 长这样(示意) |
|---|---|
| 直接写一段内联脚本 | 脚本来源选「内联编辑」,文本框里写 bash |
| 复用已有的脚本文件 | 脚本来源选「资源中心脚本」,运行时自动下载执行 |
| 脚本里要用 Python | 镜像默认自带 python3,不用额外安装 |
亮点
- 脚本不在平台进程内跑——内容经 ConfigMap 挂载进一个一次性 k8s Job pod,以
bash /ds/script.sh的方式执行;任意 shell 都是不可信代码,进程内直跑等同 RCE,这一步是明确的安全边界。 - 跟批作业共用同一套隔离与生命周期——同样走每空间独立 namespace + ResourceQuota,
restartPolicy=Never、backoffLimit=0(失败不自动重跑,重试交给调度层控制),ttlSecondsAfterFinished=600跑完自动回收 pod。 - 脚本来源二选一,来源不同但执行方式一致——内联编辑直接把文本写入 ConfigMap;选资源中心脚本则运行时从对象存储下载后同样走 ConfigMap 挂载,pod 内不用 curl、不用配任何下载凭证。
- 体积有上限——ConfigMap 存在 etcd 里,单对象约 1MB 上限,脚本超过 512KB 会在提交时直接拒绝,提示改用资源包 + Jar 作业承载大体量逻辑。
- 镜像复用批作业镜像——默认跟 Spark 作业同一个镜像,自带
bash和python3,不用为了跑个脚本单独拉镜像。
完整操作示例:一次真实运行
新建「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 正确:

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