kubernetes - 命令传递给Kubernetes Job and Pod

标签 kubernetes k8s-cronjobber

我有一个perl命令,需要将其传递给kubernetes作业。命令计算pi的值并将其打印到2000个位置。

perl -Mbignum = bpi -wle'print bpi(2000)'

我已将命令传递到作业yaml文件,如下所示。通过kubectl,yaml文件成功创建作业并打印pi的值。

apiVersion: batch/v1
kind: Job
metadata:
   name: pi-job
spec:
   template:
     spec:
        containers:
          - name: pi
            image: perl
            command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
        restartPolicy: Never

当我尝试使用以下命令语法时,它给了我错误。您能否告诉我以下命令synax不正确的原因?
command: ["perl",  "-Mbignum=bpi", "-wle", "'print bpi(2000)'"]     # placed inside single quote
command: ["perl",  "-Mbignum=bpi", "-wle", "print", " bpi(2000)"]   # print splitted in two quotes.
command: ["perl",  "-Mbignum=bpi", "-wle", "print", "bpi(2000)"]    # print splitted in two quotes.

同样,当我在单引号中传递完整命令时,也会给我错误。
command: ["perl -Mbignum=bpi -wle print bpi(2000)"]       # complete command in single quotes.

最佳答案

command:键要求您将数组作为参数传递给(与this示例进行比较)。您可以用两种等效形式指定一个数组:

在单行中,使用方括号[]:

---
items: [ 1, 2, 3, 4, 5 ]
names: [ "one", "two", "three", "four" ]


并以多行方式:

---
items:
  - 1 
  - 2 
  - 3
  - 4 
  - 5 
names:
  - "one"
  - "two"
  - "three"
  - "four"


您可以同时使用双引号(双引号)和单引号(引号)引号,因此下面的示例也是正确的,并且可以使用:
command: ['perl',  '-Mbignum=bpi', '-wle', 'print bpi(2000)']

但是,您不能同时使用两者。我不知道将"放在那里会达到什么目的,但是这种语法没有任何意义,并且完全不正确。

您还可能会问为什么在'成功运行的同时不能在"'print bpi(2000)'"中运行'echo bla',却给您想要的结果。

请注意,当以这种方式在 kubernetes 中提供bash时,只有数组的第一个元素是实际的echo bla(在command中搜索的可执行文件),其他随后的元素是其参数。请记住,您的下两个示例也没有任何意义,因为分别提供的“print”和“bpi(2000)”都不是有效的参数:

command: ["perl",  "-Mbignum=bpi", "-wle", "print", " bpi(2000)"]   # print splitted in two quotes.
command: ["perl",  "-Mbignum=bpi", "-wle", "print", "bpi(2000)"]    # print splitted in two quotes.


为了完全理解此命令的作用,我们需要深入研究基本的command文档。我只保留了示例中使用的与之相关的那些选项:
$ perl --help

Usage: perl [switches] [--] [programfile] [arguments]
  -e program        one line of program (several -e's allowed, omit programfile)
  -l[octal]         enable line ending processing, specifies line terminator
  -[mM][-]module    execute "use/no module..." before executing program
  -w                enable many useful warnings

Run 'perldoc perl' for more help with Perl.

现在,让我们逐步分析命令:
["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]

跟随主命令$PATH的数组的每个元素都是一个单独的实体,作为主命令的自变量,其标志或最近提供的标志的自变量传递,根据文档要求,应将其提供给非常具体的形式。

在我们的perl标志集中,"perl"选项至关重要,因为它必须后面跟随特定的参数:
 -e program        one line of program (several -e's allowed, omit programfile)

在我们的示例中是:
print bpi(2000)

我想再次强调。数组的每个元素都被视为一个单独的实体。通过将其分为两个单独的元素(例如-wlee),您仅使用"print", " bpi(2000)"参数提供"print", "bpi(2000)",这没有任何意义,因为它需要非常具体的命令告诉它应该打印什么。就像您在bash shell中运行一样:
perl -Mbignum=bpi -wle 'print' 'bpi(2000)'

这将导致来自perl解释器的以下错误:
Use of uninitialized value $_ in print at -e line 1.

最后,当您运行最后一个示例时:

command: ["perl -Mbignum=bpi -wle print bpi(2000)"] # complete command in single quotes.



您将获得非常详细的消息,说明为什么它在perl -e事件(print)中不起作用:
Error: failed to start container "pi": Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"perl -Mbignum=bpi -wle print bpi(2000)\": executable file not found in $PATH": unknown

它基本上试图在$ PATH中找到一个名为Pod的可执行文件,这当然是做不到的。

如果您想熟悉在 kubernetes 中为kubectl describe pod pi定义"perl -Mbignum=bpi -wle print bpi(2000)"及其command的不同方法,建议您阅读kubernetes官方文档中的this部分。

关于kubernetes - 命令传递给Kubernetes Job and Pod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60061241/

相关文章:

kubernetes - 如何在 kubernetes 中每 10 秒运行一次 cronjob?

Kubernetes Cronjob : Reset missed start times after cluster recovery

kubernetes - pod 具有未绑定(bind)的 PersistentVolumeClaims

kubernetes - Amazon EKS Fargate中的 pod 不足

nginx - 在 GKE 专用集群上创建入口资源时超时

kubernetes - Kubernetes pods 处于等待状态

kubernetes - 访问kubernetes UI界面时找不到services “kubernetes-dashboard”

kubernetes - 没有类型 "TZCronJob"为版本 "cronjobber.hidde.co/v1alpha1"注册