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_name
やnamespace_name
などのメタデータのほとんどは Fluent Bit と Fluentd で同じですが、以下の点が異なります。-
Fluent Bit 最適化設定では
docker_id
を使用し、Fluentd ではDocker.container_id
を使用します。 -
いずれの Fluent Bit 設定も、次のメタデータを使用しません。これらは Fluentd にのみ存在します:
container_image_id
、master_url
、namespace_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 は、次のロググループを作成します (まだ存在していない場合)。
ロググループ名 | ログソース |
---|---|
|
|
|
|
|
|
Fluent Bit をインストールしてコンテナから CloudWatch Logs にログを送信するには
-
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
-
次のコマンドを実行して、クラスター名とログを送信するリージョンを持つ
cluster-info
という名前の ConfigMap を作成します。cluster-name
とcluster-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'
を設定することで、ファイルシステム内のすべてのログが収集されます。 -
次のいずれかのコマンドを実行して、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-* という名前の 1 つのポッドが必要です。
kubectl get pods -n amazon-cloudwatch
上記の手順を実行することにより、クラスターに次のリソースが作成されます。
-
Fluent-Bit
名前空間のamazon-cloudwatch
という名前のサービスアカウント。このサービスアカウントは、Fluent Bit daemonSet を実行するために使用されます。詳細については、Kubernetes Reference のサービスアカウントの管理を参照してください。 -
Fluent-Bit-role
名前空間のamazon-cloudwatch
という名前のクラスターロール。このクラスターロールは、ポッドログのget
、list
、watch
の各アクセス許可を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 設定の検証
CloudWatch コンソール (https://console.aws.amazon.com/cloudwatch/
) を開きます。 -
ナビゲーションペインで、[Log groups] (ロググループ) を選択します。
-
Fluent Bit をデプロイしたリージョンにいることを確認してください。
-
リージョン内のロググループのリストを確認します。次のように表示されます。
-
/aws/containerinsights/
Cluster_Name
/application -
/aws/containerinsights/
Cluster_Name
/host -
/aws/containerinsights/
Cluster_Name
/dataplane
-
-
これらのロググループのいずれかに移動し、ログストリームの [Last Event Time] (最終のイベント時刻) を確認します。Fluent Bit をデプロイしたときと比べて最近のものである場合は、設定が検証されます。
/dataplane
ロググループの作成にわずかな遅延が生じることがあります。Fluent Bit がそのロググループのログ送信を開始したときにのみ、これらのロググループが作成されるため、これは正常です。
複数行のログのサポート
デフォルトでは、複数行のログエントリスターターは、空白のない任意の文字です。つまり、空白文字のない文字で始まるすべてのログ行は、新しい複数行のログエントリと見なされます。
独自のアプリケーションログで異なる複数行のスターターを使用している場合は、Fluent-Bit.yaml
ファイルで 2 つの変更を行うことでそれらのログをサポートできます。
まず、exclude_path
の containers
セクションの Fluent-Bit.yaml
フィールドにログファイルのパス名を追加することで、デフォルトの入力から除外します。次に例を示します。
[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 メタデータが追加されないように削除するには、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 エージェントをインストールする Amazon EKS および Kubernetes クラスターに Prometheus メトリクスコレクションを使用して CloudWatch エージェントをインストールする」を参照してください。
このダッシュボードを設定する前に、Prometheus メトリクスの Container Insights を設定する必要があります。詳細については、「」を参照してくださいContainer Insights の Prometheus メトリクスのモニタリング
Fluent Bit Prometheus メトリクスのダッシュボードを作成するには
-
環境変数を作成し、次の行の右側の値をデプロイと一致するように置き換えます。
DASHBOARD_NAME=
your_cw_dashboard_name
REGION_NAME=your_metric_region_such_as_us-west-1
CLUSTER_NAME=your_kubernetes_cluster_name
-
次のコマンドを実行して、ダッシュボードを作成します。
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