Kubernetesレプリケーションコントローラのすべてのポッドからログを取得するにはどうすればよいですか?


123

実行kubectl logsすると、1つのKubernetesコンテナのstderr / stdoutが表示されます。

一連のポッド、できれば特定のレプリケーションコントローラーによって作成されたポッドの集合のstderr / stdoutを取得するにはどうすればよいですか?


セレクターを使用するときにテール引数を設定しないと、すべての
ポッドログ

回答:


175

ラベルが使える

kubectl logs -l app=elasticsearch

21
良い解決策であり、元の質問に答えるのに十分な可能性がありますが、それはうまくいきません。
ネストルウルキザ2017年

3
また、いいえ--all-namespaces
エリックウォーカー

それらのログの順序はどうなりますか?つまり、複数のポッドがあり、各ポッドには独自のログがあります。それで、すべてのログが表示される場合、それらはどの順序で表示され、特定のログ行のソースポッドをどのように特定しますか?
Shubham

6
これは-f現在機能しているようです(Kubernetes 1.12+ / kubectl1.12+以降)。また、@ Shubham-メッセージを受信順に表示します。ログ行にタグなどはありません。これは、迅速なデバッグのためのものです。あなたはより多くのログの詳細が必要な場合は、などEFK、SumoLogic、Datadog、のような中央ロギングシステムにログを出荷する必要があります
geerlingguy

1
とにかく、kubernetesダッシュボードを使用して同じことを行うことはありますか?
mchawre

70

kubetailこれを可能にすると呼ばれる小さなbashスクリプトを作成しました。たとえば、「app1」という名前のポッドのすべてのログをテールするには、次のようにします。

kubetail app1

ここでスクリプトを見つけることができます。


インストール: brew tap johanhaleby/kubetail && brew install kubetail --with-short-names詳細なドキュメント:kt -hすばらしい!
Khalil Gharbaoui

驚くばかり。いくつか質問があります。`` `1.異なるデプロイメントに属する複数のポッドのログを追跡できますか?「kt -l app = service1、app = service2」のようなもの2.すべてのファイルにemを書き込むにはどうすればよいですか?これを実行すると、「kt -l app = service1` >> filename.log」はポッド名のみを書き込みます。3.自動スケーリングのデプロイの場合にもテールしますか?`` `
Vasudev

19

Adrian Ngが示唆したように、ラベルを使用して複数のコンテナーからログを取得できます。

kubectl logs --selector app=yourappname

複数のコンテナを持つポッドがある場合、上記のコマンドは失敗し、コンテナ名を指定する必要があります。

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

注:使用可能なラベルを確認したい場合は、次のコマンドでそれらすべてをリストします。

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

...出力は次のようになります

map [app:yourappname controller-revision-hash:598302898 pod-template-generation:1]

一部のラベルは他のポッドと共有されない可能性があることに注意してください-「アプリ」を選択するのが最も簡単なようです


13

追加した場合、前の回答に基づいて-f、ログをテールすることができます。

kubectl logs -f deployment/app

10

以前に提供されたソリューションはそれほど最適ではありません。kubernetesチーム自体が、sternと呼ばれるソリューションを少し前に提供しています。

stern app1

これは正規表現にも一致し、デフォルトで末尾と-f(追跡)を実行します。すばらしい利点は、ログを生成したポッドも表示することです。

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

Linux用のgo-binaryを入手するか、OSX用のbrewを介してインストールします。

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

https://github.com/wercker/stern


6

この簡単なスクリプトを使用して、デプロイメントのポッドからログを取得します。

#!/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 "デプロイメント名"。

スクリプトは、その「デプロイメント名」で始まるすべてのポッドのログを表示します。


5

1つのオプションは、https: //kubernetes.io/docs/user-guide/logging/elasticsearch/で説明されているように、Fluentd / ElasticSearchを介してクラスターロギングを設定することです。ログがESにあると、Kibanaでフィルターを適用して特定のコンテナーからのログを表示するのは簡単です。


4

あなたkubectl logs -hは情報から、そして情報に応じて助けを得ることができます、

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

-cはコンテナ名であり--tail、最新のnum行が表示されますが、すべてのポッドではなく、デプロイメントのポッドが1つ選択されます。これはあなたが心に留めておかなければならないものです。

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

すべてのポッドのログを表示する場合は-l、ラベルを使用して指定できますが、同時に-f使用されません。


3

サービス名でこれを行うこともできます。

まず、同じサービスの複数のポッドに対応するそれぞれのポッドのサービス名を見つけます。 kubectl get svc

次に、次のコマンドを実行して、各コンテナーのログを表示します。

kubectl logs -f service/<service-name>

2

この例では、置き換えることができます<namespace>し、<app-name>ポッドで定義された複数のコンテナがある場合、ログを取得します。

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

1

ポッドに意味のある名前が付けられている場合、単純なプレーンオールドバッシュを使用できます。

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」を含む名前の実行中のポッドをループします。それぞれのログを並行してテールし(単一のアンパサンドがバックグラウンドで実行されます)、ポッドのいずれかが失敗した場合にコマンド全体が終了するようにします(二重のアンパサンド)。各テールコマンドからのストリームを一意のストリームにキャットします。この動的に作成されたコマンドを実行するには、Evalが必要です。


-1

このコマンドを使用します。

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

1
こんにちは!そのコマンドは問題を解決する可能性がありますが、これが問題を解決する方法と理由の説明含めると、投稿の品質が向上し、おそらく投票数が増えることになります。あなたが今尋ねている人だけでなく、あなたが将来の読者のための質問に答えていることを忘れないでください。回答を編集して説明を追加し、適用される制限と前提を示してください。
ブライアン

-4

これが新しいことかどうかはわかりませんが、デプロイメントでは次のように実行できます。

kubectl logs deployment/app1

8
デプロイによってログを取得すると、複製されたポッドの1つがランダムに選択されますが、すべてではありません。
Akhil Bojedla 2018

これは1つのポッドのみを選択するため、反対投票
Maximilian
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.