我现在正在尝试在Kubernetes集群上运行一个带shell(/bin/bash)
的简单容器。
有一种方法可以通过使用pseudo-tty
和detach
选项(docker run
命令上的-td
选项)来保持容器在Docker容器上运行,不会关闭。
例如,
$ sudo docker run -td ubuntu:latest
在Kubernetes(k8s)该怎么做?
我尝试使用kubectl run-container
命令运行容器,如:
kubectl run-container test_container ubuntu:latest --replicas=1
但是容器几秒钟就会退出,并且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"
这也将会保持容器活着,直到被告知停止。使用
trap
和wait
可以立即做出反应,仅需要几秒。对于基于busybox的镜像(用于基于alpine的镜像),通过sleep无穷尽来保持活跃。此解决方法为你提供了与
docker stop
相同的即时响应,如上面的例子:CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
非常感谢,理解了k8s启动容器的工作原理。
你的答案