如何在Argo Workflow中指定本地脚本作为执行源码?
方案1:用Kubernetes ConfigMap挂载本地源码
这是最直接的方式,无需外部存储,直接把本地脚本和依赖文件打包成ConfigMap,在Argo Workflow中挂载使用:
打包本地项目到ConfigMap
假设你的项目结构是:my-python-project/ ├── main.py ├── requirements.txt └── utils/ └── helper.py执行命令把整个项目目录(或指定文件)打包成ConfigMap:
kubectl create configmap python-project --from-file=./my-python-project/这样会把目录里所有文件都加入ConfigMap,包括依赖的
utils子目录。在Argo Workflow中挂载并执行
编写Workflow YAML,将ConfigMap挂载到Pod的指定路径,然后安装依赖并执行脚本:apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: python-script- spec: entrypoint: run-python templates: - name: run-python container: image: python:3.10-slim command: [bash] args: - -c - | pip install --no-cache-dir -r /app/requirements.txt python /app/main.py volumeMounts: - name: script-volume mountPath: /app volumes: - name: script-volume configMap: name: python-project当你修改本地代码后,只需更新ConfigMap即可:
kubectl create configmap python-project --from-file=./my-python-project/ -o yaml --dry-run=client | kubectl replace -f -
方案2:用Argo Artifact直接上传本地文件(无需预存到S3)
如果不想维护ConfigMap,可以用Argo的Artifact功能,在提交Workflow时直接上传本地文件到Argo的Artifact仓库(比如MinIO),无需手动同步:
确保Argo已配置Artifact仓库(比如MinIO)
如果还没配置,可以快速部署一个本地MinIO实例作为Argo的artifact存储。编写支持Artifact的Workflow模板
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: python-artifact- spec: entrypoint: run-python templates: - name: run-python inputs: artifacts: - name: project-files path: /app container: image: python:3.10-slim command: [bash] args: - -c - | pip install --no-cache-dir -r /app/requirements.txt python /app/main.py提交Workflow时上传本地文件
执行命令提交Workflow并指定本地项目目录作为artifact:argo submit workflow.yaml --artifact project-files=./my-python-project/这样Argo会自动把本地目录上传到Artifact仓库,然后在Pod中挂载到
/app路径执行。修改代码后,重新提交即可自动同步最新版本。
方案3:用本地目录直接挂载(仅适用于单节点集群测试)
如果你的Argo运行在单节点Kubernetes集群(比如minikube),可以直接把本地目录挂载到Pod中,无需任何中间存储:
apiVersion: argoproj.io/v1alpha1 kind: Workflow metadata: generateName: python-local- spec: entrypoint: run-python templates: - name: run-python container: image: python:3.10-slim command: [bash] args: - -c - | pip install --no-cache-dir -r /app/requirements.txt python /app/main.py volumeMounts: - name: local-volume mountPath: /app volumes: - name: local-volume hostPath: path: /path/to/your/local/my-python-project type: Directory
注意:这个方案仅适合测试,多节点集群下无法保证Pod调度到挂载目录的节点,不建议生产环境使用。
内容的提问来源于stack exchange,提问作者A. Maman

