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

我认为有一种方法可以通过使用伪tty和detach选项(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;" ]

其他回答

在我的例子中,带有initContainer的pod初始化失败。运行docker ps -a,然后docker logs exits -container-id-here给我一个日志消息,kubectl logs podname没有显示。谜团解开了:-)

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

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

我对这个问题的一些看法。假设kubectl正在工作,那么与您在问题中提到的docker命令等效的最接近的命令将是这样的。

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

上面的命令将在默认的命名空间中创建一个Pod,它将执行带无限参数的sleep命令——这样你就有了一个在前台运行的进程,使容器保持活跃。

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

$ kubectl exec ubuntu -it -- bash

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

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

CMD tail -f /dev/null

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

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