本ガイドでは、Alibaba Cloud Simple Log Service (SLS) およびその収集エージェント LoongCollector を使用して、Kubernetes コンテナからログを効率的に収集・処理・分析する方法について説明します。基本原則、主要なワークフロー、選択に役立つガイダンス、およびベストプラクティスを解説し、具体的な運用ガイドの基盤を提供します。
特徴
Simple Log Service は、Kubernetes コンテナログの収集に対して以下のコア機能を提供します:
-
マルチソースログ対応
-
コンテナからの標準出力 (stdout)、標準エラー (stderr)、テキストファイルログなど、さまざまなログタイプをサポートします。
-
-
細かいコンテナフィルタリング
-
名前空間名、Pod 名、コンテナ名、コンテナラベル、環境変数に基づいて、収集対象のコンテナを含める/除外できます。
-
-
高度なログ処理
-
インテリジェントなメタデータ関連付け
-
コンテナログへのメタデータの自動関連付け:コンテナ名、イメージ、Pod、名前空間、環境変数などを含むメタデータを自動的に付与します。
-
-
信頼性
-
チェックポイント機構により、現在の収集位置を記録し、ログの整合性を保証します。
-
コンテナ停止時のログ処理:さまざまなコンテナランタイムに対応した異なる戦略を提供します。
-
制限事項
-
コンテナランタイム:Docker および Containerd のみをサポートします。
Docker:
-
docker.sock へのアクセス権限が必要です。
-
標準出力の収集には、
json-fileロギングドライバーのみがサポートされます。 -
overlayおよびoverlay2ストレージドライバーのみがサポートされます。他のストレージドライバーを使用する場合は、ボリュームを用いてログディレクトリをマウントする必要があります。
Containerd:
-
containerd.sock へのアクセス権限が必要です。
-
-
マルチラインログの制限:
出力遅延によるマルチラインログの分割を防ぐため、最後に収集された行は短時間バッファーされます。デフォルトのバッファータイムは 3 秒です。
BeginLineTimeoutMsパラメーターを設定することで調整可能です。誤った解析を回避するため、値は最低でも 1,000 ミリ秒以上である必要があります。 -
標準出力:
単一ログエントリのデフォルト最大サイズは 524,288 バイト(512 KB)であり、上限は 8,388,608 バイト(8 MB)です。単一ログエントリが 524,288 バイトを超える場合、LoongCollector コンテナの
max_read_buffer_size環境変数を設定することで、この制限を引き上げることができます。重要標準出力と標準エラーの収集を同時に有効化しないことを推奨します。これにより、ログエントリが不適切に混在する可能性があります。
収集ワークフローの概要
-
クラスターへのログインとログソースの準備:収集対象の標準出力ログまたはテキストファイルログを準備します。
-
LoongCollector 収集エージェントのインストール:LoongCollector を使用してログを収集・転送し、Simple Log Service に送信します。
-
収集ルールおよび解析プラグインの設定:ログ収集のルールを定義します。
-
ログの照会および分析:収集されたログを照会し、サービスのモニタリングを行います。
主要プロセス
ログソースおよびマウントポイントの要件
-
標準出力ログの場合、LoongCollector はコンテナメタデータに基づき、ログファイルパスを自動的に検出します。
-
コンテナのテキストファイルログの場合、LoongCollector はデフォルトでホストのルートディレクトリを自身の
/logtail_hostディレクトリにマウントするため、通常は手動でのマウントは不要です。カスタムマウントポイントを使用する必要がある場合は、以下の要件を満たす必要があります:
収集エージェントのインストール
ユースケースに応じてデプロイモードを選択してください。
デプロイモード:Simple Log Service では、DaemonSet モードまたはサイドカーモードによる LoongCollector のインストールがサポートされています。
-
DaemonSet デプロイモード:一度の設定後、クラスター内の各ノードに LoongCollector エージェントが自動的にデプロイされます。ほとんどのシナリオに適しています。
-
DaemonSet モードでは、クラスターと Simple Log Service の関係に応じて、適切なデプロイ方法が異なります。
-
Container Service for Kubernetes (ACK) クラスターの場合、loongcollector-ds コンポーネントは事前に統合されています。ACK コンソールで該当コンポーネントを有効化するだけでインストールが完了します。デフォルトでは、この方法では収集エージェントが ACK クラスターを所有する Alibaba Cloud アカウントに紐付けられ、ログはそのアカウントの Simple Log Service Project に格納されます。詳細については、「インストールおよび設定」をご参照ください。
-
ACK クラスターを使用しているものの、組織構造、権限分離、または集中監視などの理由により、別の Alibaba Cloud アカウントの Simple Log Service Project へログを収集する必要がある場合は、LoongCollector コンポーネントを手動でインストールする必要があります。宛先アカウントの Alibaba Cloud アカウント ID または AccessKey を用いて設定し、宛先アカウントに接続します。詳細については、「インストールおよび設定」をご参照ください。
-
セルフマネージドクラスターを使用している場合は、LoongCollector コンポーネントを手動でインストールし、宛先アカウントの Alibaba Cloud アカウント ID または AccessKey を用いて設定し、宛先アカウントに接続する必要があります。詳細については、「インストールおよび設定」をご参照ください。
ログ収集の前提条件として、LoongCollector のインストールが必要です。インストール手順を含む完全な手順については、「CRD を使用した Kubernetes クラスターからのコンテナログ収集(標準出力/ファイル)」をご参照ください。
-
-
-
サイドカーデプロイモード:各アプリケーション Pod に LoongCollector サイドカーコンテナが挿入されます。このモードはデプロイおよび保守がより複雑です。サーバーレスコンテナのログ収集、Pod のデータ量が DaemonSet の収集能力を大幅に上回るノード、またはセキュアなコンテナランタイムを使用する Kubernetes 環境でのログ収集にご使用ください。詳細については、「Kubernetes Pod テキストログの収集(サイドカーモード)」をご参照ください。
収集ルール
Simple Log Service では、収集ルールを定義するための以下の 2 つの方法を提供しています:
|
設定方法 |
特徴 |
ユースケース |
備考 |
|
本番クラスターおよび CI/CD 自動化を活用する環境に推奨します。 |
|
|
|
小規模クラスター、一時的なデバッグ、または非本番環境に適しています。大規模クラスターでは、設定を個別に紐付ける必要があるためです。 |
基本概念
-
Kubernetes:Kubernetes(K8s)は、コンテナ化アプリケーションのデプロイ、スケーリング、および管理を自動化するオープンソースのコンテナオーケストレーションプラットフォームです。現代のクラウドネイティブアプリケーションの開発および運用保守の基盤となるインフラストラクチャです。
-
標準出力、標準エラー、およびテキストファイルログ:標準出力(stdout)は、プログラムの通常実行中に出力される情報であり、ビジネスログや運用記録などが該当します。デフォルトでは端末に出力され、コンテナエンジンによってキャプチャされます。標準エラー(stderr)は、例外スタックトレースや起動失敗など、エラーまたは警告に関する情報であり、コンテナエンジンによってキャプチャされ、stdout と混在する可能性があります。テキストファイルログは、Nginx の
access.logやカスタムログファイルなど、アプリケーションがファイルに書き込むログです。これらのログはコンテナのファイルシステムに直接書き込まれますが、コンテナが破棄されると削除されます。ただし、ボリュームを使用することで永続化できます。 -
チェックポイント機構:チェックポイントは、Simple Log Service がログを収集したファイル内の正確な位置を記録します。デフォルトでは、
/tmp/logtail_checkpointに保存されます。これにより、LoongCollector の再起動やノード障害などの中断後に、信頼性の高いログ収集が可能になります。 -
LoongCollector(Logtail):LoongCollector は、Alibaba Cloud が開発したパフォーマンス専有型のログ収集エージェントです。Kubernetes における DaemonSet モードおよびサイドカーモードの両方をサポートします。LoongCollector は Logtail の後継製品であり、完全な下位互換性を備えています。
-
Kubernetes CRD:CRD(CustomResourceDefinition)は、Kubernetes が提供するカスタムリソースを定義・作成するための仕組みです。Simple Log Service が提供するカスタムリソースタイプは AliyunPipelineConfig です。
-
収集設定:収集設定は、収集対象のログタイプ、収集パス、ログフィルタリング、ログコンテンツの解析、Simple Log Service 内の保存先を定義します。詳細については、「収集設定とは?」をご参照ください。
-
解析プラグイン:解析プラグインは、収集設定の処理プラグイン構成内で使用される処理ユニットであり、ログコンテンツの構造化、分割、フィルタリング、または機密情報除去に使用されます。Simple Log Service では、正規表現、区切り文字、JSON、マルチラインなど、複数の処理モードをサポートしています。
仕組み
-
ユーザーが
kubectlを使用してカスタムリソース(CR)を作成し、収集ルールを定義します。 -
loongcollector-operatorがクラスター内の CR の変更を継続的に監視します。 -
変更が検出されると、Operator が CR を LoongCollector 構成に変換し、Simple Log Service に適用します。
-
LoongCollector エージェントは定期的に Simple Log Service にハートビートを送信し、構成更新をフェッチし、最新の収集設定を取得して動的に適用します。
-
loongcollector-dsエージェントが新しい構成に従ってログを収集し、設定済みのエンドポイント経由で SLS に送信します。
DaemonSet モード
クラスター内の各ノードに LoongCollector エージェントがデプロイされ、そのノード上のすべてのコンテナからログを収集します。このモードは操作がシンプルで、リソース消費が少なく、柔軟な構成が可能ですが、テナント間の隔離性は弱くなります。
サイドカーモード
各 Pod に、アプリケーションコンテナとともに LoongCollector サイドカーコンテナが挿入されます。アプリケーションコンテナのログディレクトリは、emptyDir、hostPath、または PVC などの Kubernetes ボリューム機構を用いて共有ボリュームとしてマウントされます。これにより、ログファイルがアプリケーションコンテナとサイドカーコンテナの両方からアクセス可能となり、LoongCollector が直接読み取ることができます。このモードは、マルチテナント環境での強固な隔離性と高いパフォーマンスを提供しますが、リソース消費が多く、構成および保守がより複雑です。
コンテナの検出
他のコンテナのログを収集するには、まず LoongCollector コンテナがノード上で実行中のコンテナを特定する必要があります。このプロセスを「コンテナの検出」といいます。
-
コンテナの検出中、LoongCollector コンテナは、Kubernetes クラスターの kube-apiserver を経由せずに、ノード上のコンテナランタイムデーモンと直接通信します。これにより、クラスターの kube-apiserver に追加の負荷をかけることなく、現在のノード上のすべてのコンテナに関する情報を取得できます。
-
LoongCollector は、ホスト上のコンテナランタイム(Docker または Containerd)のソケットにアクセスしてコンテナコンテキストを取得します。名前空間名、Pod 名、Pod ラベル、コンテナ環境変数などの条件に基づいて、ログ収集対象のコンテナを含める/除外できます。
標準出力の収集
LoongCollector は、コンテナメタデータに基づき、Docker や Containerd など、異なるコンテナランタイムに適した正しい API またはロギングドライバーを自動的に識別します。手動設定は不要です。すべてのコンテナの標準出力ストリームを、コンテナ内部のファイルシステムにアクセスせずに直接読み取ります。
コンテナの標準出力を収集する際、LoongCollector は収集進捗を定期的にチェックポイントファイルに保存します。LoongCollector が停止・再起動した場合、最後に保存された位置から収集を再開します。
コンテナテキストファイルログの収集
-
Kubernetes コンテナのファイルシステムは隔離されているため、収集エージェントは他のコンテナ内のファイルに直接アクセスできません。しかし、コンテナのファイルシステムはホストのファイルシステム上に存在するため、LoongCollector はホストのルートファイルシステムをマウントできます。これにより、ホスト上の任意のファイルにアクセスでき、アプリケーションコンテナのファイルシステム内のファイルに間接的にアクセスすることが可能になります。
-
デフォルトでは、LoongCollector はホストのルートファイルシステムを自身の
/logtail_hostディレクトリにマウントします。通常は手動でのマウントは不要です。たとえば、コンテナ内でのログファイルのパスが/log/app.logであり、ホスト上でのマップ先パスが/var/lib/docker/containers/<container-id>/log/app.logの場合、LoongCollector が実際に使用する収集パスは/logtail_host/var/lib/docker/containers/<container-id>/log/app.logとなります。
マルチラインログの解析
LoongCollector は、ユーザー定義の正規表現を使用してログ行の開始をマッチします。
-
マッチ成功:その行は新しいログエントリの開始として扱われます。
-
マッチ失敗:その行は現在のログエントリに追加されます。
別の行が行頭正規表現にマッチすると、現在のログエントリが完了し、新しいログエントリが始まります。
コンテナ停止時のログ処理
|
ランタイム |
破棄遅延リスク |
ログの整合性 |
最適化 |
|
Docker |
コンテナが停止すると、LoongCollector は即座にコンテナのファイルハンドルを解放し、コンテナが正常に終了できるようにします。 |
ネットワーク遅延や高リソース使用率などにより、コンテナ停止前の収集が遅延した場合、停止直前に生成された一部のログが失われる可能性があります。 |
ログ送信頻度を増加させる( |
|
Containerd |
ネットワーク遅延や高リソース使用率などにより収集が遅延した場合、アプリケーションコンテナが適時に破棄されない可能性があります。 |
コンテナが停止すると、LoongCollector はコンテナのファイルハンドルを保持し続け、ログファイルを開いたままにし、すべての内容が送信されるまで待機します。 |
|
コンテナメタデータの取得
LoongCollector は、標準の CRI(Container Runtime Interface)API を介してコンテナランタイムと直接通信し、Kubernetes メタデータを取得します。これにより、収集時に非侵入型かつ自動的な Kubernetes メタデータのタグ付けが可能になります。この直接通信により、リアルタイムのデータ取得が実現します。
-
Docker:LoongCollector は Docker Client を使用して Docker デーモンと通信し、コンテナメタデータを直接取得します。これにより、詳細なモニタリングおよび管理が可能になります。主に使用される API は以下のとおりです:
-
ContainerList:実行中のコンテナの一覧を取得し、ノード上のアクティブなコンテナの概要を提供します。
-
ContainerInspect:各コンテナの詳細情報を提供し、構成およびステータスを含みます。
-
Events:コンテナイベントをリアルタイムでリッスンし、コンテナライフサイクルの動的追跡を可能にします。
Docker Client を通じてコンテナメタデータを取得する際に特に重要な情報は以下のとおりです:
-
LogPath:コンテナの標準出力ログファイルがホスト上に保存されるパス。ログ収集および分析に不可欠です。
-
GraphDriver.Data:コンテナの rootfs がホスト上に存在するパス。コンテナのファイルシステムストレージを理解するために重要であり、トラブルシューティングおよびパフォーマンス最適化に役立ちます。
-
-
Containerd:CRI を使用することで、LoongCollector は
containerdおよび CRI-O 環境をサポートします。これにより、runcや Kata Containers などのさまざまな基盤ランタイムからメタデータを収集でき、一貫したデータ収集が保証されます。-
CRI が提供するコンテナメタデータには、ホスト上でのコンテナ標準出力ログファイルのパスが含まれますが、コンテナの rootfs パスは直接提供されません。このパスを特定するための方法は以下のとおりです:
-
ファイルパス検索:LoongCollector は、コンテナ ID などの一意の識別子を用いて、ホストのファイルシステム上でコンテナの rootfs パスを検索します。
-
containerd との直接通信:より包括的な情報を得るために、LoongCollector は CRI をバイパスし、より低レベルで containerd と直接通信できます。これにより、CRI では取得できないコンテナの rootfs パスやその他の重要なメタデータを取得できます。
-
-
ベストプラクティス
環境横断の統一照会
テスト環境および本番環境など、異なる環境からのログを統一的に照会・分析するには、以下の 3 つの方法のいずれかをご利用ください:
-
すべての環境のデータを同一の LogStore に格納します。環境を区別するためのタグを追加することを推奨します。「コンソールを使用したクラスターからのコンテナログ収集(標準出力/ファイル)」の手順に従ってください。その後、その LogStore 内で全ログを直接照会・分析できます。
-
データを異なる LogStore または異なるリージョンの Project に収集します。統一照会を行う必要がある場合、StoreView を作成して複数の LogStore を横断して照会します。この方法は追加のストレージコストは発生しませんが、読み取り専用であり、アラート機能はサポートされません。各ログエントリの出所 LogStore を識別するために、
tagフィールドを使用できます。 -
(推奨)データを異なる LogStore または Project に収集します。統一分析を行う必要がある場合、データ処理 を使用して、選択したデータを中央集約型の LogStore にコピー・転送します。この方法では、保存前にデータの解析および処理が可能であり、アラート機能もサポートされますが、有料機能です。
複数ソースからのログ収集
単一の収集設定では、1 つのソースのみを対象にすることができます。複数のソースからログを収集するには、それぞれのソースに対して個別の収集設定を作成する必要があります。
細かい収集およびマルチテナント隔離
マルチテナント環境では、異なる収集設定を使用して、データを分離された Project に送信できます。異なる Project のデータは相互に隔離されており、一方から他方へのアクセスはできません。各 Project に対して異なるアクセス権限を設定することで、セキュリティおよび隔離要件を満たすことができます。
自動化運用および CI/CD 統合
CRD メソッドを用いることで、収集設定を GitOps または Infrastructure as Code(IaC)ワークフローに組み込むことができます。これにより、ログ収集のバッチ処理、自動化、およびトレーサビリティのある管理が可能になります。