Kubernetes クラスタ ロギングの基本を簡単に説明します

Kubernetes クラスタ ロギングの基本を簡単に説明します

サーバーおよびアプリケーションのログ記録は、開発者、運用、セキュリティ チームが運用環境で実行されているアプリケーションの状態を把握するための重要なツールです。

ログ記録により、オペレーターはアプリケーションと必要なコンポーネントがスムーズに実行されているかどうかを判断し、異常が発生しているかどうかを検出して状況に対応できるようになります。

開発者にとって、ログ記録は開発中および開発後にコードのトラブルシューティングを行うための可視性を提供します。実稼働環境では、開発者はデバッグ ツールを使用せずにログ ツールに依存することがよくあります。システム ログと組み合わせることで、開発者は運用スタッフと連携して問題を効率的に解決できます。

ログ ツールの最も重要な受益者は、特にクラウド ネイティブ環境のセキュリティ チームです。アプリケーション ログとシステム ログから情報を収集できるため、セキュリティ チームは認証、アプリケーション アクセス、マルウェア アクティビティからのデータを分析し、必要に応じて対応できます。

Kubernetes は主要なコンテナ プラットフォームであり、Kubernetes を使用して本番環境にデプロイされるアプリケーションが増えています。 Kubernetes のロギング アーキテクチャを理解することは、すべての開発、運用、セキュリティ チームが真剣に取り組む必要がある非常に重要なタスクであると私は考えています。

この記事では、Kubernetes でさまざまなコンテナ ログ モードがどのように機能するかについて説明します。

システムログとアプリケーションログ

Kubernetes のロギング アーキテクチャについて詳しく説明する前に、さまざまなロギング アプローチと、これら 2 つの機能が Kubernetes ロギングの重要な機能である理由について説明します。

システム コンポーネントには、コンテナー内で実行されるものと、コンテナー内で実行されないものの 2 種類があります。例えば:

  • Kubernetes スケジューラと kube-proxy はコンテナ内で実行されます。
  • kubelet とコンテナ ランタイムはコンテナ内で実行されません。

コンテナ ログと同様に、システム コンテナ ログは /var/log ディレクトリに保存され、定期的にローテーションする必要があります。

ここではコンテナのログ記録について見ていきます。まず、クラスター レベルのログ記録と、それがクラスター オペレーターにとってなぜ重要であるかについて説明します。クラスター ログは、クラスターのパフォーマンスに関する情報を提供します。ポッドがオフラインになった理由やノードが停止した理由などの情報。クラスター ログでは、クラスターとアプリケーションのアクセス、アプリケーションによるコンピューティング リソースの利用方法などの情報も取得できます。全体として、クラスター ログ ツールは、クラスター オペレーターにクラスターの操作とセキュリティに役立つ情報を提供します。

コンテナ ログをキャプチャする別の方法は、アプリケーションのネイティブ ログ ツールを使用することです。最新のアプリケーション設計には、開発者が標準出力 (stdout) とエラー ストリーム (stderr) を通じてアプリケーションのパフォーマンスの問題をトラブルシューティングするのに役立つログ記録メカニズムが備わっている可能性があります。

効果的なログ記録インストルメンテーションを実現するには、Kubernetes 実装にアプリケーション ログ記録コンポーネントとシステム ログ記録コンポーネントの両方が必要です。

Kubernetes コンテナ ログの 3 つの種類

今日のほとんどの Kubernetes 実装で見られるクラスター レベルのログ記録には、主に 3 つのアプローチがあります。

  • ノードレベルのログエージェント
  • ログ記録用のサイドカーコンテナアプリケーション
  • アプリケーションログをログバックエンドに直接公開する

ノードレベルのログエージェント

ノード レベルのログ エージェントを検討したいと思います。通常、これを実装するには、DaemonSet をデプロイメント戦略として使用し、ポッド (ログ エージェントとして機能) をすべての Kubernetes ノードにデプロイします。次に、ログ エージェントはすべての Kubernetes ノードからログを読み取るように構成されます。通常、エージェントは、ノードの /var/logs ディレクトリを読み取り、stdout/stderr ストリームをキャプチャして、ログ記録バックエンド ストレージに送信するように構成します。

次の図は、すべてのノードでエージェントとして実行されているノード レベルのログ記録を示しています。

ノードレベルのログエージェント

fluentd メソッドを使用してノードレベルのログ記録を設定するには、次の手順を実行する必要があります。

(1)まず、fluentddというサービスアカウントを作成する必要があります。 Fluentd ポッドは、このサービス アカウントを使用して Kubernetes API にアクセスします。ラベル app: fluentd を使用して、ログ名前空間に作成する必要があります。

  1. #fluentd-SA.yaml
  2. APIバージョン: v1
  3. 種類: サービスアカウント
  4. メタデータ:
  5. 名前: fluentd
  6. 名前空間: ログ記録
  7. ラベル:
  8. アプリ: fluentd

完全な例はこのリポジトリでご覧いただけます。

(2)次に、fluentd-configmapという名前のConfigMapを作成する必要があります。これにより、必要なすべてのプロパティを含む fluentd デーモンセットの構成ファイルが提供されます。

  1. #fluentd-デーモンセット.yaml
  2. apiバージョン: extensions/v1beta1
  3. 種類: DaemonSet
  4. メタデータ:
  5. 名前: fluentd
  6. 名前空間: ログ記録
  7. ラベル:
  8. アプリ: fluentd
  9. kubernetes.io/cluster-service: "true"
  10. 仕様:
  11. セレクタ:
  12. 一致ラベル:
  13. アプリ: fluentd
  14. kubernetes.io/cluster-service: "true"
  15. テンプレート:
  16. メタデータ:
  17. ラベル:
  18. アプリ: fluentd
  19. kubernetes.io/cluster-service: "true"
  20. 仕様:
  21. サービスアカウント: fluentd
  22. コンテナ:
  23. - 名前: fluentd
  24. イメージ: fluent/fluentd-kubernetes-daemonset:v1.7.3-debian-elasticsearch7-1.0
  25. 環境:
  26. - 名前: FLUENT_ELASTICSEARCH_HOST
  27. 値: "elasticsearch.logging.svc.cluster.local"
  28. - 名前: FLUENT_ELASTICSEARCH_PORT
  29. 値: "9200"
  30. - 名前: FLUENT_ELASTICSEARCH_SCHEME
  31. 値: "http"
  32. - 名前: FLUENT_ELASTICSEARCH_USER
  33. 値: "弾性"
  34. - 名前: FLUENT_ELASTICSEARCH_PASSWORD
  35. 値:
  36. シークレットキーリファレンス:
  37. 名前: efk-pw-elastic
  38. キー: パスワード
  39. - 名前: FLUENT_ELASTICSEARCH_SED_DISABLE
  40. 値: "true"
  41. リソース:
  42. 制限:
  43. メモリ: 512Mi
  44. リクエスト:
  45. CPU: 100m
  46. メモリ: 200Mi
  47. ボリュームマウント:
  48. - 名前: varlog
  49. マウントパス: /var/log
  50. - 名前: varlibdockercontainers
  51. マウントパス: /var/lib/docker/containers
  52. 読み取り専用: true
  53. - 名前: fluentconfig
  54. マウントパス: /fluentd/etc/fluent.conf
  55. サブパス: fluent.conf
  56. 終了猶予期間秒数: 30
  57. ボリューム:
  58. - 名前: varlog
  59. ホストパス:
  60. パス: /var/log
  61. - 名前: varlibdockercontainers
  62. ホストパス:
  63. パス: /var/lib/docker/containers
  64. - 名前: fluentconfig
  65. 構成マップ:
  66. 名前: fluentdconf

完全な例はこのリポジトリでご覧いただけます。

ここで、fluentd デーモンセットをロギング エージェントとしてデプロイする方法のコードを見てみましょう。

  1. #fluentd-デーモンセット.yaml
  2. apiバージョン: extensions/v1beta1
  3. 種類: DaemonSet
  4. メタデータ:
  5. 名前: fluentd
  6. 名前空間: ログ記録
  7. ラベル:
  8. アプリ: fluentd
  9. kubernetes.io/cluster-service: "true"
  10. 仕様:
  11. セレクタ:
  12. 一致ラベル:
  13. アプリ: fluentd
  14. kubernetes.io/cluster-service: "true"
  15. テンプレート:
  16. メタデータ:
  17. ラベル:
  18. アプリ: fluentd
  19. kubernetes.io/cluster-service: "true"
  20. 仕様:
  21. サービスアカウント: fluentd
  22. コンテナ:
  23. - 名前: fluentd
  24. イメージ: fluent/fluentd-kubernetes-daemonset:v1.7.3-debian-elasticsearch7-1.0
  25. 環境:
  26. - 名前: FLUENT_ELASTICSEARCH_HOST
  27. 値: "elasticsearch.logging.svc.cluster.local"
  28. - 名前: FLUENT_ELASTICSEARCH_PORT
  29. 値: "9200"
  30. - 名前: FLUENT_ELASTICSEARCH_SCHEME
  31. 値: "http"
  32. - 名前: FLUENT_ELASTICSEARCH_USER
  33. 値: "弾性"
  34. - 名前: FLUENT_ELASTICSEARCH_PASSWORD
  35. 値:
  36. シークレットキーリファレンス:
  37. 名前: efk-pw-elastic
  38. キー: パスワード
  39. - 名前: FLUENT_ELASTICSEARCH_SED_DISABLE
  40. 値: "true"
  41. リソース:
  42. 制限:
  43. メモリ: 512Mi
  44. リクエスト:
  45. CPU: 100m
  46. メモリ: 200Mi
  47. ボリュームマウント:
  48. - 名前: varlog
  49. マウントパス: /var/log
  50. - 名前: varlibdockercontainers
  51. マウントパス: /var/lib/docker/containers
  52. 読み取り専用: true
  53. - 名前: fluentconfig
  54. マウントパス: /fluentd/etc/fluent.conf
  55. サブパス: fluent.conf
  56. 終了猶予期間秒数: 30
  57. ボリューム:
  58. - 名前: varlog
  59. ホストパス:
  60. パス: /var/log
  61. - 名前: varlibdockercontainers
  62. ホストパス:
  63. パス: /var/lib/docker/containers
  64. - 名前: fluentconfig
  65. 構成マップ:
  66. 名前: fluentdconf

これをまとめると、次のようになります:

  1. kubectl apply -f fluentd-SA.yaml \
  2. fluentd-configmap.yaml \ を設定します。
  3. -f fluentd-デーモンセット.yaml

ログ記録用のサイドカーコンテナアプリケーション

もう 1 つの方法は、ログ エージェントを備えた専用のサイドカー コンテナーを使用することです。コンテナの最も一般的な実装は、ログ コレクターとして Fluentd を使用することです。エンタープライズ展開(コンピューティング リソースのオーバーヘッドを心配する必要がない)では、fluentd(または同様のもの)で実装されたサイドカー コンテナーにより、クラスター レベルのログ記録の柔軟性が実現します。これは、キャプチャする必要があるログの種類、頻度、およびその他の可能な調整に基づいて、コレクター エージェントを調整および構成できるためです。

次の図は、ログ記録エージェントとして機能するサイドカー コンテナーを示しています。

ログ エージェントとしてのサイドカー コンテナー たとえば、ポッドは、2 つの異なる形式を使用して 2 つの異なるログ ファイルに書き込む単一のコンテナーを実行します。ポッドの構成ファイルは次のとおりです。

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

これらすべてを組み合わせると、次のポッドを実行できます。

  1. $ kubectl apply -f ログサイドカー.yaml

サイドカー コンテナがログ エージェントとして動作していることを確認するには、次の操作を実行します。

  1. $ kubectl ログカウンタ count-log

期待される出力は次のとおりです。

  1. $ kubectl ログカウンタ count-log-1
  2. 2021年11月4日(木)09:23:21 NZDT
  3. 2021年11月4日(木)09:23:22 NZDT
  4. 2021年11月4日(木)09:23:23 NZDT
  5. 2021年11月4日(木)09:23:24 NZDT

アプリケーションログをログバックエンドに直接公開する

3 番目のアプローチは、Kubernetes コンテナとアプリケーション ログに対する最も柔軟なログ ソリューション (私の意見では) であり、ログをログ バックエンド ソリューションに直接プッシュすることです。このパターンはネイティブの Kubernetes 機能に依存しませんが、次のようなほとんどの企業が必要とする柔軟性を提供します。

  • より広範囲のネットワーク プロトコルと出力形式に対するサポートが拡張されました。
  • 負荷分散機能を提供し、パフォーマンスを向上させます。
  • アップストリーム集約を介して複雑なログ記録要件を受け入れるように構成できます。

この 3 番目のアプローチは、各アプリケーションから直接ログをプッシュすることによって Kubernetes 以外の機能に依存しているため、Kubernetes の範囲外となります。

結論は

Kubernetes ロギング ツールは、エンタープライズ Kubernetes クラスターのデプロイメントにおいて非常に重要なコンポーネントです。使用できる可能性のある 3 つのモードについて説明しました。ニーズに合ったモデルを見つける必要があります。

前述のように、デーモンセットを使用したノードレベルのログ記録は最も使いやすいデプロイメント モードですが、いくつかの制限もあり、組織のニーズに適さない可能性があります。一方、サイドカー モードでは柔軟性とカスタマイズ性が提供され、キャプチャするログの種類をカスタマイズできますが、コンピューターのリソース オーバーヘッドが増加します。最後に、アプリケーション ログをバックエンド ログ ツールに直接公開することは、さらなるカスタマイズを可能にするもう 1 つの魅力的なアプローチです。

選択はあなた次第です。組織の要件に合った方法を見つけるだけです。

<<:  プラットフォーム・アズ・ア・サービス(PaaS)環境を保護する方法

>>:  生産失敗 | Kafka のメッセージ送信が数十秒も遅延する原因は、実は...

推薦する

東南アジアにおけるクラウドコンピューティング開発の現状

クラウド コンピューティングは現在、企業の従来の運営方法に変化をもたらす中核技術として確立されており...

小紅書の電子商取引の夢を阻止したのは誰ですか?

草を植えるのは簡単ですが、抜くのは難しいです。小紅書は8年近く電子商取引事業を模索し、数回の戦略変更...

クラウドコンピューティングがビジネスの成功に不可欠な理由

あなたのビジネスは重要であり、可能な限り最善の方法で運営するためにあらゆる手段を講じる必要があります...

ウェブサイトのユーザーエクスペリエンスデザイン: 効率的なデザインの視覚化

人々は日々、情報の海に溺れています。能動的な獲得と受動的な受容のプロセスにおいて、ユーザーは常に「効...

ITコミュニティサイトCSDNがシリーズA資金調達の完了を発表 - A5ウェブマスターネットワーク

新浪科技新聞10月23日午後、ITコミュニティサイトCSDNは本日、シリーズA資金調達を完了したと発...

Weibo ツールを使用してウェブサイト運営にトラフィックを引き付ける方法

実際、Weiboマーケティングを行っている多くのウェブマスターは、現在、この質問について考えています...

#香港サーバーのおすすめ# raksmart: 香港の物理マシン、無制限のトラフィック、3つのネットワークへの直接接続、50M~1Gbpsの帯域幅、月額わずか107ドル

raksmartの香港データセンターは、これまで常に小帯域幅の香港独立サーバーとクラウドサーバーサー...

CrownCloud-1g メモリ/KVM/Phoenix/月額 5 ドル/Win

crowncloud は、ロサンゼルスで 2GB のメモリを搭載した KVM、フェニックスで 1GB...

分散サービス電流制限の実践、私たちはすでにあなたのためにピットを手配しました

[[273022]] 1. 電流制限の役割API インターフェースは呼び出し側の動作を制御できないた...

Baiduプロモーションウェブサイトのクリック時の遅いオープン速度からウェブサイトスペースの安定性について議論する

「商品に自信があるなら、百度入札プロモーションをやろう!」これは、ロビン・リーが百度入札商品を位置づ...

Googleの6回目のペナルティが確定

Google には、SEO 担当者が発見して研究するさまざまなペナルティやフィルタリング メカニズム...

foxcloud: 月額 10 ドル、OpenStack クラウド VPS、ロシア\オランダ\米国

foxcloudは2009年に設立されたブランドです。ドメイン名、仮想ホスト、VPS独立サーバー、I...

#BlackFriday# limewave: 米国シアトルの VPS、年間 15 ドル、2G メモリ/2 コア (Ryzen)/30gSSD/10T トラフィック/1Gbps 帯域幅

Limewave は特別なブラックフライデー イベントを開始しました。2G メモリ、2 コア (RY...

現在のソーシャルツールの分析:実際にはお金にならない

SNSやWeibo(WEB2.0)の台頭により、数多くのソーシャルツールが登場。その年は毎月のように...

Aoyou: 香港の高防御VPS、50G防御、2IP、159元/月、2Gメモリ/2コア/200gトラフィック、Windows搭載

老舗ブランドAoyou Hostが新製品を発売しました:香港高防御VPS、防御力20〜50Gbps、...