gpt4 book ai didi

docker - Pod卡在 `CrashLoopBackOff`上,即使它应该进入/bin/bash

转载 作者:行者123 更新时间:2023-12-02 12:03:31 25 4
gpt4 key购买 nike

我正在使用Kubernetes运行minikube集群,即使我在Dockerfile中指定应保持终端保持打开状态,我的部署(或单个Pod)也不会保持运行状态(我也尝试过sh)。他们不断重启,有时在重新启动之前陷入CrashLoopBackOff状态:

FROM ubuntu

EXPOSE 8080

CMD /bin/bash

我的部署文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleeper-deploy
spec:
replicas: 10
selector:
matchLabels:
app: sleeper-world
minReadySeconds: 10
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 1
template:
metadata:
labels:
app: sleeper-world
spec:
containers:
- name: sleeper-pod
image: kubelab
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080

总而言之,我的工作流程如下( deploy.sh):

#!/bin/bash

# Cleaning

kubectl delete deployments --all
kubectl delete pods --all

# Building the Image

sudo docker build \
-t kubelab \
.

# Deploying

kubectl apply -f sleeper_deployment.yml

顺便说一句,我已经使用 sudo docker run -dt kubelab测试了Docker Container的独有性,并且它确实存在。为什么它不停留在 Kubernetes中?在这种特殊情况下,我应该使用参数(在YAML文件中)还是标志?

最佳答案

1.原始答案(但已编辑...)

如果您熟悉Docker,请检查this

如果您正在寻找等效的docker run -dt kubelab,请尝试kubectl run -it kubelab --restart=Never --image=ubuntu /bin/bash。在您的情况下,使用Docker -t标志:Allocate a pseudo-tty。这就是为什么您的Docker容器保持运转的原因。

尝试:

kubectl run kubelab \
--image=ubuntu \
--expose \
--port 8080 \
-- /bin/bash -c 'while true;do sleep 3600;done'

要么:

kubectl run kubelab \
--image=ubuntu \
--dry-run -oyaml \
--expose \
--port 8080 \
-- /bin/bash -c 'while true;do sleep 3600;done'

2.解释发生了什么(Philippe Fanaro添加):

正如@David Maze所说, bash进程将立即退出,因为人工终端将没有任何输入,这与Docker的行为略有不同。

如果更改 restart策略,它将仍然终止,不同之处在于Pod不会重新生成或重新启动。

一种实现方法是(注意 restartPolicy的选项卡):
apiVersion: v1
kind: Pod
metadata:
name: kubelab-pod
labels:
zone: prod
version: v1
spec:
containers:
- name: kubelab-ctr
image: kubelab
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
restartPolicy: Never

但是,如果在 deployment YAML中指定了 ,则不起作用,而不起作用。那是因为部署会强制进行再生,试图始终达到所需的状态。这可以在Deployment Documentation Webpage中确认:

Only a .spec.template.spec.restartPolicy equal to Always is allowed, which is the default if not specified.



3.如果您真的想强制Docker容器继续运行

在这种情况下,您将需要不退出的东西。一个类似服务器的过程就是一个例子。但是您也可以尝试this StackOverflow answer中提到的内容:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"

This will keep your container alive until it is told to stop. Using trap and wait will make your container react immediately to a stop request. Without trap/wait stopping will take a few seconds.

关于docker - Pod卡在 `CrashLoopBackOff`上,即使它应该进入/bin/bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57434998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com