[英]Can't get the application logs from pods Kubernetes
我在三個不同的容器中運行三個服務。 這些服務的日志被發送到系統,所以如果我在 Linux 服務器上運行這些服務,我可以使用 journalctl 查看日志。
此外,如果我在 Docker 容器中運行服務,我可以使用 docker logs <container_name> 或 /var/lib/docker/containers 目錄收集日志。 但是當我移動到 Kubernetes (Microk8s) 時,我無法使用 kubectl logs 命令檢索它們,並且 /var/log/containers 或 /var/log/pods 中也沒有日志。
如果我登錄到 pod,我可以看到進程正在運行,但是如果沒有日志,我就不能說它們是否正確運行。 另外,我嘗試將 microk8s kubelet 的運行時從 containerd 更改為 docker,但仍然無法獲取任何日志。
# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
amf-deployment-7785db9758-h24kz 1/1 Running 0 72s 10.1.243.237 ubuntu <none>
# kubectl describe po amf-deployment-7785db9758-h24kz
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 87s default-scheduler Successfully assigned default/amf-deployment-7785db9758-h24kz to ubuntu
Normal AddedInterface 86s multus Add eth0 [10.1.243.237/32]
Normal Pulled 86s kubelet Container image "amf:latest" already present on machine
Normal Created 86s kubelet Created container amf
Normal Started 86s kubelet Started container amf
# kubectl logs amf-deployment-7785db9758-h24kz
# kubectl logs -f amf-deployment-7785db9758-h24kz
^C
您可以在以下屏幕截圖中看到使用 Docker 運行同一容器和使用 Kubernetes 運行它的區別。 這種行為看起來很奇怪,因為如果應用程序作為獨立的 Docker 容器運行,則可以收集日志,但當它與 Kubernetes 一起運行時則不能。 在此處輸入圖像描述
在傳統的服務器環境中,應用程序日志被寫入一個文件,例如/var/log/app.log
。 但是,在使用 Kubernetes 時,您需要跨集群中的多個節點收集多個臨時 pod(應用程序)的日志,這使得這種日志收集方法不是最佳的。 相反,默認的 Kubernetes 日志框架建議從每個節點上的日志文件中捕獲標准 output ( stdout
) 和標准錯誤 output ( stderr
)。 如果您在使用kubectl logs
命令時看不到您的應用程序日志,則很可能意味着您的應用程序沒有在正確的位置寫入日志。 官方Logging Architecture文檔更詳細地解釋了這個主題。 Kubernetes 中還有一個基本日志記錄的示例:
此示例使用帶有容器的 Pod 規范將文本寫入標准 output stream 每秒一次。
apiVersion: v1 kind: Pod metadata: name: counter spec: containers: - name: count image: busybox args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
要運行此 pod,請使用以下命令:
kubectl apply -f https://k8s.io/examples/debug/counter-pod.yaml
output 是:
pod/counter created
要獲取日志,請使用 kubectl logs 命令,如下所示:
kubectl logs counter
output 是:
0: Mon Jan 1 00:00:00 UTC 2001 1: Mon Jan 1 00:00:01 UTC 2001 2: Mon Jan 1 00:00:02 UTC 2001...
您可以使用
kubectl logs --previous
從容器的先前實例中檢索日志。 如果您的 pod 有多個容器,請通過將容器名稱附加到命令來指定要訪問哪個容器的日志。 有關更多詳細信息,請參閱kubectl 日志文檔。
您可以將其與您的Pod
/app 配置進行比較,看看是否有任何錯誤。
考慮到這些知識,您現在有幾個選項來調試正在運行的 Pod ,例如:
通過執行kubectl describe pods ${POD_NAME}
調試Pod 並檢查其失敗的原因。
檢查 pod 日志:使用kubectl logs ${POD_NAME} ${CONTAINER_NAME}
或kubectl logs --previous ${POD_NAME} ${CONTAINER_NAME}
使用容器 exec 進行調試:通過使用kubectl exec
在特定容器內運行命令
使用臨時調試容器進行調試:當kubectl exec
不足時,臨時容器對於交互式故障排除很有用,因為容器已崩潰或容器映像不包含調試實用程序,例如使用distroless 映像。
通過節點上的 shell 進行調試:如果這些方法都不起作用,您可以找到運行 pod 的主機和 SSH 到該主機
總結一下:
確保您的日志記錄到位
使用上面列出的選項進行調試
對於 kubernetes 日志,您可以嘗試使用此命令查看日志:
kubectl logs -f <pod-name>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.