我想在Kubernetes集群中执行一次性,但使用本地文件系统中的文件。例如:
kubectl run mytmpjob --rm --restart='Never' \
--command <some-command-which-acts-on-a-file-uploaded-from-local>
我喜欢kubectl run --rm
给我的便利,因为这是一次性的。
在我看来,我需要kubectl cp
和kubectl run
的组合,但我看不出如何?当文件在kubectl run
命令之前不存在时,我如何将文件放入容器中?
1条答案
按热度按时间bjg7j2ky1#
下面是我为 * one-time-execution-with-local-file * 模式提出的建议:
1.为Pod生成一个随机的唯一名称。
1.用step1中的name启动一个pod(使用
kubectl run
),但让它保持不做任何事情,但要确保它可以立即中断。这例如使用Bash命令(诸如trap : TERM INT; sleep infinity & wait
(YMMV,例如,Alpine Linux不支持此语法)。当然,您使用的映像还必须包含实际执行真实的执行所需的工具/二进制文件(步骤5)。1.等待pod存在(不幸的是,kubectl不能直接这样做),然后等待它成为
Ready
(后者可以使用kubectl wait
完成)。1.将文件复制到pod中。这是使用
kubectl cp
完成的。1.在pod中执行您实际想要执行的内容。这是使用
kubectl exec
命令完成的。1.把吊舱拿开。这是使用
kubectl delete pod
和您唯一的pod名称完成的。这种方法是有效的,您可以用您最喜欢的脚本语言实现它(并将其泛化),以便在CI/CD管道中使用。为了不留下任何东西,你需要确保如果第2步成功执行,那么无论第3-5步是否有错误,第6步 * 必须 * 执行(在某些语言中称为“finalizers“模式)。
上面的代码可以看作是
kubectl run
的增强版本,这意味着执行是同步进行的:它等待容器中的命令的执行。如果您知道在Kubernetes中实现此模式的更简单/更智能的方法,请告诉我们。:-)