kubernetes 一次性kubectl运行文件

epfja78i  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(127)

我想在Kubernetes集群中执行一次性,但使用本地文件系统中的文件。例如:

kubectl run mytmpjob --rm --restart='Never' \
  --command <some-command-which-acts-on-a-file-uploaded-from-local>

我喜欢kubectl run --rm给我的便利,因为这是一次性的。
在我看来,我需要kubectl cpkubectl run的组合,但我看不出如何?当文件在kubectl run命令之前不存在时,我如何将文件放入容器中?

bjg7j2ky

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中实现此模式的更简单/更智能的方法,请告诉我们。:-)

相关问题