簡體   English   中英

無法從 pod Kubernetes 獲取應用程序日志

[英]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 ,例如:


總結一下:

  • 確保您的日志記錄到位

  • 使用上面列出的選項進行調試

對於 kubernetes 日志,您可以嘗試使用此命令查看日志:

kubectl logs -f <pod-name>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM