Под переходит в состояние CrashLoopBackOff и многократно перезапускается - код выхода равен 0

У меня есть докер-контейнер, который работает нормально, когда я запускаю его с помощью docker run. Я пытаюсь поместить этот контейнер в контейнер, но у меня возникают проблемы. Первый запуск модуля показывает статус «Завершено». И затем модуль продолжает перезапуск со статусом 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 получить стручки

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

Я предполагаю, что в этом случае нам нужен цикл, чтобы контейнер работал. Но я не понимаю, почему он работал, когда работал с использованием докера, и не работал, когда он находился внутри модуля. Разве он не должен вести себя так же?

Как мы обычно отлаживаем статус CrashLoopBackOff, кроме запуска kubectl, описания pod и журналов kubectl


person user1722908    schedule 03.08.2018    source источник
comment
вы можете опубликовать логи модуля?   -  person jaxxstorm    schedule 03.08.2018
comment
В журналах ничего нет   -  person user1722908    schedule 03.08.2018
comment
Если бы он не вел себя так же, я серьезно сомневаюсь, что у вас есть ConfigMap при запуске с использованием докера. Но, помимо этого, если журналов действительно нет, тогда отличный трюк для отладки состоит в том, чтобы изменить command: на command: ["sleep", "3600"], а затем exec в этот Pod и запустить реальную точку входа вручную, возможно, несколько раз, пытаясь выяснить, почему это расстроено.   -  person mdaniel    schedule 03.08.2018
comment
Если вы попытаетесь запустить docker logs во время его запуска (снова) и ничего не увидите, docker logs --previous может быть информативным.   -  person David Maze    schedule 03.08.2018
comment
Я добавил засыпание в конце команды, и теперь она работает нормально. Было бы это нормальным решением?   -  person user1722908    schedule 03.08.2018


Ответы (2)


Контейнер будет завершен с кодом выхода 0, если в фоновом режиме не запущен хотя бы один процесс. Чтобы контейнер продолжал работать, добавьте их в конфигурацию развертывания:

  command: ["sh"]
  stdin: true

Замените sh на bash в любой другой оболочке, которая может быть у образа.

Затем вы можете зайти внутрь контейнера с помощью exec:

 kubectl exec -it <pod-name> sh

Добавьте аргумент -c <container-name>, если модуль имеет более одного контейнера.

person apisim    schedule 05.08.2018

Вы уверены, что запускаете свое программное обеспечение как docker run ... -d ... <command>, и оно продолжает работать, и вы используете ту же самую команду в своем модуле? В некоторых случаях, если вы сравните вещи, которые работают на докере, с -it и без -d, вы можете оказаться в затруднительном положении, поскольку они ожидают, что терминал будет связываться с пользователем и выйдет, если tty недоступен (подсказка: модуль / контейнер можно запустить с tty: true)

Маловероятно, что у вас есть программное обеспечение, которое работает в отдельном докере, а не в kube.

person Radek 'Goblin' Pieczonka    schedule 03.08.2018
comment
Я использую docker run -it при запуске с помощью docker. Я также использую docker-compose для запуска контейнера докеров. Я не уверен, как выполнить команду запуска докера с помощью модуля. Я думал, что для запуска модуля нужен только Dockerfile. - person user1722908; 03.08.2018