簡體   English   中英

如何從 Kubernetes 復制 controller 的所有 pod 獲取日志?

[英]How do I get logs from all pods of a Kubernetes replication controller?

運行kubectl logs顯示一個 Kubernetes 容器的標准錯誤/標准輸出。

如何獲得一組 pod 的聚合 stderr/stdout,最好是由某個復制 controller 創建的那些?

您可以使用標簽

kubectl logs -l app=elasticsearch

您可能需要指定--all-containers --ignore-errors以便:

  • 包含來自具有多個容器的 pod 的日志
  • 出現致命錯誤時繼續下一個 pod(例如,無法檢索日志)

我創建了一個名為kubetail的小型 bash 腳本,它使這成為可能。 例如,要跟蹤名為“app1”的 pod 的所有日志,您可以執行以下操作:

kubetail app1

您可以在此處找到腳本。

您可以使用 Adrian Ng 建議的標簽從多個容器中獲取日志:

kubectl logs --selector app=yourappname

如果您有一個包含多個容器的 pod,上述命令將失敗,您需要指定容器名稱:

kubectl logs --selector app=yourappname --container yourcontainername

注意:如果您想查看哪些標簽可供您使用,以下命令將列出所有標簽:

kubectl get pod <one of your pods> -o template --template='{{.metadata.labels}}'

...輸出看起來像

地圖[應用程序:您的應用程序名稱控制器修訂哈希:598302898 pod-template-generation:1]

請注意,某些標簽可能不會被其他 pod 共享 - 選擇“app”似乎是最簡單的一個

如果添加-f ,則要在先前答案的基礎上構建,您可以跟蹤日志。

kubectl logs -f deployment/app

以前提供的解決方案並不是那么理想。 kubernetes 團隊自己前段時間已經提供了一個解決方案,叫做 stern。

stern app1

它還匹配正則表達式,默認情況下執行 tail 和 -f (跟隨)。 一個很好的好處是,它也會向您顯示生成日志的 pod。

app1-12381266dad-3233c foobar log
app1-99348234asd-959cc foobar log2

獲取 linux 的 go-binary 或通過 brew 安裝 OSX。

https://kubernetes.io/blog/2016/10/tail-kubernetes-with-stern/

https://github.com/wercker/stern

在本例中,您可以替換<namespace><app-name>以在 Pod 中定義多個 Container 時獲取日志。

kubectl -n <namespace> logs -f deployment/<app-name> \
    --all-containers=true --since=10m

我使用這個簡單的腳本從部署的 pod 中獲取日志:

#!/usr/bin/env bash

DEPLOYMENT=$1

for p in $(kubectl get pods | grep ^${DEPLOYMENT}- | cut -f 1 -d ' '); do 
    echo --------------------------- 
    echo $p 
    echo --------------------------- 
    kubectl logs $p
done

劇本要點

用法:log_deployment.sh “部署名稱”。

然后腳本將顯示以該“部署名稱”開頭的所有 pod 的日志。

您可以從kubectl logs -h獲得幫助,並根據信息,

kubectl logs -f deployment/myapp -c myapp --tail 100

-c是容器名稱,-- --tail將顯示最新的 num 行,但這將選擇部署的一個 pod,而不是所有 pod。 這是你必須牢記的。

kubectl logs -l app=myapp -c myapp --tail 100

如果要顯示所有 pod 的日志,可以使用-l並指定一個標簽,但同時不會使用-f

一種選擇是通過 Fluentd/ElasticSearch 設置集群日志記錄,如https://kubernetes.io/docs/user-guide/logging/elasticsearch/中所述。 一旦日志在 ES 中,很容易在 Kibana 中應用過濾器來查看來自某些容器的日志。

您也可以通過服務名稱執行此操作。

首先,嘗試找到對應於同一服務的多個 pod 的各個 pod 的服務名稱。 kubectl get svc

接下來,運行以下命令以顯示來自每個容器的日志。

kubectl logs -f service/<service-name>

您可以根據自己的要求執行以下任一選項:

  1. kubectl -n my_namespace logs deployment/my_deployment --all-containers=true --since 10m
  2. for i in $(kubectl get pods -n "my_namespace" | sed 1d | cut -d" " -f1); do kubectl logs $i -n "my_namespace" "app_name" | grep -i "filter_string you want to" ; done

如果 Pod 的命名有意義,可以使用簡單的 Plain Old Bash:

keyword=nodejs
command="cat <("
for line in $(kubectl get pods | \
  grep $keyword | grep Running | awk '{print $1}'); do 
    command="$command (kubectl logs --tail=2 -f $line &) && "
  done
command="$command echo)"
eval $command

說明:循環運行名稱包含“nodejs”的 pod。 並行跟蹤它們中的每一個的日志(單個 & 號在后台運行),確保如果任何 pod 失敗,則整個命令退出(雙 & 號)。 將來自每個尾部命令的流分類為唯一的流。 需要 eval 來運行這個動態構建的命令。

@johan 的回答給了我一個單線的想法:

for i in $(kubectl get pods -n default |cut -d" " -f1); do kubectl logs $i -n default; done

這個答案試圖提供一個簡潔的例子和解釋。 為了獲得一組 pod 中所有容器的所有輸出,您必須使用標簽(選擇器),除非您打算執行一些額外的腳本。

kubectl logs \
--namespace my-namespace \
-l app=my-app-label \
--tail=-1 \
--timestamps=true \
--prefix=true \
--all-containers=true

此示例從標簽app=my-app-label定義的 pod 中的所有容器返回完整的快照日志。

可選選項

添加--timestamps=true--prefix=true標志可能會有所幫助,以便時間戳和日志源在輸出中可見,但它們不是必需的。

按資源分類的日志

如果指定了一個資源(例如部署)並且該部署具有多個 pod(例如 ReplicaSet),則只會返回一個 pod 日志。 這就是使用選擇器來識別 pod 的原因。

盡管指定了--all-containers ,但在寫入此響應時,使用kubectl v1.22.5 以服務或部署等資源為目標並沒有成功返回所有 pod 中所有容器的日志。 這就是必須使用選擇器的原因。

容器名稱

根據kubectl logs --help

打印 pod 或指定資源中的容器的日志。 如果 pod 只有一個容器,容器名稱是可選的。

這意味着如果有多個容器,您必須執行以下操作之一:

  • 讓命令為您選擇一個容器
  • 使用--all-containers=true選項

跟隨和尾隨

如果您像上面的示例一樣指定標簽,則tail將設置為 10,僅返回每個容器的最后 10 個日志。 要獲取所有日志,請將tail設置為-1

在示例中添加-f--follow以跟蹤日志。 如果您不需要所有日志,請更改--tail選項的值。 跟蹤日志時,您可能希望確保默認選項--max-log-requests=5就足夠了。 如果有 20 個容器增加--max-log-requests=20是必需的。

為我工作:

kubectl 日志 -n 命名空間 -l app=label -c 容器

我會考慮的另一個解決方案是使用K9S ,它是一個很棒的 kube 管理工具。

安裝后,使用非常簡單:

 k9s -n my-namespace --context the_context_name_in_kubeconfig

(如果 kubeconfig 不在默認位置,請添加KUBECONFIG=path/to/kubeconfig前綴)。

默認視圖會將所有 pod 列為列表:

在此處輸入圖像描述

我們可以通過輸入冒號將視圖更改為其他 Kube 控制器,例如副本集(要求復制控制器的問題,因此請注意它們已被棄用)、部署、cron 作業等:然后開始輸入所需的控制器 - 正如我們可以看到 K9S 提供的那樣為我們自動完成:

在此處輸入圖像描述

我們可以看到當前命名空間中的所有副本集:

在此處輸入圖像描述

我們可以通過單擊 enter 選擇所需的副本集,然后我們將看到與該副本集相關的所有 pod 的列表 - 然后我們可以按“l”查看每個 pod 的日志

因此,與stern的情況不同,我們仍然需要在每個 pod 上查看其日志,但我認為使用 K9S 非常方便 - 我們首先查看相關控制器的所有 pod,然后通過簡單的導航來調查每個 pod 的日志用enterlescape

我們剛剛推出了 Kubernetes 原生日志記錄工具,它可以從所有 pod(您指定的)收集日志並將日志發送到集中位置。

我希望它可以幫助任何登陸此頁面的人: https://github.com/parseablehq/collector

我使用這個命令。

kubectl -n <namespace> logs -f deployment/<app-name> --all-containers=true --since=10m

不確定這是否是新事物,但通過部署可以這樣做:

kubectl logs deployment/app1

暫無
暫無

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

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