我正在与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容器,并且它确实存在了。为什么不停留在Kubernetes
内?在这种特殊情况下,我应该使用一个参数(在YAML文件中)还是一个标志?
答案 0 :(得分:2)
如果您熟悉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'
如@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中确认:
仅允许
.spec.template.spec.restartPolicy
等于Always
,如果未指定,则为默认值。
在这种情况下,您将需要不退出的东西。 类似服务器的进程就是一个例子。但您也可以尝试在this StackOverflow answer中提到的内容:
CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
这将使您的容器保持活动直到被告知停止。使用陷阱等待功能将使您的容器立即响应停止请求。没有陷阱/等待停止将花费几秒钟。