我现在尝试在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选项?


当前回答

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

CMD tail -f /dev/null

其他回答

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

CMD tail -f /dev/null

容器在主进程退出时退出。做这样的事情:

docker run -itd debian

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

docker run -d debian sleep 300

它的优点是,如果你忘记它,容器将自动退出。或者,您可以在while循环中放入类似的内容以保持它永远运行,或者只运行诸如top之类的应用程序。所有这些在Kubernetes中都很容易做到。

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

添加这个:在模板->在规格->在集装箱->在港口和之后的集装箱港口线

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

我做了一个hack,把它放在后台:

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

执行舱上,你好

[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

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

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

运行容器时运行sleep命令。 在容器内运行一个无限循环。

虽然第一种方法比第二种方法简单,而且可能满足要求,但它不是最好的方法。因为,在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

希望能有所帮助!