文章

Kubernetes Pod Logs 教學:快速查看多個 Pod Logs(kubectl 實戰)

Kubernetes Pod Logs 教學:快速查看多個 Pod Logs(kubectl 實戰). Practical notes and implementation steps.

Kubernetes Pod Logs 教學:快速查看多個 Pod Logs(kubectl 實戰)

在 Kubernetes 除錯時,查看 Pod logs 是最常做的事情之一。如果服務有多個 Pod(例如 Deployment 產生的 replicas),有時會需要一次查看多個 Pod 的 logs。

這篇整理幾個常用的 kubectl logs 使用方式。


1. 基本用法

查看單一 Pod 的 Logs

最基本的指令:

1
kubectl logs -n {namespace} {podname} --tail=100

例如:

1
kubectl logs -n prod api-server-7c8f6d9d8f-abcde --tail=100

持續追蹤 Logs

1
kubectl logs -n {namespace} {podname} -f

查看多 Container Pod

如果 Pod 裡有多個 container:

1
kubectl logs -n {namespace} {podname} -c {container-name}

查看上一個 Crash 的 Container

當 Pod 出現 CrashLoopBackOff 時很有用:

1
kubectl logs -n {namespace} {podname} --previous

2. 一次查看多個 Pod Logs

如果 Deployment 有多個 replicas,可以透過 kubectl get pods 搭配 xargs 或 shell loop。

方法一:使用 xargs

1
2
kubectl get pods -n {namespace} -o name \
| xargs -I {} kubectl logs -n {namespace} {} --tail=100
  • 流程:
    • 先列出所有 Pod
    • 逐一執行 kubectl logs
  • 輸出類似:
1
2
3
pod/api-123
pod/api-456
pod/api-789

方法二:使用 Shell Loop

有些人會覺得這種方式比較好閱讀:

1
2
3
for p in $(kubectl get pods -n {namespace} -o name); do
  kubectl logs -n {namespace} $p --tail=100
done

3. 只抓某個 Deployment 的 Pods

實務上通常只會看某個服務,而不是整個 namespace。

最常見的方法是使用 label selector。

1
2
kubectl get pods -n {namespace} -l app={deployment-name} -o name \
| xargs -I {} kubectl logs -n {namespace} {} --tail=100

前提是 Deployment 使用類似以下 label:

1
app=my-service

4. 在 Logs 中標示 Pod Name

當多個 Pod logs 混在一起時,建議加上 Pod 標示:

1
2
kubectl get pods -n {namespace} -l app={deployment-name} -o name \
| xargs -I {} sh -c 'echo "===== {} ====="; kubectl logs -n {namespace} {} --tail=100'

輸出會變成:

1
2
3
4
5
6
7
===== pod/api-7c8f6d9d8f-abcde =====
log line 1
log line 2

===== pod/api-7c8f6d9d8f-fghij =====
log line 1
log line 2

這樣可以清楚知道每段 log 來自哪個 Pod。

5. 同時追蹤多個 Pod Logs

如果需要即時追蹤:

1
2
kubectl get pods -n {namespace} -l app={deployment-name} -o name \
| xargs -I {} sh -c 'kubectl logs -n {namespace} -f {} | sed "s/^/[{}] /"'

輸出會像:

1
2
[pod/api-xxx] server started
[pod/api-yyy] connection opened

6. 查看 Deployment 使用的 Labels

如果不確定 Deployment 的 label,可以先查:

1
kubectl get deploy {deployment-name} -n {namespace} --show-labels

或:

1
kubectl get pods -n {namespace} --show-labels

找到對應的 label selector 後,再套用到 kubectl get pods -l

7. 小結

常見的 Kubernetes logs 使用方式:

  • 查看單一 Pod logs
  • 使用 --tail 限制輸出行數
  • 使用 -f 即時追蹤 logs
  • 透過 kubectl get pods + xargs 一次查看多個 Pods
  • 使用 label selector 限縮到某個 Deployment
本文章以 CC BY 4.0 授權