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 のクイックスタートセットアップ」のステップを実行するか、このセクションのステップを実行します。

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

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

/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

kubelet.servicekubeproxy.service、およびdocker.service に対する /var/log/journal のログ。

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

    kubectl get pods -n amazon-cloudwatch

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

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

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

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

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

Fluent Bit 設定の検証

  1. https://console.aws.amazon.com/cloudwatch/ にある CloudWatch コンソールを開きます。

  2. ナビゲーションペインで [ログ] を選択します。

  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.yaml ファイルで 2 つの変更を行うことでそれらのログをサポートできます。

まず、Fluent-Bit.yamlcontainers セクションの exclude_path フィールドにログファイルのパス名を追加することで、デフォルトの入力から除外します。以下はその例です。

[INPUT] Name tail Tag application.* Exclude_Path full_pathname_of_log_file*, full_pathname_of_log_file2* Path /var/log/containers/*.log

次に、ログファイルのブロックを Fluent-Bit.yaml ファイルに追加します。複数行のスターターとしてタイムスタンプの正規表現を使用する以下の cloudwatch-agent ログ設定例をご参照ください。

application-log.conf: | [INPUT] Name tail Tag application.* Path /var/log/containers/cloudwatch-agent* Docker_Mode On Docker_Mode_Flush 5 Docker_Mode_Parser cwagent_firstline Parser docker DB /fluent-bit/state/flb_cwagent.db Mem_Buf_Limit 5MB Skip_Long_Lines On Refresh_Interval 10 parsers.conf: | [PARSER] Name cwagent_firstline Format regex Regex (?<log>(?<="log":")\d{4}[\/-]\d{1,2}[\/-]\d{1,2}[ T]\d{2}:\d{2}:\d{2}(?!\.).*?)(?<!\\)".*(?<stream>(?<="stream":").*?)".*(?<time>\d{4}-\d{1,2}-\d{1,2}T\d{2}:\d{2}:\d{2}\.\w*).*(?=}) Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%LZ

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 メタデータが追加されないように削除するには、Fluent-Bit.yaml ファイルの application-log.conf セクションに以下のフィルターを追加します。

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 ポリシー、ロール、アクセス許可」をご参照ください 。Amazon EKS

ポッドのステータスが 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