Как узнать, когда/если/почему перезапускается контейнер в кластере Kubernetes?

Как узнать, когда/если/почему перезапускается контейнер в кластере Kubernetes?

У меня есть кластер Kubernetes с одним узлом в контейнерном движке Google, с которым можно поиграться.

Дважды небольшой личный веб-сайт, который я размещаю в нем, пропадал на пару минут. Когда я просматриваю логи контейнера, я вижу, что нормальная последовательность запуска недавно была завершена, поэтому я предполагаю, что контейнер умер (или был убит?) и перезапустился.

Как я могу выяснить, как и почему это происходит?

Есть ли способ получать оповещения при неожиданном запуске/остановке контейнера?

решение1

Просмотреть последние журналы перезапуска контейнера можно с помощью:

kubectl logs podname -c имя_контейнера --previous

Как описал Sreekanth, kubectl get pods должен показать вам количество перезапусков, но вы также можете запустить

kubectl опишите pod podname

И он покажет вам события, отправленные kubelet на apiserver о событиях жизненного цикла модуля.

Вы также можете записать финальное сообщение в /dev/termination-log, и оно будет отображаться, как описано вдокументы.

решение2

Помимо предыдущих ответов, еще одна команда, которая помогла мне найти ошибку:

kubectl get event [--namespace=my-namespace]

Он также перечисляет события из Pods, Jobs, Nodes.

решение3

Чтобы определить причину сбоя, я выполняю следующие шаги:

# print out a pod logs (https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#logs)
kubectl logs {name_of_pod} -n {namespace} --since=2h --timestamps


# print the logs for the _previous_ instance of the container in a pod if it exists
kubectl logs -p {name_of_pod} -n {namespace} --previous


# check events (https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#describe)
kubectl describe pod {pod_name} -n {namespace}

# look at the 'Events' at the end of the output
# ..
# Events:
#   Type     Reason   Age                 From               Message
#   ----     ------   ----                ----               -------
#   Warning  BackOff  40m                 kubelet, gke-xx    Back-off restarting failed container
# ..


# observe all events (https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#get)
kubectl get events -n {namespace} --sort-by=.metadata.creationTimestamp


# check logs, etc. in pod container (https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#exec)
kubectl exec -it {pod_name} -n {namespace} -- sh

решение4

При перезапуске

kubectl describe pod your-pod-name

Найдите такой раздел:

State:          Running
  Started:      Wed, 23 Jun 2021 23:52:05 +1000
Last State:     Terminated
  Reason:       Error
  Exit Code:    1
  Started:      Wed, 23 Jun 2021 23:46:48 +1000
  Finished:     Wed, 23 Jun 2021 23:46:52 +1000
Ready:          True 

Интерпретация вышесказанного следующая:

  • Модуль был остановлен Wed, 23 Jun 2021 23:46:52 +1000после запуска в Wed, 23 Jun 2021 23:46:48 +1000, и теперь работает и готов к работе, последний раз запускаясь вWed, 23 Jun 2021 23:52:05 +1000

Запрос на включение изменений теперь объединен с выпуском Kubernetes 1.22, чтобы добавить LAST RESTARTстолбец в kubectl get pods, и будет доступен после его выпуска — см. здесь. https://github.com/kubernetes/kubernetes/pull/100142

Чтобы увидеть вашу текущую версию -kubernetes version

(1.21 — последняя версия по состоянию на 28 июня 2021 г.)

Если перезапустить

kubectl get po [your-pod-name] Модуль был перезапущен на каком-то этапе, если в RESTARTSстолбце есть какое-либо число

Почему перезапущен

kubectl describe pod [your-pod-name]покажет , Last Stateкоторый дает вам высокоуровневую индикацию. Чтобы увидеть, что произошло на pod до его перезапуска, используйте kubectl logs your-pod-name --previous. Вы можете передать это в файл для проверки, например

kubectl logs your-pod-name --previous > pod_previous_log.txt

(См. также выше в разделе «При перезапуске»)

Связанный контент