実行kubectl logs
すると、1つのKubernetesコンテナのstderr / stdoutが表示されます。
一連のポッド、できれば特定のレプリケーションコントローラーによって作成されたポッドの集合のstderr / stdoutを取得するにはどうすればよいですか?
実行kubectl logs
すると、1つのKubernetesコンテナのstderr / stdoutが表示されます。
一連のポッド、できれば特定のレプリケーションコントローラーによって作成されたポッドの集合のstderr / stdoutを取得するにはどうすればよいですか?
回答:
ラベルが使える
kubectl logs -l app=elasticsearch
--all-namespaces
。
-f
現在機能しているようです(Kubernetes 1.12+ / kubectl
1.12+以降)。また、@ Shubham-メッセージを受信順に表示します。ログ行にタグなどはありません。これは、迅速なデバッグのためのものです。あなたはより多くのログの詳細が必要な場合は、などEFK、SumoLogic、Datadog、のような中央ロギングシステムにログを出荷する必要があります
kubetail
これを可能にすると呼ばれる小さなbashスクリプトを作成しました。たとえば、「app1」という名前のポッドのすべてのログをテールするには、次のようにします。
kubetail app1
ここでスクリプトを見つけることができます。
brew tap johanhaleby/kubetail && brew install kubetail --with-short-names
詳細なドキュメント:kt -h
すばらしい!
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]
一部のラベルは他のポッドと共有されない可能性があることに注意してください-「アプリ」を選択するのが最も簡単なようです
以前に提供されたソリューションはそれほど最適ではありません。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/
この簡単なスクリプトを使用して、デプロイメントのポッドからログを取得します。
#!/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 "デプロイメント名"。
スクリプトは、その「デプロイメント名」で始まるすべてのポッドのログを表示します。
あなた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
使用されません。
ポッドに意味のある名前が付けられている場合、単純なプレーンオールドバッシュを使用できます。
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が必要です。
これが新しいことかどうかはわかりませんが、デプロイメントでは次のように実行できます。
kubectl logs deployment/app1