我在 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
(另请参阅上文‘重新启动时’)