Kubernetes Pod 对象中命令变量的使用

Usage of command variable in Kubernetes Pod object

我想了解 Pods 中命令的正确用法是什么。以我的 yaml 为例。这是一个有效的 YAML。我的疑惑是

1> 睡眠命令发出了 3600 秒,但是当我通过 'k get pods' 看到 pods 几个小时后,我的 pod busybox2 仍然是 运行。我目前的理解是,睡眠应该执行 3600 秒并且 pod 应该在此之后消失,因为没有进程 运行 我的 Pod(如 httpd、nginx 等)。不确定这是为什么

apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  namespace: default
spec:
  containers:
  - name: busy
    image: busybox
    command:
      - sleep
      - "3600" 

2> 在 k8s 文档上查看时,用法显示了一种不同的编写方式。我知道 cmd 和 args 是不同的东西..但是我不能简单地在所有场景中使用这两种方式吗?就像编写命令:["sleep", "3600"] 作为第一个示例,command: - printenv \ - HOSTNAME 作为编写第二个 yaml 命令部分的另一种方式。谁能详细说一下。

apiVersion: v1
kind: Pod
metadata:
  name: command-demo
  labels:
    purpose: demonstrate-command
spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure

关于你的第二点,如果你对DockerENTRYPOINTCMD不熟悉,我建议你阅读关于它们的documentation,因为它是直接相关的到 Kubernetes 的 commandargs.

事实上,它们是如此相关,以至于它们实际上是 same thing。这意味着 command 应该用于设置命令的“核心”,而 args,顾名思义,应该用于其参数。在您的情况下,它可能看起来像:

command: ["sleep"]
args: ["3600"]

现在说第一点,是因为Pod is not a Job, so it will continue to run unless there is a fatal error, the liveness probe失败或者你手动删除了

...but my pod busybox2 is still running after few hours...

这是因为 restartPolicy 的默认值为 Always。意味着一个小时后,您的 pod 实际上重新启动了。

apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  namespace: default
spec:
  restartPolicy: OnFailure  # <-- Add this line and it will enter "Completed" status.
  containers:
  - name: busy
    image: busybox
    command:
      - sleep
      - "10"  # <-- 10 seconds will do to see the effect.

请参阅 here 了解 K8s 如何处理入口点、命令、args 和 CMD。