spr*_*ell 94 containers docker kubernetes google-kubernetes-engine
我现在正在尝试在Kubernetes集群上运行一个带shell(/ bin/bash)的简单容器.
我认为有一种方法可以通过使用pseudo-tty
和分离选项(命令-td
选项docker run
)来保持容器在Docker容器上运行.
例如,
$ sudo docker run -td ubuntu:latest
Run Code Online (Sandbox Code Playgroud)
在Kubernetes有这样的选择吗?
我尝试使用如下kubectl run-container
命令运行容器:
kubectl run-container test_container ubuntu:latest --replicas=1
Run Code Online (Sandbox Code Playgroud)
但容器会退出几秒钟(就像使用docker run
上面提到的没有选项的命令启动一样).并且ReplicationController重复再次启动它.
有没有办法让Kubernetes上的容器像命令中的-td
选项一样运行docker run
?
Joe*_*l B 94
容器意味着完成.您需要为容器提供永不完成的任务.这样的事情应该有效:
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;" ]
Run Code Online (Sandbox Code Playgroud)
its*_*ire 84
您可以在以下位置使用此CMD Dockerfile
:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
Run Code Online (Sandbox Code Playgroud)
这将使您的容器保持活着,直到它被告知停止.使用陷阱和等待将使您的容器立即对停止请求做出反应.没有陷阱/等待停止将需要几秒钟.
对于基于busybox的图像(用于基于高山的图像),睡眠不知道无穷大论点.此解决方法在上面的示例中为您提供了相同的即时响应docker stop
:
CMD exec /bin/sh -c "trap : TERM INT; (while true; do sleep 1000; done) & wait"
Run Code Online (Sandbox Code Playgroud)
Adr*_*uat 39
当主进程退出时,容器退出.做类似的事情:
docker run -itd debian
Run Code Online (Sandbox Code Playgroud)
坦率地说,容器打开是一个只能用于快速测试和示例的黑客攻击.如果你只想要一个容器进行几分钟的测试,我会这样做:
docker run -d debian sleep 300
Run Code Online (Sandbox Code Playgroud)
其优点是,如果您忘记了容器,容器将自动退出.或者,你可以把这样的东西放在一个while
循环中,以使它永远运行,或者只是运行一个应用程序,如top
.所有这些在Kubernetes中应该很容易做到.
真正的问题是你为什么要这样做?您的容器应该提供服务,其过程将使容器在后台运行.
Rad*_*iel 16
在Dockerfile中使用此命令:
CMD ["sh", "-c", "tail -f /dev/null"]
构建您的docker镜像.
kubectl run debug-container -it --image=<your-image>
Arb*_*aaz 10
为了使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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
运行以下命令以运行Pod:
kubectl apply -f <pod-yaml-file-name>.yaml
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
小智 9
添加以下内容:在模板中 -> 在规范中 -> 在容器中 -> 在端口中 & 在容器端口行之后
command: ["/bin/sh", "-ec", "while :; do echo '.'; sleep 6 ; done"]
Run Code Online (Sandbox Code Playgroud)
小智 6
最简单的命令,因为它可以使k8s pod清单永久运行容器:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
containers:
- name: ubuntu
image: ubuntu:latest
# Just sleep forever
command: [ "sleep" ]
args: [ "infinity" ]
Run Code Online (Sandbox Code Playgroud)
我在这个问题上的几分钱。假设它kubectl
正在工作,那么与您在问题中提到的 docker 命令最接近的命令将是这样的。
$ kubectl run ubuntu --image=ubuntu --restart=Never --command sleep infinity
Run Code Online (Sandbox Code Playgroud)
上面的命令将Pod
在default
命名空间中创建一个,并且它将执行sleep
带infinity
参数的命令- 这样你将有一个在前台运行的进程保持容器处于活动状态。
之后,您可以Pod
通过运行kubectl exec
命令进行交互。
$ kubectl exec ubuntu -it -- bash
Run Code Online (Sandbox Code Playgroud)
这种技术对于创建 Pod 资源和临时调试非常有用。
归档时间: |
|
查看次数: |
112005 次 |
最近记录: |