[英]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
以便:
您可以使用 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/
在本例中,您可以替換<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>
您可以根據自己的要求執行以下任一選項:
kubectl -n my_namespace logs deployment/my_deployment --all-containers=true --since 10m
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 的日志用enter
, l
和escape
。
我們剛剛推出了 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.