本番環境の Kubernetes ではログ記録はどのように実装されていますか?

本番環境の Kubernetes ではログ記録はどのように実装されていますか?

[[435371]]

[51CTO.com クイック翻訳]独自のクラスター レベルのログ記録のために、実稼働 Kubernetes クラスターのスケーラブルなログ記録パターンを理解する必要があります。

従来、モノリシック アーキテクチャでは、ログはベア メタルまたは仮想マシンに直接保存され、サーバー ディスクから外に出ることはなく、運用チームが必要に応じて各ディスクのログをチェックしていました。

これはオンプレミスのサーバーではうまく機能しますが、クラウド内のログは一時的なものです。ますます多くの企業がコンテナ上でサービスを実行し、Kubernetes を使用してデプロイメントを調整するようになると、ログをサーバーに保存する必要がなくなり、ログ管理戦略の実装が重要になります。

ログはアプリケーションをデバッグおよび監視するための効果的な方法であり、ポッドまたはノードに障害が発生したときにクエリおよび分析できるように、別のバックエンドに保存する必要があります。これらの独立したバックエンドには、Elasticsearch、Google Cloud Platform の Stackdriver、AWS の Cloudwatch などのシステムが含まれます。

クラスターのログをストレージ バックエンドに保存することを、クラスター レベルのログ記録と呼びます。この記事では、企業が独自の Kubernetes クラスターにこのアプローチを実装する方法について説明します。

ログアーキテクチャ

Kubernetes クラスターには、アプリケーション コンポーネントとシステム コンポーネントという 2 つの主なログ ソースがあります。

アプリケーションは Kubernetes クラスター内のコンテナとして実行されます。コンテナ ランタイムはアプリケーションのログを取得する役割を担い、Docker はこれらのログを stdout (標準出力ストリーム) と stderr (標準入力ストリーム) にリダイレクトします。 Kubernetes クラスターでは、両方のストリームがクラスター ノード上の JSON ファイルに書き込まれます。

これらのコンテナ ログは、次のコマンドを使用していつでも取得できます。

  1. kubectl ログ ポッド名

ログのもう 1 つのソースはシステム コンポーネントです。一部のシステム コンポーネント (kube-scheduler および kube-proxy) はコンテナーとして実行され、アプリケーションと同じログ記録原則に従います。

その他のシステム コンポーネント (kubelet およびコンテナ ランタイム自体) はネイティブ サービスとして実行されます。マシン上で systemd が使用可能な場合、コンポーネントはログを journald に書き込みます。それ以外の場合は、.log ファイルを /var/log ディレクトリに書き込みます。

アプリケーションとクラスターのどのコンポーネントがログを生成し、どこに保存されるかを理解したところで、これらのログをさまざまなストレージ システムにオフロードするための一般的なパターンを見てみましょう。

ログモード

ログを収集するための最も一般的な 2 つのパターンは、DaemonSet パターンと Sidecar パターンです。

(1)デーモンセットモード

DaemonSet モードでは、ログ エージェントは Kubernetes の DaemonSet リソースを通じて Pod としてデプロイされます。 DaemonSet をデプロイすると、クラスター内の各ノードにログ エージェントを実行する Pod が存在するようになります。ログ エージェントは、/var/logs ディレクトリからログを読み取り、ストレージ バックエンドに送信するように構成されています。

(2)サイドカーモード

サイドカー パターンでは、同じ Pod 内の各アプリケーション コンテナーで専用のコンテナーが実行されます。サイドカー モードには、ストリーミング サイドカーとログ エージェント サイドカーの 2 種類があります。

ストリーミング サイドカーは、stdout/stderr ストリームではなくファイルにログを書き込むアプリケーション、または非標準形式でログを書き込むアプリケーションを実行する場合に使用されます。この場合、ストリーミング サイドカー コンテナーを使用して、ファイルからのログを独自の stdout/stderr ストリームに公開し、Kubernetes 自体が stdout/stderr ストリームを取得できるようになります。

ストリーミング サイドカーは、ログ メッセージを標準のログ形式に変換することで、ログ構造にパリティをもたらすこともできます。

もう 1 つのアプローチは、ログ プロキシ サイドカーです。これは、ログをストレージ バックエンドに送信します。各ポッドには Fluentd や Filebeat などのログエージェントが含まれており、アプリケーションコンテナからログをキャプチャしてストレージバックエンドに直接送信します。

DaemonSet と Sidecar の利点と欠点

DaemonSet と Sidecar のアプローチについて説明したので、それぞれのアプローチの長所と短所を見てみましょう。

(1)デーモンセット(ノードレベル)

アドバンテージ:

  • ノード レベルのログ記録は、既存のファイルベースのログ記録に結び付けられるため実装が簡単で、各ノードで実行されるコンテナーの数が少ないため、サイドカー アプローチよりもリソースを消費しません。
  • ログ ファイルは kubelet で使用でき、ログ ファイルの内容が返されるため、 kubectl コマンドを介してログをデバッグに使用できます。

欠点:

  • さまざまなログ構造や、ストリームではなくログ ファイルに書き込むアプリケーションをサポートする柔軟性が低くなります。パリティを実現するため、またはストレージ バックエンドの違いを処理するために、アプリケーション ログ構造を変更する必要があります。
  • ログはノード ディスク上に JSON ファイルとして保存されるため、永続的に保存されるわけではありません。古いログをリサイクルするには、ログローテーションメカニズムが必要です。コンテナ ランタイム インターフェイスを使用している場合は、kubelet がログのローテーションを処理するため、明示的なソリューションを実装する必要はありません。

(2)サイドカー

アドバンテージ:

  • Sidecar はアプリケーション コンテナーごとに柔軟にカスタマイズできます。たとえば、アプリケーションが stdout/stderr に書き込まなかったり、ログ記録形式が異なっていたりする場合があります。このような場合、サイドカー コンテナーはシステムにパリティをもたらすことができます。
  • ストリーミング ログ エージェント サイドカーを使用していない場合は、ノード ディスクにログが保存されないため、ログをローテーションする必要はありません。

欠点:

  • ノードレベルのポッドと比較すると、各アプリケーション コンテナに対してサイドカーを実行すると、大量のリソースが消費されます。
  • 各デプロイメントにサイドカーを追加すると、複雑さが増します。
  • ログをファイルに書き込むアプリケーションにストリーミング サイドカーを使用する場合、エントリが重複するため、同じログを保存するために 2 倍のストレージ領域が使用されます。
  • ストリーミング ログ エージェント サイドカーを使用しない場合、kubectl 経由でログにアクセスすることはできません。これは、kubelet が JSON ログにアクセスできなくなったためです。
  • ログエージェント Sidecar を使用する場合は、ノードレベルのエージェントも必要です。そうしないと、システム コンポーネント ログを収集できません。

理論を実践する

Kubernetes クラスターにログインするための可能なパターンを理解したので、ログを生成する仮想コンテナをデプロイし、Kubernetes リソースを作成して、上で説明したログ記録パターンを実装することで、それを実践できます。

この例では、ログエージェントとして Fluentd を使用し、ログバックエンド用に Elasticsearch をインストールし、視覚化のために Kibana をインストールします。 Elasticsearch と Kibana は、Helm チャートを使用して同じクラスターにインストールされます。ただし、ストレージ バックエンドは同じクラスター上に配置しないでください。これはデモンストレーション目的のみです。 Fluentd はプラグ可能なアーキテクチャを採用しているため、さまざまなシンクをサポートします。このため、Elasticsearch バックエンドは、Stackdriver や Cloudwatch などのクラウドネイティブ ソリューションに置き換えることができます。

(1)ElasticsearchとKibanaをインストールする

こちらにある公式 Helm チャート (Elasticsearch、Kibana) を使用して Elasticsearch と Kibana をデプロイします。 Helm 経由でインストールするには、パス上に Helm バイナリが必要ですが、Helm のインストールはこの記事の範囲外です。

まず、Helm リポジトリを追加してみましょう。

プロパティファイル

1 つの helm リポジトリに elastic を追加します https://helm.elastic.co

次に、Elasticsearch と Kibana チャートをクラスターにインストールします。

プロパティファイル

1 ヘルムインストール elasticsearch elastic/elasticsearch

2 Helm で Kibana Elastic/Kibana をインストールします

これにより、最新バージョンの Elasticsearch と Kibana がクラスターにインストールされ、ログのストレージ バックエンドとして使用できるようになります。

チャートではデフォルト値が使用されていますが、本番環境にインストールする際には、必要に応じて任意のパラメータを変更できます。

(2)デーモンセット

ここでは、Fluentd は、個別のサービス アカウントと ClusterRole を作成せずに DaemonSet としてデプロイされます。ただし、実稼働環境では、アクセスが制限された別のサービス アカウントを使用して Fluentd ポッドを実行する必要があります。

Fluentd は、次の Kubernetes リソースを使用して DaemonSet としてデプロイできます。

行く

  1. API バージョン: extensions/v1beta1
  2. 種類: DaemonSet
  3. メタデータ:
  4. 名前: fluentd
  5. 名前空間: kube-system
  6. ラベル:
  7. k8s-app: fluentd-logger
  8. 仕様:
  9. テンプレート:
  10. メタデータ:
  11. ラベル:
  12. k8s-app: fluentd-logger
  13. 仕様:
  14. コンテナ:
  15. -名前: fluentd
  16. イメージ: fluent/fluentd-kubernetes-daemonset:elasticsearch
  17. 環境:
  18. -名前: FLUENT\_ELASTICSEARCH\_HOST
  19. 値: "elasticsearch-master"  
  20. -名前: FLUENT\_ELASTICSEARCH\_PORT
  21. 値: "9200"  
  22. ボリュームマウント:
  23. -名前: varlog
  24. マウントパス: /var/log
  25. -名前: dockerlogs
  26. マウントパス: /var/lib/docker/containers
  27. 読み取り専用: true  
  28. ボリューム:
  29. -名前: varlog
  30. ホストパス:
  31. パス: /var/log
  32. -名前: dockerlogs
  33. ホストパス:
  34. パス: /var/lib/docker/containers

この例では、2 つのボリュームがマウントされています。1 つは /var/log に、もう 1 つは /var/log/docker/containers にマウントされており、それぞれシステム コンポーネントと Docker ランタイムのログが配置されます。

使用されているイメージは、DaemonSets で使用するためのスマートなデフォルトですでに構成されていますが、構成は変更できます。

上記の YAML リソースを fluentd-ds.yaml という名前のファイルに保存し、次のコマンドで適用します。

プロパティファイル

  1. kubectl を適用 -f fluentd-ds.yaml

これにより、Kubernetes クラスター内の各ノードで Fluentd ポッドが起動します。

ここでは、ストリーミングおよびログ プロキシ サイドカー パターンを実装する方法を説明します。

(3)サイドカー

まず、アプリケーションがストリームではなくファイルにログを書き込む場合のストリーミング サイドカー パターンを見てみましょう。サイドカーを実行してこれらのログを読み取り、stdout/stderr ストリームに書き戻すことができます。

行く

  1. APIバージョン: v1
  2. 種類: ポッド
  3. メタデータ:
  4. 名前: my-app
  5. 仕様:
  6. コンテナ:
  7. -名前: レガシーアプリ
  8. 画像: ビジーボックス
  9. 引数:
  10. - /bin/sh
  11. - -c
  12. ->
  13. 私=0;
  14. 真の場合;
  15. する
  16. echo "$i: $(date)" >> /var/log/出力.log;
  17. i=$((i+1));
  18. 睡眠1;
  19. 終わり
  20. ボリュームマウント:
  21. -名前: varlog
  22. マウントパス: /var/log
  23. -名前:ストリーミングサイドカー
  24. 画像: ビジーボックス
  25. 引数: \[/bin/sh, -c, 'tail -n+1 -f /var/log/output.log' \]
  26. ボリュームマウント:
  27. -名前: varlog
  28. マウントパス: /var/log
  29. ボリューム:
  30. -名前: varlog
  31. 空ディレクトリ: {}

この例では、コンテナの /var/log ディレクトリ内のファイルにログを書き込む仮想コンテナがあります。現在、コンテナ ランタイムはこれらのログを取得できないため、/var/log の場所からログを追跡し、stdout ストリームにリダイレクトするストリーミング サイドカーが実装されています。

このログ ストリームはコンテナ ランタイムによって取得され、ノード上の /var/log ディレクトリに JSON ファイルとして保存され、その後、ノード レベルのログ エージェントによって取得されます。

それでは、ログ エージェント サイドカーを見てみましょう。このモードでは、Fluentd はサイドカーとしてデプロイされ、Elasticsearch ストレージ バックエンドに直接書き込みます。

Elasticsearch プラグインをインストールするビルド済みのイメージは存在せず、カスタム Docker イメージの作成はこの記事の範囲外です。代わりに、DaemonSet の例で使用したのと同じ Fluentd イメージを使用します。

行く

  1. APIバージョン: v1
  2. 種類: ポッド
  3. メタデータ:
  4. 名前: my-app
  5. 仕様:
  6. コンテナ:
  7. -名前:カウント 
  8. 画像: ビジーボックス
  9. 引数:
  10. - /bin/sh
  11. - -c
  12. ->
  13. 私=0;
  14. 真の場合;
  15. する
  16. echo "$i: $(date)" >> /var/log/出力.log;
  17. i=$((i+1));
  18. 睡眠1;
  19. 終わり
  20. ボリュームマウント:
  21. -名前: varlog
  22. マウントパス: /var/log
  23. -名前: ログエージェント
  24. イメージ: fluent/fluentd-kubernetes-daemonset:elasticsearch
  25. 環境:
  26. -名前: FLUENT\_ELASTICSEARCH\_HOST
  27. 値: "elasticsearch-master"  
  28. -名前: FLUENT\_ELASTICSEARCH\_PORT
  29. 値: "9200"  
  30. ボリュームマウント:
  31. -名前: varlog
  32. マウントパス: /var/log
  33. ボリューム:
  34. -名前: varlog
  35. 空ディレクトリ: {}

結論は

Pod と Node の一時的な性質を考慮すると、Kubernetes クラスターからのログを別のストレージ バックエンドに保存することが重要です。この記事で説明したログ記録アーキテクチャを設定するために使用できるパターンはいくつかあります。

実稼働システムでは、サイドカー モードとノード レベル モードを組み合わせて使用​​することをお勧めします。これには、DaemonSet パターンを使用してクラスター全体のノード レベルのログ記録を設定すること、ストリーム (stdout/stderr) へのログの書き込みをサポートしていないアプリケーションや標準のログ形式で書き込まないアプリケーション用のストリーミング サイドカー コンテナーを実装することが含まれます。ストリーム コンテナーは、取得するノード レベル エージェントのログを自動的に表示します。

ストレージ バックエンドの選択には、Elasticsearch などのセルフホスト型オープン ソース ソリューションを選択することも、Elasticsearch、Stackdriver、Cloudwatch などのクラウド ホスト型オプションを使用したマネージド サービス ルートを選択することもできます。適切なバックエンドの選択は、アーキテクチャに実装するコスト、クエリ、およびログ分析の要件によって異なります。

原題: Kubernetes Logging in Production、著者: 若山健太郎

[51CTOによる翻訳。パートナーサイトに転載する場合は、元の翻訳者と出典を51CTO.comとして明記してください。

<<:  エッジの台頭 - いつでもどこでも分析とコンピューティング

>>:  エッジコンピューティングを採用する3つの理由

推薦する

新しいサイトに不可欠な4つの外部リンク公開プラットフォームについての簡単な説明

新しいサイトの場合、結局のところ、立ち上げたばかりで、重みも、包含も、ランキングもありません。非常に...

ION(kt): ロサンゼルス cn2 gia VPS + サンノゼ cn2 gia VPS 期間限定プロモーション、年間支払い $75、KVM/2G メモリ/50gSSD/2T トラフィック

KTデータセンター傘下のionブランドは、今から今月末まで、ロサンゼルスとサンノゼで低スペックVPS...

テンセントは、AIコンピューティング、ビデオ処理、高性能ネットワーク向けの自社開発チップ3種を初めて発表した。

11月3日、テンセントデジタルエコシステムカンファレンスで、テンセントのクラウドおよびスマート産業グ...

蛇年には、SEO 担当者はオンライン マーケティングの最前線の指揮官になる必要があります。

admin5 が SEO をトップに押し上げた 1 ~ 2 年間を、私は今でもぼんやりと覚えています...

コンタボはどうですか?東京のVPSの簡単なレビュー

Contabo は本日、東京に新しいデータセンターを開設しました。ウェブマスターはすぐに最低構成の日...

感謝祭/ブラックフライデー/サイバーマンデースペシャル

親愛なるみんな、ホスティング業界で一年で最も待ち望まれている日がやってきました。海外のホスティングベ...

#BlackFriday# Contabo: 月額 8.49 ドル、シンガポール/米国/ドイツ/英国、8G メモリ/4 コア (AMD EPYC)/200gSSD/32T トラフィック、Windows をサポート

contabo のブラックフライデーをご紹介します。VPS、VDS、専用サーバー、ブロックストレージ...

プロバイダー: スロバキア VPS、月額 10 ユーロ、1G メモリ/1 コア/20g ハードディスク/1Gbps 帯域幅 (トラフィック無制限)

2010 年に設立されたスロバキアの商人である profvds は、HVM 仮想化、1Gbps の帯...

フォーラムの人気の源を見つける4つの方法を共有する

フォーラムの発展は人気にかかっています。人気はフォーラムにとって活力のある水源のようなものだと言えま...

Zenon: 20年のブランド、ロシアのVPS、無制限のトラフィック、月額17元

ZENON NSP は 1996 年に設立されたロシアのホスティング会社です。非常に古いブランドです...

北京インターネット監視センターは、一時的にアクセス不能になっていた「茶観坊」ウェブサイトの調査を開始した。

北京新聞(記者 林葉) 北京新聞は10月21日と22日、インターネット上に「ホテル予約チェック」のウ...

ボストン・グローブ紙が PTC を 2018 年の「最も働きがいのある会社」に選出

PTC (NASDAQ: PTC) は、ボストン グローブ紙の第 11 回年次従業員調査で、マサチュ...

アリババクラウドブロックチェーンの責任者、イー・リー氏:クラウドコンピューティングは生産性の革命であり、ブロックチェーンは生産関係の革命です。

ブロックチェーンは近年最も革新的な技術の一つであり、業界の注目も高まっています。 8月24日に開催さ...

Kubernetes が SaaS に適しているかどうかを知る方法

[51CTO.com クイック翻訳] Kubernetes は素晴らしい技術であり、私自身も自分の ...

ウェブマスターネットワークの最初のタオバオSEOトレーニングコースの申し込み受付が始まりました

Taobao 検索ランキングの最適化は、Taobao SEO とも呼ばれ、Taobao ストアを開設...