【问题标题】:Pod gets into status of CrashLoopBackOff and gets restarted repeatedly - Exit code is 0Pod 进入 CrashLoopBackOff 状态并反复重启 - 退出代码为 0
【发布时间】:2019-01-11 10:48:20
【问题描述】:

我有一个运行良好的 docker 容器,当我使用 docker run 运行它时。我正在尝试将该容器放入 pod 中,但我遇到了问题。 pod 的第一次运行显示状态为“已完成”。然后 pod 继续以 CrashLoopBackoff 状态重新启动。然而退出代码是 0。

这是 kubectl describe pod 的结果:

Name:           messagingclientuiui-6bf95598db-5znfh
Namespace:      mgmt
Node:           db1mgr0deploy01/172.16.32.68
Start Time:     Fri, 03 Aug 2018 09:46:20 -0400
Labels:         app=messagingclientuiui
            pod-template-hash=2695115486
Annotations:    <none>
Status:         Running
IP:             10.244.0.7
Controlled By:  ReplicaSet/messagingclientuiui-6bf95598db
Containers:
  messagingclientuiui:
    Container ID:   docker://a41db3bcb584582e9eacf26b02c7ef26f57c2d43b813f44e4fd1ba63347d3fc3
Image:          172.32.1.4/messagingclientuiui:667-I20180802-0202
Image ID:       docker-pullable://172.32.1.4/messagingclientuiui@sha256:89a002448660e25492bed1956cfb8fff447569e80ac8b7f7e0fa4d44e8abee82
Port:           9087/TCP
Host Port:      0/TCP
State:          Waiting
  Reason:       CrashLoopBackOff
Last State:     Terminated
  Reason:       Completed
  Exit Code:    0
  Started:      Fri, 03 Aug 2018 09:50:06 -0400
  Finished:     Fri, 03 Aug 2018 09:50:16 -0400
Ready:          False
Restart Count:  5
Environment Variables from:
  mesg-config  ConfigMap  Optional: false
Environment:     <none>
Mounts:
  /docker-mount from messuimount (rw)
  /var/run/secrets/kubernetes.io/serviceaccount from default-token-2pthw (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          False
  PodScheduled   True
Volumes:
  messuimount:
    Type:          HostPath (bare host directory volume)
    Path:          /mon/monitoring-messui/docker-mount
    HostPathType:
  default-token-2pthw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-2pthw
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason                 Age              From                            Message
  ----     ------                 ----             ----                      -------
  Normal   Scheduled              4m               default-scheduler         Successfully assigned messagingclientuiui-6bf95598db-5znfh to db1mgr0deploy01
  Normal   SuccessfulMountVolume  4m               kubelet, db1mgr0deploy01  MountVolume.SetUp succeeded for volume "messuimount"
  Normal   SuccessfulMountVolume  4m               kubelet, db1mgr0deploy01  MountVolume.SetUp succeeded for volume "default-token-2pthw"
  Normal   Pulled                 2m (x5 over 4m)  kubelet, db1mgr0deploy01  Container image "172.32.1.4/messagingclientuiui:667-I20180802-0202" already present on machine
  Normal   Created                2m (x5 over 4m)  kubelet, db1mgr0deploy01  Created container
  Normal   Started                2m (x5 over 4m)  kubelet, db1mgr0deploy01  Started container
  Warning  BackOff                1m (x8 over 4m)  kubelet, db1mgr0deploy01  Back-off restarting failed container

kubectl 获取 pod

      NAME                              READY     STATUS             RESTARTS   AGE
messagingclientuiui-6bf95598db-5znfh   0/1       CrashLoopBackOff   9          23m

我假设在这种情况下我们需要一个循环来保持容器运行。但我不明白为什么它在使用 docker 运行时工作,而在 pod 内时不工作。它不应该表现得一样吗?

除了运行 kubectl describe pod 和 kubectl 日志外,我们如何调试 CrashLoopBackOff 状态

【问题讨论】:

  • 您可以发布 pod 日志吗?
  • 日志中没有任何内容
  • 它的行为是否应该相同,我严重怀疑您在使用 docker 运行时是否有 ConfigMap。但是,除此之外,如果真的没有日志,那么一个很好的调试技巧是将command: 更改为command: ["sleep", "3600"],然后将exec 更改为该 Pod 并手动运行真正的入口点,可能会重复运行,同时尝试弄清楚它为什么不高兴
  • 如果您尝试在启动时(再次)运行docker logs,但您什么也看不到,docker logs --previous 可以提供信息。
  • 我在实际命令的末尾添加了一个睡眠,它现在工作正常。这是一个好的解决方案吗?

标签: docker kubernetes kubernetes-pod


【解决方案1】:

如果没有至少一个进程在后台运行,则容器将以退出代码 0 终止。要保持容器运行,请将这些添加到部署配置中:

  command: ["sh"]
  stdin: true

在图像可能具有的任何其他外壳上将sh 替换为bash

然后你可以使用exec 放入容器中:

 kubectl exec -it <pod-name> sh

如果 pod 有多个容器,则添加 -c &lt;container-name&gt; 参数。

【讨论】:

    【解决方案2】:

    你确定你以docker run ... -d ... &lt;command&gt; 运行你的软件并且它一直在运行并且你在你的 pod 中使用了相同的命令吗?在某些情况下,如果您将在 docker 上运行的东西与 -it 和没有 -d 进行比较,您可能会发现自己处于紧要关头,因为他们希望终端与用户通信并在 tty 不可用时退出(提示:pod/container可以用tty: true运行)

    您的软件不太可能在分离的 docker 中运行而在 kube 中不运行。

    【讨论】:

    • 我在使用 docker 运行时使用 docker run -it。我还使用 docker-compose 来启动 docker 容器。我不确定如何使用 pod 执行 docker run 命令。我认为它只是启动 pod 所需的 Dockerfile
    猜你喜欢
    • 2017-08-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2022-07-05
    • 2023-03-16
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多