お疲れ様です。
今回は、Fluent Bit を使用して EKS のコンテナログを CloudWatch Logs に送信する手順についてご紹介します。
Fluent Bit とは
Fluent Bit(フルエントビット)は、C言語で書かれたクラウド及びコンテナ環境に適した、ログの収集、配布を行うオープンソースのログプロセッサツールです。
Fluent BitはFluentd傘下のCNCFサブプロジェクトで、2014年に組み込みLinuxやゲートウェイなどの制約のある環境向け軽量ログプロセッサとしてTreasure Data社のFluentdチームにより開発され、Fluentdエコシステムの一部として、Fluent Bitと名付けられました。
前提条件
インターネットに接続できるサーバーを経由して、kuectlコマンドを使用します。
- EKSクラスター作成済み
- kubectlインストール済み
- AWS CLIインストール済み
- インターネットに接続できるサーバーに EKS を操作するポリシーを付与したIAMロールをアタッチしている
- OIDCプロバイダー作成済み
※参考 AWS公式ドキュメント - EKSクラスターとOIDCプロバイダー連携済み
※参考 AWS公式ドキュメント
1. CloudWatch Container Insights セットアップと Namespace 作成
EKS クラスターに CloudWatch Container Insights をセットアップすると、【amazon-cloudwatch】 という名前の Namespace が作成されます。
また、自動的に以下の3つのロググループが作成されます。
ロググループ名 | ログソース |
---|---|
/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/journal、kubelet.service、およびkubeproxy.service に対する docker.service のログ。 |
CloudWatch Container Insights セットアップコマンド
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. IAMロール作成
①コンテナログを CloudWatch Logs に送信するための、ポリシーを付与した IAMロールを作成
CloudWatch Logs へのログ送信に必要なポリシーを追加してください。
・CloudWatchLogsReadOnlyAccess
・CloudWatchLogsFullAccess
②IAMロールの【信頼されたエンティティ】の設定
・信頼されたエンティティの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "【arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"【oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】:sub": "system:serviceaccount:【SERVICE_ACCOUNT_NAMESPACE】:【SERVICE_ACCOUNT_NAME】",
"【oidc.eks.AWS_REGION.amazonaws.com/id/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX】:aud": "sts.amazonaws.com"
}
}
}
]
}
【"Federated"】 IDプロバイダのARN
【"StringEquals"】プロバイダ
【SERVICE_ACCOUNT_NAMESPACE】: Service Account を作成する Namespace名
【SERVICE_ACCOUNT_NAME】: 作成する Service Account名
3. Service Account 作成
先ほど作成したIAMロールを関連付けした Service Account を作成
IAMロールを定義した yaml を指定して Service Account 作成します。
・yaml の例
apiVersion: v1
kind: ServiceAccount
metadata:
name: 【ServiceAccount名】
namespace: 【Namespace名】
annotations:
eks.amazonaws.com/role-arn: 【IAMロールのARN】
Service Account 作成コマンド
kubectl apply -f 【xxxxx.yaml】
指定した namespace に作成されているか確認するコマンド
kubectl get sa -n 【Namespace名】
4. Fluent Bit 設定ファイル作成
Fluent Bit 設定ファイル (fluent-bit.conf)作成
設定ファイルの例
※要件によってカスタムしてください
[SERVICE]
Flush 1
Log_Level info
Daemon off
HTTP_Server On
HTTP_Listen 0.0.0.0
HTTP_Port 2020
[INPUT]
Name tail
Path /var/log/containers/*.log
Parser docker
Tag kube.*
Mem_Buf_Limit 5MB
Skip_Long_Lines On
Refresh_Interval 10
[FILTER]
Name kubernetes
Match kube.*
[OUTPUT]
Name cloudwatch
Match *
region ap-northeast-1
log_group_name /aws/containerinsights/Cluster_Name/application
設定ファイル作成コマンド
kubectl apply -f 【xxxxx.yaml】
5. ConfigMap 作成
クラスター名とログを送信するリージョンを持つ 【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
6. IAM ポリシーを作成しノードグループの IAMロール にアタッチ
Fluent Bit が CloudWatch Logs にログを送信するために必要な IAMポリシーを作成し、EKS クラスターのノードグループのIAMロールにアタッチ
自動作成されたロググループ【/aws/containerinsights/Cluster_Name/application】を指定しています。
・IAMポリシーの例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents",
"logs:DescribeLogGroups",
"logs:DescribeLogStreams",
"logs:GetLogEvents"
],
"Resource": "arn:aws:logs:ap-northeast-1:XXXXXXXXXXXX:log-group:/aws/containerinsights/Cluster_Name/application:*"
}
]
}
7. Fluent Bit のデプロイ
Fluent Bit daemonset を EKS クラスターにダウンロードしてデプロイ
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 の DaemonSet が EKS クラスターにデプロイされます。
まとめ
EKS は Kubernetes を簡単にデプロイし、管理するためのマネージドサービスであり、Fluent Bit を使用することで、コンテナから生成されるログを簡単かつ効率的に収集し、Amazon CloudWatch Logs に送信できます。
この組み合わせは、EKS クラスター内のログ管理を強化し、システムのトラブルシューティングやセキュリティ向上に大きく貢献します。
関連記事
◆ EKSクラスター内のPODからkubectlコマンドを使用してS3コマンド実行
https://cloud5.jp/mk-kubectl-eks-pod-s3/