本番環境の 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つの理由

推薦する

マルチクラウド管理で知っておくべき7つのヒント

多ければ多いほど良いというわけではありませんが、IT プロフェッショナルが特定のベンダーが提供するサ...

Google ペンギン アルゴリズム分析: SEO は死んではいないが、柔軟に対応する必要がある

Google ペンギン アルゴリズムの登場は、英語の SEO 業界に大きな変化をもたらし、ブラック ...

SEOクライアントがあなたに尋ねるべき5つの質問:あらゆる戦いに勝つために自分自身と敵を知る

現在、多くのSEO友達が注文を受け付けたり、注文を受け付ける準備をしていますが、SEO友達の皆さんは...

Amazon Innovation Day 2020: 人工知能と機械学習のデジタル推進力について深く掘り下げる

アマゾン中国は「2020年アマゾンイノベーションデー」を盛大に開催し、イノベーションの「中国フォーミ...

SEO に関する 4 つのよくある誤解の分析 (パート 2)

前の章では、SEO に関するよくある誤解を 4 つ紹介しました。具体的なアドレスは、http://w...

中小企業向けネットワークマーケティングの実施方法

電子商取引が私たちの生活にさらに浸透するにつれて、オンラインマーケティングは電子商取引への扉を開く鍵...

高性能、多階層高可用性、クラウドネイティブデータベースGaiaDBのアーキテクチャ設計の分析

1 クラウドネイティブデータベースとGaiaDB現在、クラウドネイティブデータベースはさまざまな業界...

モバイル Web サイトの構築にかかる時間に影響する要因は何ですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますコンピュー...

B2B2C ビジネスモデル研究: 制御と制御不能の間

C2C は間違いなく最も自由なモデルです。しかし、自由には代償が伴います。それは、コントロールを失う...

クラウドコンピューティングは10の大きな課題に直面しており、セキュリティが第一位

今日、クラウド コンピューティングが直面している課題は多面的であり、もちろん厄介です。ほとんどの企業...

検索市場の観点から見ると、「アリババクラウドサーチ」は単なる代替品に過ぎない。

昨日の報道によると、「アリババクラウドサーチ」が正式に開始され、一部のメディアはまるで検索市場に強力...

Xinnetにバックエンド管理の脆弱性が見つかり、数十万件のドメイン名管理パスワードが漏洩した

Admin5によると、12月22日、国内のセキュリティ情報プラットフォームWuyun - 脆弱性報告...

geecdn: 香港独立サーバー、月額 320 元、2*L5630/16G メモリ/1T ハードディスク/20M 帯域幅/5 IP、VPS サイクル 50% 割引

geecdn は、今から大晦日まで、香港データセンターの独立サーバーを年間 3,000 元から、帯域...

SEO 診断: ストック イメージ ウェブサイト診断の提案

この2日間は家で何もすることがなく、会社もソフト記事を書くことを要求していません。とても退屈です。ま...

推奨: weloveservers-38 ドル/年/2g メモリ/8 コア/60g ハード ドライブ/2T トラフィック

weloveservers は、年間 19 ドルの支払いでオリジナル モデルのリソースを 2 倍にす...