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

时间:2019-08-09 17:50:22

标签: docker kubernetes dockerfile minikube

我正在与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文件中)还是一个标志?

1 个答案:

答案 0 :(得分:2)

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中确认:

  

仅允许.spec.template.spec.restartPolicy等于Always,如果未指定,则为默认值。

3。如果您真的想强制Docker容器保持运行

在这种情况下,您将需要不退出的东西。 类似服务器的进程就是一个例子。但您也可以尝试在this StackOverflow answer中提到的内容:

CMD exec /bin/bash -c "trap : TERM INT; sleep infinity & wait"
  

这将使您的容器保持活动直到被告知停止。使用陷阱等待功能将使您的容器立即响应停止请求。没有陷阱/等待停止将花费几秒钟。