如何在Kubernetes上运行容器?

spr*_*ell 94 containers docker kubernetes google-kubernetes-engine

我现在正在尝试在Kubernetes集群上运行一个带shell(/ bin/bash)的简单容器.

我认为有一种方法可以通过使用pseudo-tty和分离选项(命令-td选项docker run)来保持容器在Docker容器上运行.

例如,

$ sudo docker run -td ubuntu:latest
Run Code Online (Sandbox Code Playgroud)

在Kubernetes有这样的选择吗?

我尝试使用如下kubectl run-container命令运行容器:

kubectl run-container test_container ubuntu:latest --replicas=1
Run Code Online (Sandbox Code Playgroud)

但容器会退出几秒钟(就像使用docker run上面提到的没有选项的命令启动一样).并且ReplicationController重复再次启动它.

有没有办法让Kubernetes上的容器像命令中的-td选项一样运行docker run

Joe*_*l B 94

容器意味着完成.您需要为容器提供永不完成的任务.这样的事情应该有效:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just spin & wait forever
    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
Run Code Online (Sandbox Code Playgroud)

  • @aneeshjoshi 我不会说这是_最佳实践_。这只是提供一个无需立即退出即可运行的 pod 的示例。最佳实践是创建您的容器来完成它们设计的工作(运行完成的工作,永久运行的网络服务器等)。我将此作为示例发布,因为当您继续创建 pod 时,Kubernetes 最初可能会感到沮丧,但由于默认命令立即退出而导致 pod 消失。 (6认同)
  • 但这是最佳实践吗? (4认同)
  • 谢谢你,因为我需要一个可以存活一段时间的容器,让我可以进入它。我试图用比“ubuntu”更轻的图像做同样的事情,并尝试了“bash”图像,但无法让它工作。知道如何对“bash”图像执行相同的操作吗? (2认同)
  • 我知道这是一个老问题;然而,Kubernetes 开始支持临时容器。链接:https://kubernetes.io/docs/concepts/workloads/pods/ephemeral-containers/。这些容器有一些限制,例如资源限制,但它们是为调试目的而设计的。 (2认同)
  • @cryanbhu 对于更轻的图像,您可以使用 alpine,容器规范可以如下所示: `{"name": "util", "image": "alpine", "command": [ "/bin/sh", " -c", "--" ], "args": [ "while true; do sleep 30; done;" ]}` (只有 json,因为 yaml 不会在此处的注释中格式化。)重要的是 `/bin/sh` 而不是 `/bin/bash`。 (2认同)

its*_*ire 84

您可以在以下位置使用此CMD Dockerfile:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
Run Code Online (Sandbox Code Playgroud)

这将使您的容器保持活着,直到它被告知停止.使用陷阱和等待将使您的容器立即对停止请求做出反应.没有陷阱/等待停止将需要几秒钟.

对于基于busybox的图像(用于基于高山的图像),睡眠不知道无穷大论点.此解决方法在上面的示例中为您提供了相同的即时响应docker stop:

CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Run Code Online (Sandbox Code Playgroud)

  • 如果有人有适用于 Kubernetes YAML 的“args”版本,那就太好了。更新:使用这个:`command: ["/bin/bash"]` 和 `args: ["-c", "trap : TERM INT; sleep infinity & wait"]` (6认同)
  • 我在 kubernetes 部署 yaml 上使用相同的用于调试目的 (2认同)
  • 通常首选对 CMD 使用 ["json array"] 语法。如果这就是你需要的,你可以这样写:`CMD ["/bin/bash", "-c", "exec /bin/bash -c 'trap : TERM INT; sleep 9999999999d & wait'"]` (2认同)

Adr*_*uat 39

当主进程退出时,容器退出.做类似的事情:

docker run -itd debian
Run Code Online (Sandbox Code Playgroud)

坦率地说,容器打开是一个只能用于快速测试和示例的黑客攻击.如果你只想要一个容器进行几分钟的测试,我会这样做:

docker run -d debian sleep 300
Run Code Online (Sandbox Code Playgroud)

其优点是,如果您忘记了容器,容器将自动退出.或者,你可以把这样的东西放在一个while循环中,以使它永远运行,或者只是运行一个应用程序,如top.所有这些在Kubernetes中应该很容易做到.

真正的问题是你为什么要这样做?您的容器应该提供服务,其过程将使容器在后台运行.

  • `sleep infinity`适用于很多情况(不是busybox) (18认同)
  • @КонстантинВан 嘿,年轻的我!你想制作一个_Pod_!您不会将所有内容都放入一个“_容器_”中。 (3认同)
  • _“真正的问题是你为什么要这样做?”_ - 调试。也许您的服务不会立即崩溃,因此您需要在内部检查所有内容时保持容器处于活动状态(例如,通过交互执行 shell)。 (3认同)

Rad*_*iel 16

  1. 在Dockerfile中使用此命令:

    CMD ["sh", "-c", "tail -f /dev/null"]

  2. 构建您的docker镜像.

  3. 将其推送到您的群集或类似设备,只是为了确保它可用的图像.
  4. kubectl run debug-container -it --image=<your-image>


Arb*_*aaz 10

为了使POD保持运行,POD应该执行某些任务,否则Kubernetes会发现它是不必要的,因此退出。有许多方法可以使POD保持运行。

当我需要一个POD来连续运行而不做任何事情时,我也遇到了类似的问题。以下是为我工作的两种方式:

  1. 运行容器时发出睡眠命令。
  2. 在容器内运行无限循环。

尽管第一种选择比第二种选择更容易并且可以满足要求,但它不是最佳选择。另外,在睡眠命令中要分配的秒数有一个限制。但是,在其中运行无限循环的容器永远不会退出。

但是,我将描述两种方式(考虑您正在运行busybox容器):

1.睡眠命令

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "sleep 1000"]
  nodeSelector:
    beta.kubernetes.io/os: linux
Run Code Online (Sandbox Code Playgroud)

2.无限循环

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  labels:
    app: busybox
spec:
  containers:
  - name: busybox
    image: busybox
    ports:
    - containerPort: 80
    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 5 ; done"]
  nodeSelector:
    beta.kubernetes.io/os: linux
Run Code Online (Sandbox Code Playgroud)

运行以下命令以运行Pod:

kubectl apply -f <pod-yaml-file-name>.yaml
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!


小智 9

添加以下内容:在模板中 -> 在规范中 -> 在容器中 -> 在端口中 & 在容器端口行之后

    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]
Run Code Online (Sandbox Code Playgroud)


rwi*_*n04 7

我能够sleep infinity在Kubernetes中使用该命令,这将使容器保持打开状态.如果不起作用,请参阅此答案以了解替代方案.


小智 6

最简单的命令,因为它可以使k8s pod清单永久运行容器:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]
Run Code Online (Sandbox Code Playgroud)

  • 最优雅和简约的解决方案。 (6认同)

Oma*_*led 6

在 Dockerfile 中使用此命令来保持容器在 K8s 集群中运行:

  • CMD tail -f /dev/null


Luk*_*ski 5

我在这个问题上的几分钱。假设它kubectl正在工作,那么与您在问题中提到的 docker 命令最接近的命令将是这样的。

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity
Run Code Online (Sandbox Code Playgroud)

上面的命令将Poddefault命名空间中创建一个,并且它将执行sleepinfinity参数的命令- 这样你将有一个在前台运行的进程保持容器处于活动状态。

之后,您可以Pod通过运行kubectl exec命令进行交互。

$ kubectl exec ubuntu -it -- bash
Run Code Online (Sandbox Code Playgroud)

这种技术对于创建 Pod 资源和临时调试非常有用。

  • 效果很好。不需要`--restart=Never`,只需调用`kubectl run ubuntu --image=ubuntu -- sleep infinity` (2认同)