2015-10-11 18 views
18

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

+0

これが可能かどうかを知りたいと思います。ドッカーの作成にはこの機能があり、非常に便利です。 – hamx0r

答えて

14

あなたはポッドが意味のある名前が付けられていた場合は1が、単純な旧来のバッシュを使用することができ、ラベル

kubectl logs -l app=elasticsearch 
+4

良い解決策と元の質問に答えるのに最も可能性が高いですが、それは尾ではありません: "エラー: f)またはセレクタ(-l)が許可されています」。 –

+1

また、 '--all-namespaces'もありません。 –

4

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

16

これを可能にするkubetailという小さなbashスクリプトを作成しました。たとえば、「APP1」を行うことができますという名前のポッドのための尾のすべてのログ:

kubetail app1 

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

+0

素晴らしい仕事、kuddos – cahen

+0

それは本当にクールなスクリプトです、あなたが私に尋ねるとkubectlの一部になっているはずです – Yanai

1

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

#!/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 

Gist of the script

使用法:log_deployment.sh "展開の名前"。

スクリプトは、その "deployment-name"で始まるすべてのポッドのログを表示します。

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

を使用することができます。それぞれのログを並行してテールします(単一のアンパサンドはバックグラウンドで実行されます)。ポッドのいずれかが失敗した場合、コマンド全体が終了するようにします(ダブルアンパサンド)。各テールコマンドからのストリームを一意のストリームにキャタリングする。この動的に構築されたコマンドを実行するには、Evalが必要です。

関連する問題