繁体   English   中英

如何让容器在 Kubernetes 上运行?

[英]How can I keep a container running on Kubernetes?

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

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

例如,

$ sudo docker run -td ubuntu:latest

Kubernetes中是否有这样的选项?

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

kubectl run-container test_container ubuntu:latest --replicas=1

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

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

容器旨在运行完成。 你需要为你的容器提供一个永远不会完成的任务。 这样的事情应该工作:

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;" ]

您可以在Dockerfile使用此 CMD:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

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

对于基于 busybox 的图像(用于基于 alpine 的图像) sleep 不知道无穷大参数。 此解决方法为您提供与上述示例中的docker stop相同的即时响应:

CMD exec /bin/sh -c "trap : TERM INT; sleep 9999999999d & wait"

容器在其主进程退出时退出。 做类似的事情:

docker run -itd debian

坦率地说,保持容器打开是一种技巧,只应用于快速测试和示例。 如果您只想要一个容器进行几分钟的测试,我会这样做:

docker run -d debian sleep 300

这样做的好处是如果你忘记了容器会自动退出。 或者,您可以将类似的内容放在while循环中以使其永远运行,或者只运行诸如top的应用程序。 所有这些在 Kubernetes 中都应该很容易做到。

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

  1. 在你的 Dockerfile 中使用这个命令:

     CMD ["sh", "-c", "tail -f /dev/null"]
  2. 构建您的 docker 镜像。

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

为了保持 POD 运行,它应该执行某些任务,否则 Kubernetes 会发现它没有必要,因此它会停止。 有很多方法可以让 POD 保持运行。

当我需要一个 POD 只是为了连续运行而不做任何有用的操作时,我也遇到过类似的问题。 以下是对我有用的两种方式:

  1. 在运行容器时启动 sleep 命令。
  2. 在容器内运行无限循环。

尽管第一个选项比第二个选项容易并且可能满足要求,但它不是最佳选择。 因为,您要在 sleep 命令中分配的秒数是有限制的。 但是一个在其中运行的无限循环的容器永远不会退出。

但是,我将描述两种方式(考虑到您正在运行 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"]

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"]

运行以下命令来运行 pod:

kubectl apply -f <pod-yaml-file-name>.yaml

希望能帮助到你!

最简单的命令,因为它可以让 k8s pod manifest 永远运行容器:

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu
spec:
  containers:
  - name: ubuntu
    image: ubuntu:latest
    # Just sleep forever
    command: [ "sleep" ]
    args: [ "infinity" ]

我能够让它与 Kubernetes 中的sleep infinity命令一起使用,这将使容器保持打开状态。 当这不起作用时,请参阅此答案以获取替代方案。

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

  • CMD tail -f /dev/null

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

$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity

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

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

$ kubectl exec ubuntu -it -- bash

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

添加:在模板中->在规范中->在容器中->在端口中和容器端口行之后

    command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]

就我而言,带有 initContainer 的 pod 无法初始化。 运行docker ps -a然后docker logs exited-container-id-here给了我一条日志消息, kubectl logs podname没有显示。 谜团已揭开 :-)

有许多不同的方法可以实现这一点,但最优雅的方法之一是:

kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh

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

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

例如,

$ sudo docker run -td ubuntu:latest

Kubernetes中有这样的选择吗?

我试过使用kubectl run-container命令kubectl run-container例如:

kubectl run-container test_container ubuntu:latest --replicas=1

但是容器会退出几秒钟(就像使用不带我上面提到的选项的docker run命令启动一样)。 然后ReplicationController反复再次启动它。

有没有办法像docker docker run命令中的-td选项那样保持容器在Kubernetes上docker run

我把它放在后台做了一个黑客:

[root@localhost ~]# kubectl run hello -it --image ubuntu -- bash &
[2] 128461

在 pod 上执行hello

[root@localhost ~]# kubectl exec -it hello -- whoami
root
[root@localhost ~]# kubectl exec -it hello -- hostname
hello

得到一个壳

[root@localhost ~]# kubectl exec -it hello -- bash
root@hello:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

此命令可能会有所帮助

CMD exec /bin/bash -c "trap : TERM INT; sleep i infinity & wait"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM