如何在 Kubernetes 上保留容器 运行?
How can I keep a container running on Kubernetes?
我现在正尝试在 Kubernetes 集群上 运行 一个带有 shell (/bin/bash) 的简单容器。
我认为有一种方法可以通过使用 pseudo-tty
和分离选项(-td
选项 docker run
命令)。
例如,
$ sudo docker run -td ubuntu:latest
Kubernetes 有这样的选项吗?
我已经尝试 运行使用 kubectl run-container
命令来创建一个容器,例如:
kubectl run-container test_container ubuntu:latest --replicas=1
但是容器会退出几秒钟(就像使用上面提到的没有选项的 docker run
命令启动一样)。然后 ReplicationController 再次启动它。
有没有办法像 docker run
命令中的 -td
选项那样在 Kubernetes 上保留容器 运行ning?
容器在其主进程退出时退出。做类似的事情:
docker run -itd debian
坦率地说,让容器保持打开状态是一种 hack,只能用于快速测试和示例。如果你只是想要一个容器来测试几分钟,我会这样做:
docker run -d debian sleep 300
这样做的好处是如果你忘记了容器会自动退出。或者,您可以将类似的东西放在 while
循环中以使其永远保持 运行ning,或者只是 运行 一个应用程序,例如 top
。所有这些在 Kubernetes 中应该很容易做到。
真正的问题是你为什么要这样做?您的容器应该提供一项服务,其进程将使容器 运行ning 在后台运行。
我能够在 Kubernetes 中使用命令 sleep infinity
使它工作,这将使容器保持打开状态。当它不起作用时,请参阅 this answer 了解替代方案。
您可以在 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; sleep 9999999999d & wait"
容器旨在运行完成。您需要为您的容器提供一个永远不会完成的任务。这样的事情应该有效:
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 ["sh", "-c", "tail -f /dev/null"]
构建您的 docker 图像。
- 将其推送到您的集群或类似集群,以确保它可用。
kubectl run debug-container -it --image=<your-image>
在我的例子中,带有 initContainer 的 pod 初始化失败。 运行 docker ps -a
然后 docker logs exited-container-id-here
给了我一个 kubectl logs podname
没有显示的日志消息。谜团解开了:-)
最简单的命令,因为它可以使 k8s pod 清单永远 运行 容器:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
为了保持 POD 运行ning 它应该执行特定任务,否则 Kubernetes 会发现它没有必要,因此它会停止。保持 POD 的方法有很多种 运行ning。
当我需要一个 POD 只是为了连续 运行 而没有做任何有用的操作时,我遇到过类似的问题。以下是对我有用的两种方式:
- 运行宁休眠命令,同时 运行宁容器。
- 运行在容器内无限循环。
虽然第一个选项比第二个更容易并且可能满足要求,但它不是最佳选项。因为,您要在 sleep 命令中分配的秒数是有限制的。
但是一个无限循环的容器 运行ning 在里面永远不会退出。
但是,我将描述这两种方式(考虑到您是 运行ning 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
希望对您有所帮助!
在您的 Dockerfile 中使用此命令将容器 运行 保留在您的 K8s 集群中:
- CMD tail -f /dev/null
我对这个问题的看法。假设 kubectl
正在工作,那么最接近的命令相当于您在问题中提到的 docker 命令,就像这样。
$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity
以上命令将在 default
命名空间中创建一个 Pod
,并且它将执行带有 infinity
参数的 sleep
命令 - 这样您将拥有一个进程在前台运行,使容器保持活动状态。
之后,您可以通过运行 kubectl exec
命令与Pod
进行交互。
$ kubectl exec ubuntu -it -- bash
此技术对于创建 Pod 资源和临时调试非常有用。
有许多不同的方法可以实现这一点,但最优雅的方法之一是:
kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh
我把它放在后台进行了破解:
[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
获得shell
[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
添加:在模板中 -> 在规范中 -> 在容器中 -> 在端口中 & 在容器端口行之后
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]
我现在正尝试在 Kubernetes 集群上 运行 一个带有 shell (/bin/bash) 的简单容器。
我认为有一种方法可以通过使用 pseudo-tty
和分离选项(-td
选项 docker run
命令)。
例如,
$ sudo docker run -td ubuntu:latest
Kubernetes 有这样的选项吗?
我已经尝试 运行使用 kubectl run-container
命令来创建一个容器,例如:
kubectl run-container test_container ubuntu:latest --replicas=1
但是容器会退出几秒钟(就像使用上面提到的没有选项的 docker run
命令启动一样)。然后 ReplicationController 再次启动它。
有没有办法像 docker run
命令中的 -td
选项那样在 Kubernetes 上保留容器 运行ning?
容器在其主进程退出时退出。做类似的事情:
docker run -itd debian
坦率地说,让容器保持打开状态是一种 hack,只能用于快速测试和示例。如果你只是想要一个容器来测试几分钟,我会这样做:
docker run -d debian sleep 300
这样做的好处是如果你忘记了容器会自动退出。或者,您可以将类似的东西放在 while
循环中以使其永远保持 运行ning,或者只是 运行 一个应用程序,例如 top
。所有这些在 Kubernetes 中应该很容易做到。
真正的问题是你为什么要这样做?您的容器应该提供一项服务,其进程将使容器 运行ning 在后台运行。
我能够在 Kubernetes 中使用命令 sleep infinity
使它工作,这将使容器保持打开状态。当它不起作用时,请参阅 this answer 了解替代方案。
您可以在 Dockerfile
:
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; sleep 9999999999d & wait"
容器旨在运行完成。您需要为您的容器提供一个永远不会完成的任务。这样的事情应该有效:
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 ["sh", "-c", "tail -f /dev/null"]
构建您的 docker 图像。
- 将其推送到您的集群或类似集群,以确保它可用。
kubectl run debug-container -it --image=<your-image>
在我的例子中,带有 initContainer 的 pod 初始化失败。 运行 docker ps -a
然后 docker logs exited-container-id-here
给了我一个 kubectl logs podname
没有显示的日志消息。谜团解开了:-)
最简单的命令,因为它可以使 k8s pod 清单永远 运行 容器:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
为了保持 POD 运行ning 它应该执行特定任务,否则 Kubernetes 会发现它没有必要,因此它会停止。保持 POD 的方法有很多种 运行ning。
当我需要一个 POD 只是为了连续 运行 而没有做任何有用的操作时,我遇到过类似的问题。以下是对我有用的两种方式:
- 运行宁休眠命令,同时 运行宁容器。
- 运行在容器内无限循环。
虽然第一个选项比第二个更容易并且可能满足要求,但它不是最佳选项。因为,您要在 sleep 命令中分配的秒数是有限制的。 但是一个无限循环的容器 运行ning 在里面永远不会退出。
但是,我将描述这两种方式(考虑到您是 运行ning 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
希望对您有所帮助!
在您的 Dockerfile 中使用此命令将容器 运行 保留在您的 K8s 集群中:
- CMD tail -f /dev/null
我对这个问题的看法。假设 kubectl
正在工作,那么最接近的命令相当于您在问题中提到的 docker 命令,就像这样。
$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity
以上命令将在 default
命名空间中创建一个 Pod
,并且它将执行带有 infinity
参数的 sleep
命令 - 这样您将拥有一个进程在前台运行,使容器保持活动状态。
之后,您可以通过运行 kubectl exec
命令与Pod
进行交互。
$ kubectl exec ubuntu -it -- bash
此技术对于创建 Pod 资源和临时调试非常有用。
有许多不同的方法可以实现这一点,但最优雅的方法之一是:
kubectl run -i --tty --image ubuntu:latest ubuntu-test --restart=Never --rm /bin/sh
我把它放在后台进行了破解:
[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
获得shell
[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
添加:在模板中 -> 在规范中 -> 在容器中 -> 在端口中 & 在容器端口行之后
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]