У меня есть кластер 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
(См. также выше в разделе «При перезапуске»)