Fluent Bit を Container Insights for Amazon EKS と統合する場合の設定に関する問題をトラブルシューティングするにはどうすればよいですか?
最終更新日: 2023 年 2 月 21 日
Fluent Bit を Container Insights for Amazon Elastic Kubernetes Service (Amazon EKS) と統合する場合の設定に関する問題をトラブルシューティングしたいと考えています。
簡単な説明
Fluent Bit は、Amazon CloudWatch でコンテナログを収集するために使用する軽量のログプロセッサおよびフォワーダーです。
リソースフットプリントが少なく、Use_Kubelet 機能を備えているため、Fluentd (従来のオープンソースプログラム) ではなく Fluent Bit を使用するのがベストプラクティスです。詳細については、「大規模なクラスターで Use_Kubelet 機能を有効にします」を参照してください。
Fluent Bit が Amazon CloudWatch Logs にコンテナログを配信することを許可するには、AWS Identity and Access Management (IAM) 許可を Fluent Bit に付与する必要があります。Amazon EKS では、IAM の許可を付与する方法が 2 つあります。
- ワーカーノードの IAM ロールにポリシーをアタッチする。
- IAM サービスアカウントロールを使用する。
Fluent Bit に IAM 許可を付与すると、Fluent Bit は次のアクションを実行できます。
- logs:DescribeLogGroups
- logs:DescribeLogStreams
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
一般的な問題には次が含まれます。
- Fluent Bit のポッドがクラッシュする。
- Fluent Bit が CloudWatch にログを送信しない。
- Fluent Bit のポッドが CreateContainerConfigError を返す。
解決方法
サービスアカウントの IAM ロールを設定する
AWS マネージドポリシー CloudWatchAgentServerPolicy を使用して、amazon-cloudwatch 名前空間の cloudwatch-agent サービスアカウントの IAM ロールを作成します。
1. 次のコマンドを実行して環境変数を設定します。
export CLUSTER="clustername"
export AWS_REGION="awsregion"
export AWS_ACCOUNT="awsaccountid"
注: "clustername"、"awsregion"、"awsaccountid" (引用符を含む) を、自らのクラスター名、AWS リージョン、アカウント ID に置き換えてください。
2. 次の eksctl コマンドを実行します。
eksctl create iamserviceaccount \
--name cloudwatch-agent \
--namespace amazon-cloudwatch \
--cluster $CLUSTER \
--attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \
--approve \
--override-existing-serviceaccounts
Container Insights の前提条件の詳細については、「前提条件を確認する」を参照してください。
クラスターメトリクスを収集するように CloudWatch エージェントを設定し、Container Insights をオンにする
1. クイックスタートを使用して Container Insights をデプロイするには、次のコマンドを実行します。
ClusterName="my-cluster-name"
RegionName="my-cluster-region"
FluentBitHttpPort='2020'
FluentBitReadFromHead='Off'
[[ ${FluentBitReadFromHead} = 'On' ]] && FluentBitReadFromTail='Off'|| FluentBitReadFromTail='On'
[[ -z ${FluentBitHttpPort} ]] && FluentBitHttpServer='Off' ||
FluentBitHttpServer='On'
curl https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-
container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/daemonset/container-insights-
monitoring/quickstart/cwagent-fluent-bit-quickstart.yaml | sed 's/
{{cluster_name}}/'${ClusterName}'/;s/
{{region_name}}/'${RegionName}'/;s/
{{http_server_toggle}}/"'${FluentBitHttpServer}'"/;s/
{{http_server_port}}/"'${FluentBitHttpPort}'"/;s/
{{read_from_head}}/"'${FluentBitReadFromHead}'"/;s/
{{read_from_tail}}/"'${FluentBitReadFromTail}'"/' | kubectl apply -f -
注: "my-cluster-name" と "my-cluster-region" (引用符を含む) を、自らのクラスター名と AWS リージョンに置き換えてください。
前述のコマンドは、CloudWatch エージェントと Fluent Bit の名前空間、ClusterRole、ClusterRoleBinding、ConfigMap を作成します。
2. そのコマンドを実行したら、次のコマンドを実行して Fluent Bit サービスアカウントを作成します。
eksctl create iamserviceaccount \
--name fluent-bit \
--namespace amazon-cloudwatch \
--cluster $CLUSTER \
--attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \
--approve \
--override-existing-serviceaccounts
3. 次のコマンドを実行して、CloudWatch エージェントが次をデプロイしていることを検証します。
kubectl get pods -n amazon-cloudwatch
4. 完了すると、CloudWatch エージェントは /aws/containerinsights/Cluster_Name/performance というロググループを作成します。 その後、CloudWatch エージェントはパフォーマンスログイベントをロググループに送信します。
トラブルシューティング
Fluent Bit のポッドがクラッシュする
1. Fluent Bit のポッドのログにエラーメッセージがないか確認します。次のコマンドを実行して、Fluent Bit のポッドのイベントを検索します。
kubectl -n amazon-cloudwatch logs -l k8s-app=fluent-bit
kubectl -n amazon-cloudwatch describe pod fluent_pod pod_name
2. cluster-info (ConfigMap に保存されている Fluent Bit の設定ファイル) が正確で、構文に間違いがないことを確認します。クラスター名とリージョンの値がすべて設定されていることを確認します。詳細については、GitHub ウェブサイトの「amazon-cloudwatch-container-insights」を参照してください。
Fluent Bit が CloudWatch にログを送信しない
1. Fluent Bit の設定ファイルで出力プラグインが適切に設定されていることを確認します。データ送信エラーがないかを確認するには、次のコマンドを使用して Fluent Bit のポッドのログを確認します。
kubectl -n amazon-cloudwatch logs fluent_pod_name
2. CloudWatch にログをストリーミングするために必要な IAM 許可が Fluent Bit のポッドにあることを確認してください。IAM によって強制される CloudWatchAgentServerPolicy のため、Amazon EKS ワーカーノードはメトリクスとログを CloudWatch に送信します。必要な IAM 許可を付与するには 2 つの方法があります。
- ワーカーノードの IAM ロールにポリシーを追加する。
- クラスターのサービスアカウントの IAM ロールを作成し、それにポリシーを付加します。
詳細については、「サービスアカウントの IAM ロールの設定」セクションを参照してください。
Fluent Bit のポッドが CreateContainerConfigError でスタックした
ポッドのステータスが CreateContainerConfigError の場合は、次のコマンドを実行して正確なエラーメッセージを取得します。
kubectl describe pod pod_name -n amazon-cloudwatch
コマンドの出力の [Events] (イベント) セクションで、次のようなエラーメッセージを探します。
Error syncing pod ("fluent-bit-xxxxxxx"), skipping: failed to "StartContainer" with CreateContain
erConfigError: "configmap \"fluent-bit-config\" not found"
このエラーメッセージが表示される場合は、Fluent Bit の ConfigMap (fluent-bit-config) を作成していない可能性があります。インストールのステップをもう一度実行して、必ず ConfigMap を作成してください。