このドキュメントでは、Alibaba Cloud Simple Log Service (SLS) とそのコレクターである LoongCollector を使用して、Kubernetes コンテナログを効率的に収集、処理、分析する方法について説明します。コア原則、主要なプロセス、選択ガイダンス、ベストプラクティスについて説明します。また、より詳細な操作ドキュメントへのリンクも提供します。
特徴
SLS は、Kubernetes コンテナーログ収集のために、以下の主要な機能を提供します。
複数のログソース
ログタイプ: 標準出力 (stdout)、標準エラー (stderr)、およびコンテナーテキストファイルログ。
きめ細かなコンテナーフィルタリング
名前空間、ポッド、コンテナ名、コンテナラベル、または環境変数によって、収集対象のコンテナを指定または除外できます。
複雑なログ処理
インテリジェントなメタデータ関連付け
コンテナーログをレポートする際、LoongCollector はコンテナー名、イメージ、ポッド、名前空間、環境変数などのメタデータを自動的に関連付けます。
信頼性の保証
チェックポイントメカニズムは、現在の収集位置を記録してログの整合性を確保します。
SLS は、コンテナーランタイムに基づいてコンテナーが停止したときのログを処理するためのさまざまな戦略を提供します。
制限
コンテナーランタイム: Docker と Containerd のみがサポートされています。
Docker:
docker.sock へのアクセス権限が必要です。
標準出力収集は、JSON ロギングドライバーのみをサポートします。
overlay および overlay2 ストレージドライバーのみがサポートされています。他のストレージドライバーの場合、ログディレクトリをボリュームとしてマウントする必要があります。
Containerd:
containerd.sock へのアクセス権限が必要です。
複数行ログの制限:
複数行のログエントリが出力遅延によって分割されるのを防ぐために、最後に収集されたログ行は一定期間キャッシュされます。デフォルトのキャッシュ時間は 3 秒です。この時間は
BeginLineTimeoutMsパラメーターを使用して変更できます。誤った分割を防ぐために、値は 1000 ミリ秒以上である必要があります。単一の標準出力ログの最大サイズ:
デフォルト: 524288 バイト (512 KB)。最大: 8388608 バイト (8 MB)。単一のログエントリが 524288 バイトを超える場合、LoongCollector コンテナーに
max_read_buffer_size環境変数を追加することで制限を変更できます。
収集プロセスの概要
クラスターにログオンし、ログソースを準備する: 収集のために標準出力ログまたはテキストファイルログを準備します。
LoongCollector コレクターをインストールする: SLS がログを収集および送信するために使用する LoongCollector をインストールします。
収集ルールと解析プラグインを構成する: ログ収集のルールを定義します。
ログのクエリと分析: 収集されたログをクエリして、ビジネスのステータスを分析します。
主要なプロセスの説明
ログソースとマウントポイントの要件 (重要)
標準出力ログの場合、LoongCollector はコンテナーのメタデータに基づいてファイルパスを自動的に識別します。
コンテナテキストファイルログの場合、LoongCollector はデフォルトでホストのルートディレクトリを自身の
/logtail_hostディレクトリにマウントするため、手動でのマウントは不要です。カスタムマウントポイントを使用する場合、次の要件を満たす必要があります:
コレクターのインストール
シナリオに基づいてデプロイメントモードを選択します:
デプロイメントモード: SLS は、DaemonSet または Sidecar モードでの LoongCollector のインストールをサポートしています。
DaemonSet デプロイメントモード: 一度構成すると、クラスター内の各ノードに LoongCollector が自動的にデプロイされます。これは、ほとんどのシナリオで推奨されるモードです。
DaemonSet モードを使用する場合、クラスターと SLS の関係に基づいてデプロイメントメソッドを選択します。
ACK クラスターを使用する場合、loongcollector-ds コンポーネントはすでに統合されています。インストールを完了するには、ACK コンソールでコンポーネントを有効にします。デフォルトでは、このメソッドは ACK クラスターを所有する Alibaba Cloud アカウントにバインドされ、ログはそのアカウントの SLS インスタンスに保存されます。詳細については、「LoongCollector (Kubernetes) をインストールする」をご参照ください。
ACK クラスターを使用しているが、組織構造、権限の分離、または統合監視などの理由で、別の Alibaba Cloud アカウントに属する SLS プロジェクトにログを収集する必要がある場合は、LoongCollector コンポーネントを手動でインストールする必要があります。次に、宛先アカウントの ID またはアクセス資格情報 (AccessKey) を使用してコンポーネントを構成し、関連付けを確立します。詳細については、「LoongCollector (Kubernetes) をインストールする」をご参照ください。
セルフマネージドクラスターを使用する場合、LoongCollector コンポーネントを手動でインストールする必要があります。次に、宛先アカウントの ID またはアクセス資格情報 (AccessKey) を使用してコンポーネントを構成し、関連付けを確立します。詳細については、「LoongCollector (Kubernetes) をインストールする」をご参照ください。
LoongCollector のインストールは、ログ収集の前提条件です。LoongCollector のインストールを含む完全な収集プロセスについては、「CRD を使用して Kubernetes クラスターからコンテナログを収集する (標準出力/ファイル)」をご参照ください。
Sidecar デプロイメントモード: LoongCollector Sidecar コンテナーは、アプリケーションコンテナーとともに各ポッドに注入されます。このモードは、より複雑なデプロイメントと O&M を伴います。このモードは、サーバーレスコンテナログ収集、単一ノード上のポッドのデータ量が DaemonSet 収集制限を超える場合、またはセキュアなコンテナランタイムを持つ Kubernetes からのログ収集に使用します。詳細については、「クラスターからテキストログを収集する (Sidecar)」をご参照ください。
収集ルールの構成
SLS は、収集構成ルールを定義する 2 つの方法を提供します:
構成方法 | 特徴 | シナリオ | 注意事項 |
| 本番クラスターおよび CI/CD 自動化をサポートするシナリオでは、CRD モードを使用します。 |
| |
| 構成を 1 つずつ関連付ける必要があるため、このメソッドは小規模なクラスター、一時的なデバッグ、および非本番環境に適しています。 |
主要な概念
Kubernetes: Kubernetes (K8s) は、オープンソースのコンテナーオーケストレーションプラットフォームです。コンテナー化されたアプリケーションのデプロイメント、スケーリング、管理を自動化します。これは、最新のクラウドネイティブアプリケーション開発および O&M のためのコアインフラストラクチャです。
標準出力、標準エラー、およびテキストファイルログ: 標準出力 (stdout) は、ビジネスログや操作レコードなど、プログラムが通常の操作中に表示する情報です。デフォルトでターミナルに出力され、コンテナエンジンによってキャプチャされて保存されます。標準エラー (stderr) は、例外スタックトレースや起動失敗の理由など、プログラムからのエラーまたは警告情報です。これもコンテナエンジンによってキャプチャされ、stdout と混在することがあります。テキストファイルログは、アプリケーションがファイルに書き込むログで、Nginx の
access.logやカスタムログファイルなどです。これらのログはコンテナの内部ファイルシステムに直接書き込まれ、コンテナが破棄されると破棄されます。ボリュームを使用して永続化できます。チェックポイントメカニズム: チェックポイントは、SLS がログを収集したファイル内の特定の位置を記録します。デフォルトでは、チェックポイントは
/tmp/logtail_checkpointに保存されます。このメカニズムは、LoongCollector が再起動したり、ノードがダウンしたりした場合のログ収集の信頼性を保証します。LoongCollector (Logtail): Alibaba Cloud が開発したパフォーマンス専有型ログコレクターです。Kubernetes での DaemonSet および Sidecar デプロイメントモードをサポートしています。LoongCollector は Logtail のアップグレードバージョンであり、すべての Logtail 機能と互換性があります。
Kubernetes CRD: カスタムリソース定義 (CRD) は、ユーザーがカスタムリソースを定義し、構成用のインスタンスを作成できる Kubernetes のメカニズムです。SLS が提供するカスタムリソースタイプは AliyunPipelineConfig です。
収集構成: ログタイプ、収集パス、有効なログのフィルタリング、ログコンテンツの解析、SLS でのストレージ場所など、ログ収集のルールを定義します。詳細については、「LoongCollector 収集構成とは」をご参照ください。
解析プラグイン: 収集構成のプロセッサープラグイン構成で使用されます。SLS は、ログコンテンツの構造化、分割、フィルタリング、マスキングを行うための多くの処理ユニットを提供します。正規表現、区切り文字、JSON、複数行など、さまざまな処理モードをサポートしています。
ログ収集の仕組み
ユーザーは kubectl を使用してカスタムリソース (CR) を作成し、収集ルールを定義します。
loongcollector-operator は、クラスター内の CR の変更を継続的にリッスンします。
CR の変更が検出されると、オペレーターはそれを特定の構成に変換し、SLS に送信します。
LoongCollector は定期的に SLS にハートビートを送信して、構成の更新を取得します。最新の収集構成をプルし、ホットリロードします。
loongcollector-ds は、最新の構成に基づいてログを収集し、構成されたエンドポイントを介して SLS に送信します。
DaemonSet モードの仕組み
クラスターの各ノードに LoongCollector がデプロイされ、そのノード上のすべてのコンテナからログを収集します。このモードは、O&M が簡単で、リソース消費が少なく、構成が柔軟であるという特徴があります。ただし、分離性は弱いです。
Sidecar モードの仕組み
LoongCollector Sidecar コンテナーは、アプリケーションコンテナーとともに各ポッドに注入されます。アプリケーションコンテナのログディレクトリは、emptyDir、hostPath、または永続ボリューム (PV) などの Kubernetes ボリュームメカニズムを使用して共有ボリュームとしてマウントされます。これにより、ログファイルはアプリケーションコンテナと Sidecar コンテナの両方のマウントパスに表示され、LoongCollector が直接読み取ることができます。このモードは、優れたマルチテナントデータ分離とパフォーマンスを特徴としています。ただし、より多くのリソースを消費し、構成とメンテナンスがより複雑になります。
コンテナー検出の仕組み
LoongCollector コンテナーが他のコンテナーからログを収集するには、どのコンテナーが実行されているかを検出して識別する必要があります。このプロセスはコンテナー検出と呼ばれます。
コンテナー検出フェーズでは、LoongCollector コンテナーは Kubernetes クラスターの kube-apiserver と通信しません。代わりに、ノード上のコンテナーランタイムデーモンと直接通信して、そのノード上のすべてのコンテナーに関する情報を取得します。これにより、クラスターの kube-apiserver に負荷がかかるのを回避します。
LoongCollector は、ホスト上の Docker Engine や Containerd などのコンテナランタイムの sock ファイルにアクセスすることで、コンテナのコンテキスト情報を取得できます。名前空間名、ポッド名、ポッドラベル、コンテナ環境変数などの条件に基づいて、ログ収集対象のコンテナを指定または除外することをサポートしています。
標準出力の収集
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になります。
複数行ログ認識の仕組み
各ログ行は、行の開始を定義するカスタム正規表現と照合されます。
一致が見つかった場合、その行は新しいログエントリの開始として扱われ、新しいログエントリの構築が開始されます。
一致が見つからない場合、その行は現在のログエントリの末尾に追加されます。
行の開始正規表現に一致する別の行が見つかると、現在のログエントリの構築が完了し、次のログエントリの構築が開始されます。
コンテナー停止時のログ処理
ランタイム | コンテナー破棄の遅延リスク | ログの整合性 | 最適化の提案 |
Docker | コンテナーが停止すると、LoongCollector はコンテナーのファイルハンドルを直ちに解放し、コンテナーが正常に終了できるようにします。 | ネットワーク遅延や高いリソース使用量のためにコンテナーが停止する前に収集が遅延した場合、停止前の一部のログが失われる可能性があります。 | ログ送信頻度を上げます ( |
Containerd | ネットワーク遅延や高いリソース使用量のために収集が遅延した場合、アプリケーションコンテナーが迅速に破棄されない可能性があります。 | コンテナーが停止すると、LoongCollector はすべてのログファイルの内容が送信されるまで、コンテナー内のファイルのハンドルを保持し続けます (ログファイルを開いたままにします)。 |
|
コンテナーメタデータの取得方法
コンテナメタデータを取得するために、LoongCollector は標準のコンテナランタイムインターフェイス (CRI) API に基づいてコンテナランタイムと直接対話します。これにより、LoongCollector は Kubernetes でさまざまなタイプのメタデータを取得し、収集中に Kubernetes メタデータ AutoTagging 機能を非侵入型で実装できます。ランタイムとの直接対話というこのメカニズムは、データ取得のリアルタイム性を高め、コンテナステータスの管理能力を向上させます。
Docker: LoongCollector は Docker Client を使用して Docker Daemon と通信し、コンテナメタデータを直接取得します。このメソッドにより、コンテナの詳細な監視と管理が可能になります。使用される主なインターフェイスは次のとおりです。
ContainerList: 現在実行中のコンテナのリストを取得して、現在のノードで実行されているコンテナを迅速に特定します。
ContainerInspect: 構成やステータスなどの重要な情報を含む、各コンテナーの詳細情報を提供します。
Events: コンテナの変更イベントをリアルタイムでリッスンして、コンテナのライフサイクルを動的に追跡し、関連する処理ロジックを迅速に更新します。
Docker Client を介してコンテナメタデータを取得する場合、次の情報が重要です。
LogPath: これは、ホスト上のコンテナーの標準出力ログファイルのストレージパスです。ログの収集と分析を容易にします。
GraphDriver.Data: これは、ホストノード上のコンテナの rootfs のパスを提供します。このパスは、コンテナのファイルシステムのストレージメソッドを理解するための鍵であり、エラー診断とパフォーマンスの最適化に役立ちます。
Containerd: CRI を通じて、LoongCollector は containerd および cri-o ランタイム環境のさまざまなシナリオを完全にサポートします。基盤となるランタイムが runc であろうと Kata Containers であろうと、コンテナメタデータを効率的に収集および取得できます。これにより、コンテナが実行されている環境に関係なく、正確で統一されたログデータ収集が保証され、リアルタイムでログデータを監視および分析するのに役立ちます。
CRI によって提供されるコンテナメタデータには、ホストノード上のコンテナの標準出力ログファイルのパスのみが含まれます。コンテナの Rootfs パスは直接取得できません。この問題を解決するには、次のいずれかのソリューションを使用できます。
ファイルパス検索: ホストのファイルシステムを検索して、コンテナの Rootfs パスを特定します。このメソッドでは、ホスト上のファイルディレクトリを走査し、コンテナ ID などのコンテナの一意の識別子を使用して関連付けと検索を行います。これにより、コンテナのファイルシステムを取得できます。この動的検索メカニズムは、パス情報の欠落によって引き起こされる問題を克服し、その後のログ収集と監視をサポートできます。
CRI をバイパスして containerd と直接対話する: 低レベルで containerd と直接通信して、より包括的で正確なコンテナ情報を取得します。これにより、LoongCollector は CRI の制限をバイパスして、コンテナの Rootfs パスやその他の重要なメタデータを取得できます。
ベストプラクティス
複数のクラスターまたは環境からのログの統一されたクエリと分析
たとえば、テスト環境や本番環境など、異なる環境のクラスターからのログを統一的にクエリおよび分析するには、次の 3 つのメソッドのいずれかを使用できます。
データを収集するときは、同じ Logstore に保存します。コンソールを使用して Kubernetes クラスターからコンテナログを収集する (標準出力/ファイル) で説明されているメソッドを使用して、環境を区別するためのタグを追加することをお勧めします。統一されたクエリを実行する必要がある場合は、その Logstore 内のログを直接クエリして分析できます。
データを収集するときは、異なる Logstore または異なるリージョンのプロジェクトに収集します。統一されたクエリと分析を実行する必要がある場合は、StoreView 仮想リソースを作成して、クエリのために複数の Logstore を関連付けることができます。このメソッドでは追加のストレージコストはかかりませんが、データのクエリのみが可能で、変更はできません。また、監視のためのアラート設定もサポートしていません。このメソッドを使用する場合、タグフィールドを使用して、ログがどの Logstore から来たかを判断できます。
(推奨) データを収集するときは、異なる Logstore または異なるリージョンのプロジェクトに収集します。統一されたクエリと分析を実行する必要がある場合は、データ変換を使用して選択したデータをコピーし、指定した Logstore に保存できます。このメソッドを使用すると、保存する前に選択したデータを解析および処理でき、監視のためのアラート設定もサポートされます。ただし、この機能には追加料金が発生します。
単一の構成で異なるソースからログを収集する
現在、単一の収集構成では複数のソースをサポートしていません。異なるソースからログを収集するには、複数の収集構成を構成する必要があります。
きめ細かな収集とマルチテナンシーの隔離
マルチテナントシナリオでは、異なる収集構成を構成して、分離のために異なるプロジェクトにデータを収集できます。異なるプロジェクト間でデータを直接アクセスすることはできません。また、セキュリティ分離要件を満たすために、異なるプロジェクトに異なるアクセス権限を構成することもできます。
自動化された O&M と CI/CD の統合
CRD メソッドを使用して、収集構成を GitOps または Infrastructure as Code (IaC) ワークフローに組み込むことができます。これにより、ログ収集のバッチ、自動化、および追跡可能な管理が可能になります。