CloudWatch Logs へログを送信する DaemonSet として Fluent Bit を設定する - Amazon CloudWatch

CloudWatch Logs へログを送信する DaemonSet として Fluent Bit を設定する

以下のセクションでは、Fluent Bit をデプロイして、コンテナから CloudWatch Logs にログを送信する方法について説明します。

Fluentd を既に使用している場合の違い

既に Fluentd を使用してコンテナから CloudWatch Logs にログを送信している場合は、このセクションを読んで Fluentd と Fluent Bit の違いを確認してください。Container Insights で Fluentd をまだ使用していない場合は、 Fluent Bit の設定 に進むことができます。

Fluent Bit では、次の 2 つのデフォルト設定を提供しています。

  • Fluent Bit 最適化設定 – Fluent Bit のベストプラクティスと整合する設定。

  • Fluentd 互換設定 – 可能な限り Fluentd の動作に整合的なものとされた設定。

以下のリストでは、Fluentd と各 Fluent Bit の設定の違いが詳細に示されています。

  • ログストリーム名の違い – Fluent Bit 最適化設定を使用する場合、ログストリーム名は異なります。

    [/aws/containerinsights/Cluster_Name/application]

    • Fluent Bit 最適化設定は、ログを kubernetes-nodeName-application.var.log.containers.kubernetes-podName_kubernetes-namespace_kubernetes-container-name-kubernetes-containerID に送信します

    • Fluentd は、ログを kubernetes-podName_kubernetes-namespace_kubernetes-containerName_kubernetes-containerID に送信します

    [/aws/containerinsights/Cluster_Name/host]

    • Fluent Bit 最適化設定は、ログを kubernetes-nodeName.host-log-file に送信します

    • Fluentd は、ログを host-log-file-Kubernetes-NodePrivateIp に送信します

    [/aws/containerinsights/Cluster_Name/dataplane]

    • Fluent Bit 最適化設定は、ログを kubernetes-nodeName.dataplaneServiceLog に送信します

    • Fluentd は、ログを dataplaneServiceLog-Kubernetes-nodeName に送信します

  • Container Insights によって書き込まれる kube-proxy および aws-node のログファイルは、異なる場所にあります。Fluentd 設定の場合、これらのファイルは /aws/containerinsights/Cluster_Name/application に置かれます。Fluent Bit 最適化設定では、これらのファイルは /aws/containerinsights/Cluster_Name/dataplane に置かれます。

  • pod_namenamespace_name などのメタデータのほとんどは Fluent Bit と Fluentd で同じですが、以下の点が異なります。

    • Fluent Bit 最適化設定では docker_id を使用し、Fluentd では Docker.container_id を使用します。

    • いずれの Fluent Bit 設定も、次のメタデータを使用しません。これらは Fluentd にのみ存在します: container_image_idmaster_urlnamespace_id、および namespace_labels

Fluent Bit の設定

コンテナからログを収集するように Fluent Bit を設定するには、「Amazon EKS および Kubernetes の Container Insights のクイックスタートセットアップ」のステップを実行するか、このセクションのステップを実行します。

どちらの方法でも、クラスターノードにアタッチされた IAM ロールに十分なアクセス許可が必要です。Amazon EKS クラスターの実行に必要なアクセス許可の詳細については、Amazon EKS ユーザーガイドの「Amazon EKS IAM ポリシー、ロール、アクセス許可」を参照してください。

以下のステップでは、CloudWatch Logs へログを送信する daemonSet として Fluent Bit を設定します。このステップを完了すると、Fluent Bit は、次のロググループを作成します (まだ存在していない場合)。

重要

Container Insights で既に FluentD を設定しており、FluentD DaemonSet が期待どおりに実行されない場合 (containerd ランタイムを使用していると発生する場合があります)、Fluent Bit をインストールする前にアンインストールして、Fluent Bit が FluentD エラーログメッセージを処理しないようにする必要があります。それ以外の場合は、Fluent Bit が正常にインストールされたらすぐに FluentD をアンインストールする必要があります。Fluent Bit のインストール後に Fluentd をアンインストールすることで、この移行プロセス中のログの継続を確保できます。ログを CloudWatch Logs に送信するには、Fluent Bit または FluentD のいずれか 1 つのみが必要になります。

ロググループ名 ログソース

/aws/containerinsights/Cluster_Name/application

/var/log/containers のすべてのログファイル

/aws/containerinsights/Cluster_Name/host

/var/log/dmesg/var/log/secure、および /var/log/messages からのログ

/aws/containerinsights/Cluster_Name/dataplane

/var/log/journalkubelet.service、およびkubeproxy.service に対する docker.service のログ。

Fluent Bit をインストールしてコンテナから CloudWatch Logs にログを送信するには
  1. amazon-cloudwatch という名前の名前空間がまだない場合は、次のコマンドを入力して作成します。

    kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/cloudwatch-namespace.yaml
  2. 次のコマンドを実行して、クラスター名とログを送信するリージョンを持つ cluster-info という名前の ConfigMap を作成します。cluster-namecluster-region をクラスターの名前とリージョンに置き換えます。

    ClusterName=cluster-name RegionName=cluster-region FluentBitHttpPort='2020' FluentBitReadFromHead='Off' [[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On' [[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' || FluentBitHttpServer='On' kubectl create configmap fluent-bit-cluster-info \ --from-literal=cluster.name=${ClusterName} \ --from-literal=http.server=${FluentBitHttpServer} \ --from-literal=http.port=${FluentBitHttpPort} \ --from-literal=read.head=${FluentBitReadFromHead} \ --from-literal=read.tail=${FluentBitReadFromTail} \ --from-literal=logs.region=${RegionName} -n amazon-cloudwatch

    このコマンドでは、プラグインメトリクスをモニターリングするための FluentBitHttpServer がデフォルトでオンになっています。無効にするには、コマンドの 3 行目を FluentBitHttpPort='' (空の文字列) に変更します。

    また、デフォルトでは、Fluent Bit はテールからログファイルを読み取り、デプロイ後に新しいログのみを取得します。逆をご希望の場合は、FluentBitReadFromHead='On' を設定することで、ファイルシステム内のすべてのログが収集されます。

  3. 次のいずれかのコマンドを実行して、Fluent Bit daemonset をクラスターにダウンロードしてデプロイします。

    • Fluent Bit 最適化設定が必要な場合は、このコマンドを実行します。

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit.yaml
    • より Fluentd に似ている Fluent Bit の設定が必要な場合は、このコマンドを実行します。

      kubectl apply -f https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-monitoring/fluent-bit/fluent-bit-compatible.yaml
    重要

    Fluent Bit デーモンセットの設定では、デフォルトでログレベルが INFO に設定されるため、CloudWatch Logs の取り込みコストが高くなる可能性があります。ログの取り込み量とコストを削減したい場合は、ログレベルを ERROR に変更すると削減できます。

    ログの量を減らす方法の詳細については、「(オプション) Fluent Bit からのログボリュームの縮小」を参照してください

  4. 次のコマンドを実行してデプロイを検証します。各ノードには、fluent-bit-* という名前の 1 つのポッドが必要です。

    kubectl get pods -n amazon-cloudwatch

上記の手順を実行することにより、クラスターに次のリソースが作成されます。

  • Fluent-Bit 名前空間の amazon-cloudwatch という名前のサービスアカウント。このサービスアカウントは、Fluent Bit daemonSet を実行するために使用されます。詳細については、Kubernetes Reference のサービスアカウントの管理を参照してください。

  • Fluent-Bit-role 名前空間の amazon-cloudwatch という名前のクラスターロール。このクラスターロールは、ポッドログの getlistwatch の各アクセス許可を Fluent-Bit サービスアカウントに付与します。詳細については、Kubernetes Reference の API の概要を参照してください。

  • Fluent-Bit-config 名前空間の amazon-cloudwatch という名前の ConfigMap。この ConfigMap には、Fluent Bit によって使用される設定が含まれています。詳細については、Kubernetes Tasks ドキュメントの「Configure a Pod to Use a ConfigMap」を参照してください。

Fluent Bit の設定を検証する場合は、次の手順を実行します。

Fluent Bit 設定の検証
  1. CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/) を開きます。

  2. ナビゲーションペインで、[Log groups] (ロググループ) を選択します。

  3. Fluent Bit をデプロイしたリージョンにいることを確認してください。

  4. リージョン内のロググループのリストを確認します。次のように表示されます。

    • /aws/containerinsights/Cluster_Name/application

    • /aws/containerinsights/Cluster_Name/host

    • /aws/containerinsights/Cluster_Name/dataplane

  5. これらのロググループのいずれかに移動し、ログストリームの [Last Event Time] (最終のイベント時刻) を確認します。Fluent Bit をデプロイしたときと比べて最近のものである場合は、設定が検証されます。

    /dataplane ロググループの作成にわずかな遅延が生じることがあります。Fluent Bit がそのロググループのログ送信を開始したときにのみ、これらのロググループが作成されるため、これは正常です。

複数行ログのサポート

複数行ログで Fluent Bit を使用する方法については、Fluent Bit のドキュメントの次のセクションを参照してください。

(オプション) Fluent Bit からのログボリュームの縮小

デフォルトでは、Fluent Bit アプリケーションログおよび Kubernetes メタデータを CloudWatch に送信します。CloudWatch に送信されるデータの量を減らす場合は、これらのデータソースが一方または両方の CloudWatch に送信されることを停止できます。

Fluent Bit アプリケーションログを停止するには、Fluent-Bit.yaml ファイルから次のセクションを削除します。

[INPUT] Name tail Tag application.* Path /var/log/containers/fluent-bit* Parser docker DB /fluent-bit/state/flb_log.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10

CloudWatch に送信されたログイベントに Kubernetes メタデータが追加されないように削除するには、application-log.conf ファイルの Fluent-Bit.yaml セクションに以下のフィルターを追加します。

application-log.conf: | [FILTER] Name nest Match application.* Operation lift Nested_under kubernetes Add_prefix Kube. [FILTER] Name modify Match application.* Remove Kube.<Metadata_1> Remove Kube.<Metadata_2> Remove Kube.<Metadata_3> [FILTER] Name nest Match application.* Operation nest Wildcard Kube.* Nested_under kubernetes Remove_prefix Kube.

トラブルシューティング

正しいリージョンで確認しているが、これらのロググループが表示されない場合は、Fluent Bit daemonSet ポッドのログでエラーを確認します。

次のコマンドを実行してステータスが Running であることを確認します。

kubectl get pods -n amazon-cloudwatch

IAM アクセス許可に関連するエラーがログにある場合は、クラスターノードにアタッチされた IAM ロールを確認します。Amazon EKS クラスターの実行に必要なアクセス許可の詳細については、Amazon EKS ユーザーガイドの「Amazon EKS IAM ポリシー、ロール、アクセス許可」を参照してください。

ポッドのステータスが CreateContainerConfigError である場合は、次のコマンドを実行して正確なエラーを取得します。

kubectl describe pod pod_name -n amazon-cloudwatch

ダッシュボード

実行中の各プラグインのメトリクスをモニターリングするダッシュボードを作成できます。入力バイトと出力バイト、レコード処理レート、出力エラー、およびリトライ/失敗率のデータを表示できます。これらのメトリクスを表示するには、Amazon EKS と Kubernetes クラスターの Prometheus メトリクスコレクションを使用して CloudWatch エージェントをインストールする必要があります。ダッシュボードの設定方法の詳細については、「Amazon EKS および Kubernetes クラスターに Prometheus メトリクスコレクションを使用して CloudWatch エージェントをインストールする」を参照してください。

注記

このダッシュボードを設定する前に、Prometheus メトリクスの Container Insights を設定する必要があります。詳細については、「」を参照してくださいContainer Insights の Prometheus メトリクスのモニターリング

Fluent Bit Prometheus メトリクスのダッシュボードを作成するには
  1. 環境変数を作成し、次の行の右側の値をデプロイと一致するように置き換えます。

    DASHBOARD_NAME=your_cw_dashboard_name REGION_NAME=your_metric_region_such_as_us-west-1 CLUSTER_NAME=your_kubernetes_cluster_name
  2. 次のコマンドを実行して、ダッシュボードを作成します。

    curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/sample_cloudwatch_dashboards/fluent-bit/cw_dashboard_fluent_bit.json \ | sed "s/{{YOUR_AWS_REGION}}/${REGION_NAME}/g" \ | sed "s/{{YOUR_CLUSTER_NAME}}/${CLUSTER_NAME}/g" \ | xargs -0 aws cloudwatch put-dashboard --dashboard-name ${DASHBOARD_NAME} --dashboard-body