ウェブサイト検索

Sternを使用してKubernetesポッドのログをリアルタイムで監視する方法


Sternは、Kubernetesのリアルタイムログをターミナルにストリーミングするのを容易にするオープンソースのツールです。Sternを使用すると、複数のコンテナからのログを同時に監視でき、Pods内のアクティビティを統合的に表示できます。

なぜシュテルンを使うのか?

Kubectl は、ログのテールを行うための組み込み機能を提供しています。

kubectl logs

コマンド。この方法は簡単なケースではうまく機能することがありますが、複数のソースからのログを集約し、結果をさらにフィルタリングするためのサポートが不足しています。これにより、いくつかのポッドを監視する必要があるときや、冗長なデータで作業しているときに使用が面倒になることがあります。

Sternは、複数のPodとコンテナのためのファーストクラスのサポートを備えたKubernetesログ体験を提供します。ログストリーム内の各コンテナは独自の色分けがされており、前に流れる行を迅速に識別できます。Sternでは、正規表現から構築された複雑なクエリを使用して、含めるPodを選択できます。

タイムスタンプ、コンテナのステータス、およびKubernetesセレクターに基づいてログを選択するための統合フィルタリング機能もあります。この記事では、これらのすべての機能を使用してKubernetesのログへのアクセスを加速する方法を示します。

始めに

Sternは、プロジェクトのGitHubリリースページでWindows、macOS、Linux用の事前コンパイル済みバイナリとして配布されています。システムに適切なダウンロードを選択し、バイナリを追加してください。

PATH

. macOSのユーザーは、代わりにHomebrewを使用してインストールすることを選択できます。

brew install stern

Sternは、既存のKubernetes設定ファイルを使用してクラスターに接続します。デフォルトでは、読み込むことになります。

.kube/config

使用してください

--kubeconfig

フラグを設定する

KUEBCONFIG

このパスを変更する必要がある場合は、環境変数を使用してください。

Kubernetesのコンテキストもシームレスにサポートされています。追加する

--context

現在読み込まれている設定ファイル内で特定のコンテキストを指定するためのフラグ。あなたはまた使用することができます

--namespace

クラスタ内で名前空間を手動で選択するためのフラグ。Stern は、指定されたコンテキストと名前空間内のオブジェクトからのみログをテールします;

--all-namespaces

フラグを使用して、クラスター全体からログをストリーミングすることができます。

基本的な使用法

スターンの基本構文は引数を1つだけ必要とします:

stern api-server

コンテナから発生するログをストリーミングするためにPod名を指定します。しかし、この使用法はSternの真の力を隠しています。Pod名はポッドクエリの一例に過ぎません。

ポッドクエリ

SternはPodクエリを使用して、表示するログストリームを特定します。クエリは正規表現であるため、標準的な構文を使用してPodの高度な選択を組み立てることができます。

上記の stern api-server の例は、その名前に api-server を含む任意の Pod にマッチします。これを stern .*-server に変更すると、名前が -server で終わるすべての Pod からのログが表示されます。これにより、スタック内の複数のコンポーネントからの行を集約するログストリームを迅速に構築することができます。

クエリは選択されたポッドにのみ影響します。Sternは、これらのポッド内のすべてのコンテナから自動的にログを含めます。これは、受け入れ可能なコンテナ名を定義する別の正規表現を受け入れるオプションの--containerフラグを使用して制御できます。

stern .*-server --container .*-0

同様に、--exclude-container フラグと正規表現を使用して特定のコンテナを除外することができます:

stern .*-server --exclude-container .*-helper

ラベルセレクタもサポートされています。--selector フラグを設定して、ポッドに対して一致するラベルを定義する正規表現を指定します。これのデフォルトは .* であり、元のクエリに一致するすべてのポッドが含まれます。

stern .*-server --selector app-version=v1.*

コンテナの状態に基づくフィルタリング

Sternは実行中のコンテナからのログのみを表示するようにデフォルト設定されています。異なる状態のコンテナによって記録された行を取得するには、--container-stateフラグを使用してください。running、waiting、およびterminatedのパラメータをサポートしています。

Show logs from stopped containers

stern .*-server --container-state terminated

個別のログ行をフィルタリングする

適切なポッドとコンテナのセットを選択したら、実際のログデータのフィルタリングに移ることができます。Sternはいくつかのオプションを提供して、ノイズを減らし、意味のあるデータに集中できるようにします:

  • --since - 人間にとって読みやすい相対時間フレーム内に書かれたログを取得します。例えば、5m や 1h のように。
  • --tail - このオプションは、最初に多くのログ行を取得します。デフォルトは -1(制限なし)で、ライブのテール出力が始まる前に、ターミナルがすべての既存のログで埋め尽くされます。
  • --exclude - この正規表現に一致するログ行を除外します。このフラグは複数回使用でき、条件は論理的な「かつ」句として結合されます。

ここでは、Webサービスから最近の意味のあるログの限られた選択を取得する例を示します:

stern web-server --since 1h --tail 100 --exclude .*GET /robots.txt.*

出力テンプレートの使用

ステルンは通常、次の形式でログラインを提示します:

<namespace name> <pod name> <container name> <original log line>

このフォーマットは、--template フラグを使用してカスタマイズ可能です。Go テンプレート構文がサポートされており、フォーマッタ内で Namespace、PodName、ContainerName、および Message 変数にアクセスできます:

stern .*-server --template 'Namespace: {{.Namespace}} Pod: {{.PodName}} - {{.Message}}'

時々、余分なフォーマットなしでログ行を読みたいかもしれません。--output rawを使用すると、メッセージがそのまま表示され、Kubectlと似た出力が得られます。

別のオプションは、プログラムによる消費により適した形式でログデータを取得するための--output jsonです。これにより、message、namespace、podName、containerNameプロパティを持つJSONオブジェクトのストリームが生成されます。

Sternは、--timestampsフラグを含めると、各ログ行の先頭に自動的にタイムスタンプを追加できます。これはデフォルトではオフですが、多くの人気のあるサーバーがメッセージが送信される前に自分自身でこの情報を追加します。

最後に、Sternは、色付き出力の使用を強制または無効にするために使用できる--colorフラグをサポートしています。それはauto、never、またはalwaysを値として受け入れます。後者のオプションは、プログラムがシェルのTTYを正しく検出しない場合に便利です。

要約

Sternは、Podのログをより便利でアクセスしやすくするためのKubernetesの便利ツールです。色分けされた出力、複雑なセレクター、およびカスタマイズ可能な出力形式を使用して、複数のPodやコンテナを簡単に監視することができます。

Sternは、アクティブなデバッグや監視プロセスの一環としてリアルタイムでのログテールのために設計されています。長期的な集約、インデクシング、ストレージを探している場合は、通常、クラスタと専用の可観測性システムを統合するのが最良です。PrometheusやElastic Stackのようなプラットフォームは、Sternが表示するライブログストリームを補完するための履歴検査機能を提供します。

関連記事: