「kubectl logs」は、1つのKubernetesコンテナーのstderr/stdoutを示しています。一連のポッド(できれば特定のレプリケーションコントローラーによって作成されたもの)の集約されたstderr/stdoutを取得するにはどうすればよいですか?
ラベルを使用できます
kubectl logs -l app=elasticsearch
これを可能にするkubetail
という小さなbashスクリプトを作成しました。たとえば、「app1」という名前のポッドのすべてのログを追跡するには、次のようにします。
kubetail app1
スクリプトを見つけることができます こちら 。
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]
一部のラベルは他のポッドと共有されない場合があります-「アプリ」を選択するのが最も簡単なようです
1つのオプションは、 https://kubernetes.io/docs/user-guide/logging/elasticsearch/ で説明されているように、Fluentd/ElasticSearchを介してクラスターロギングをセットアップすることです。ログをESに入れると、Kibanaでフィルターを簡単に適用して、特定のコンテナーのログを表示できます。
この単純なスクリプトを使用して、展開のポッドからログを取得します。
#!/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「デプロイメント名」。
スクリプトは、その「展開名」で始まるすべてのポッドのログを表示します。
-f
を追加した場合、前の回答に基づいてログを追跡できます。
kubectl logs -f deployment/app
以前に提供されたソリューションは最適ではありません。 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/
ポッドに意味のある名前が付けられている場合、単純な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」を含む名前の実行中のポッドをループします。ポッドのいずれかが失敗した場合にコマンド全体が終了するように(二重アンパサンド)を確保するために、それぞれのログを並行して追跡します(単一アンパサンドがバックグラウンドで実行されます)。各テールコマンドからのストリームを一意のストリームにキャットします。この動的に構築されたコマンドを実行するには、評価が必要です。
これが新しいものであるかどうかはわかりませんが、デプロイメントでは次のようにすることができます。
kubectl logs deployment/app1
ヘルプは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
は使用されません。