我现在正在尝试在Kubernetes集群上运行一个带shell(/ bin / bash)的简单容器。
我认为有一种方法可以通过在pseudo-tty
命令上使用-td
和分离选项(docker run
选项)来保持容器在Docker容器上运行。
例如,
$ sudo docker run -td ubuntu:latest
Kubernetes中有这样的选项吗?
我尝试使用kubectl run-container
命令运行容器,如:
kubectl run-container test_container ubuntu:latest --replicas=1
但容器会退出几秒钟(就像使用docker run
命令启动而没有上面提到的选项)。并且ReplicationController重复再次启动它。
有没有办法让Kubernetes上的容器像-td
命令中的docker run
选项一样运行?
答案 0 :(得分:79)
容器意味着运行完成。您需要为容器提供永不完成的任务。这样的事情应该有效:
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;" ]
答案 1 :(得分:73)
您可以在print_r($this->create->model->getItemDetails($item_id)
:
Dockerfile
这将使您的容器保持活着,直到它被告知停止。使用陷阱和等待将使您的容器立即对停止请求做出反应。没有陷阱/等待停止将需要几秒钟。
对于基于busybox的图像(用于基于高山的图像),睡眠不知道无穷大论点。此解决方法为您提供了与CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
相同的立即响应,如上例所示:
docker stop
答案 2 :(得分:29)
当主进程退出时,容器退出。做类似的事情:
docker run -itd debian
保持容器打开坦率地说是一个只能用于快速测试和示例的黑客攻击。如果您只想要一个容器进行几分钟的测试,我会这样做:
docker run -d debian sleep 300
其优点是,如果您忘记了容器,容器将自动退出。或者,您可以在while
循环中放置这样的内容以使其永久运行,或者只运行top
之类的应用程序。所有这些在Kubernetes都很容易做到。
真正的问题是你为什么要这样做?您的容器应该提供服务,其过程将使容器在后台运行。
答案 3 :(得分:15)
在Dockerfile中使用此命令:
CMD ["sh", "-c", "tail -f /dev/null"]
构建您的泊坞窗图片。
kubectl run debug-container -it --image=<your-image>
答案 4 :(得分:7)
为了使POD保持运行,POD应该执行某些任务,否则Kubernetes会发现它是不必要的,因此退出。保持POD运行的方法有很多。
当我需要POD来连续运行而不做任何事情时,我也遇到了类似的问题。以下是为我工作的两种方式:
尽管第一个选项比第二个选项容易,并且可能满足要求,但这不是最佳选择。另外,在睡眠命令中要分配的秒数有一个限制。 但是在其中运行无限循环的容器永远不会退出。
但是,我将描述两种方式(考虑到您正在运行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
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
运行以下命令来运行Pod:
kubectl apply -f <pod-yaml-file-name>.yaml
希望有帮助!
答案 5 :(得分:6)
我能够使用Kubernetes中的命令sleep infinity
来实现此功能,这将使容器保持打开状态。如果不起作用,请参阅this answer了解替代方案。
答案 6 :(得分:5)
最简单的命令,因为它可以使k8s pod清单永久运行容器:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
答案 7 :(得分:2)
在我的情况下,带有initContainer的pod无法初始化。运行docker ps -a
然后docker logs exited-container-id-here
向我发送了一条kubectl logs podname
未显示的日志消息。神秘解决了: - )
答案 8 :(得分:0)
在Dockerfile中使用此命令可保持容器在K8s集群中运行:
答案 9 :(得分:0)
有多种方法可以实现这一目标,但是最优雅的一种方法是:
kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh
答案 10 :(得分:0)
使用Kubernetes部署和服务。
答案 11 :(得分:0)
我通过将其置于后台进行了入侵:
[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
答案 12 :(得分:-1)
我在这个问题上的几分钱。假设kubectl
在工作,那么与您在问题中提到的docker命令等效的最接近命令就是这样。
$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity
以上命令将在Pod
命名空间中创建一个default
,并且将使用sleep
参数执行infinity
命令-这样,您将有一个在使容器保持活动的前景。
后缀,您可以通过运行Pod
命令与kubectl exec
进行交互。
$ kubectl exec ubuntu -it -- bash
此技术对于创建Pod资源和临时调试非常有用。