如何判断 kubernetes 集群中的容器何时/是否/为何重新启动?

如何判断 kubernetes 集群中的容器何时/是否/为何重新启动?

我在 Google 容器引擎中有一个单节点 kubernetes 集群可以试用。

我托管的一个小型个人网站已经两次离线了,每次都持续了几分钟。当我查看容器的日志时,我看到正常的启动序列最近完成了,所以我假设一个容器死了(或者被杀死了?)并重新启动了。

我怎样才能弄清楚发生这种情况的原因和方式?

有没有办法在容器意外启动/停止时收到警报?

答案1

您可以使用以下方法查看容器的最后一次重启日志:

kubectl logs podname -c 容器名称 --previous

根据 Sreekanth 的描述,kubectl get pods 应该会显示重启次数,但你也可以运行

kubectl 描述 pod podname

它将显示 kubelet 向 apiserver 发送的有关 pod 生命周期事件的事件。

您还可以将最后一条消息写入 /dev/termination-log,它将按照以下描述显示:文档

答案2

除了前面的答案之外,另一个帮助我发现错误的命令是:

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

它还列出了来自 Pod、Job、Node 的事件

答案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该 Pod于 启动后被终止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 是截至 2021 年 6 月 28 日的最新版本)

如果重新启动

kubectl get po [your-pod-name]RESTARTS如果该列 中有任何数字,则表示 Pod 在某个阶段已重新启动

为何重启

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

(另请参阅上文‘重新启动时’)

相关内容