我在 google 容器引擎中有一個單節點 kubernetes 叢集可以使用。
我在其中託管的一個小型個人網站已經兩次離線幾分鐘了。當我查看容器的日誌時,我看到正常的啟動序列最近完成,因此我假設容器死亡(或被殺死?)並重新啟動。
我怎麼能弄清楚發生這種情況的方式和原因?
有沒有辦法在容器意外啟動/停止時收到警報?
答案1
您可以使用以下命令查看容器的上次重新啟動日誌:
kubectl 日誌 podname -c 容器名稱 --previous
正如 Sreekanth 所描述的,kubectl get pods 應該顯示重新啟動的次數,但你也可以運行
kubectl 描述 pod podname
它將向您顯示 kubelet 傳送到 apiserver 的有關 pod 生命週期事件的事件。
您也可以將最終訊息寫入 /dev/termination-log,這將按中所述顯示文件。
答案2
除了前面的答案之外,另一個幫助我找到錯誤的命令是:
kubectl get event [--namespace=my-namespace]
它還列出了來自 Pod、作業、節點的事件
答案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
(另請參閱上文「重新啟動時」下的內容)