web-dev-qa-db-ja.com

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

「kubectl logs」は、1つのKubernetesコンテナーのstderr/stdoutを示しています。一連のポッド(できれば特定のレプリケーションコントローラーによって作成されたもの)の集約されたstderr/stdoutを取得するにはどうすればよいですか?

77
Torsten Bronger

ラベルを使用できます

kubectl logs -l app=elasticsearch
104
Adrian Ng

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

kubetail app1

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

56
Johan

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]

一部のラベルは他のポッドと共有されない場合があります-「アプリ」を選択するのが最も簡単なようです

9
Jean Spector

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

5
Thuc Nguyen

この単純なスクリプトを使用して、展開のポッドからログを取得します。

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

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

4
Martlark

-fを追加した場合、前の回答に基づいてログを追跡できます。

kubectl logs -f deployment/app
4
Ruben

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

stern app1

また、正規表現に一致し、デフォルトでtailおよび-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

2
vienna

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

1
Nestor Urquiza

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

kubectl logs deployment/app1
0
Rasmus Rømer

ヘルプは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は使用されません。

0
zimmer