Amazon EKS で CloudWatch にコンテナログをストリーミングするにはどうすればよいですか?
Amazon Elastic Kubernetes Service (Amazon EKS) で実行されているコンテナログを CloudWatch Logs のようなログ記録システムにストリーミングしたいと考えています。どうすればよいですか?
簡単な説明
外部リソースの Fluent Bit または Fluentd を使用して、コンテナから CloudWatch Logs にログを送信できます。Fluent Bit は Container Insights のデフォルトのログソリューションであるため、Fluentd の代わりに Fluent Bit を使用するのがベストプラクティスです。Amazon は、Amazon Elastic Container Registry (Amazon ECR) で Fluent Bit コンテナイメージを提供しています。詳細については、Amazon ECR の「cloudwatch-agent」を参照してください。
CloudWatch にログを送信する DaemonSet として Fluent Bit を設定すると、FluentBit は次のロググループを作成します (まだ存在しない場合)。
| ロググループ名 | ログソース | | /aws/containerinsights/ Cluster_Name/application | All log files in /var/log/containers | | /aws/containerinsights/ Cluster_Name/host | Logs from /var/log/dmesg, /var/log/secure, and /var/log/messages | | /aws/containerinsights/ Cluster_Name/dataplane | The logs in /var/log/journal for kubelet.service, kubeproxy.service, and docker.service |
解決方法
前提条件
これらの手順を実行する前に、次の前提条件を確認してください。
- EKS クラスターは Ready 状態のノードで実行されており、kubectl コマンドがインストールされ実行されていること。
- AWS Identity and Access Management (IAM) が管理する CloudWatchAgentServerPolicy は、Amazon EKS ワーカーノードがメトリクスとログを CloudWatch に送信できるようにするために用意されていること。これを行うには、ワーカーノードの IAM ロールにポリシーをアタッチします。または、クラスターのサービスアカウントに IAM ロールを使用し、このロールにポリシーをアタッチします。詳細については、「サービスアカウントの IAM ロール」を参照してください。
- Kubernetes バージョン 1.18 以上をサポートするクラスターを実行していること。これは EKS Fargate の Container Insights の要件です。また、Fargate でポッドをスケジュールする Fargate プロファイルを定義したこと。
- EKS ポッドの実行ロールは、Fargate インフラストラクチャで実行されるコンポーネントがユーザーに代わって AWS API を呼び出すことができるように設定されています。Amazon ECR からコンテナイメージを取得するのがその例です。
EKS EC2 クラスターで実行中のコンテナログをストリーミングする
コンテナログを CloudWatch Logs にストリーミングするには、以下の手順に従って AWS for Fluent Bit をインストールします。
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. このコマンドを実行して、fluent-bit-cluster-info という名前の ConfigMap を作成します。これには、ログの送信先のクラスター名とリージョンが含まれます。my-cluster-name と my-cluster-region をお使いのクラスターの名前とリージョンに置き換えます。
ClusterName=<my-cluster-name> RegionName=<my-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
3. 次のように、Fluent Bit 最適化設定 DaemonSet をクラスターにデプロイします。
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
4. オプション: aws-for-fluent-bit DaemonSet にパッチを適用して、Amazon Elastic Container Registry で AWS for Fluent Bit イメージを使用します。
kubectl patch ds fluent-bit -n amazon-cloudwatch -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"fluent-bit","image":"public.ecr.aws/aws-observability/aws-for-fluent-bit:latest"}]}}}}'
5. サービスアカウントの IAM ロールについては、OIDC プロバイダーと IAM ロールとポリシーを作成します。次に、IAM ロールを cloudwatch-agent と fluent-bit サービスアカウントに関連付けます。ACCOUNT_ID と IAM_ROLE_NAME をサービスアカウントに使用する AWS アカウント ID と IAM ロールに置き換えます。
kubectl annotate serviceaccounts fluent-bit -n amazon-cloudwatch "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"
さらにカスタマイズするには、「CloudWatch Logs にログを送信する DaemonSet として Fluent Bit をセットアップする」を参照してください。
Fluent Bit デプロイをトラブルシューティングする
1. 次のコマンドを実行し、出力の下部にあるイベントを確認します。
kubectl describe pod pod-name -n amazon-cloudwatch
2. 次のコマンドを実行し、ログを確認します。
kubectl logs pod-name -n amazon-cloudwatch
Fluent Bit デプロイを削除する
Fluent Bit デプロイを削除するには、次のコマンドを実行します。
kubectl delete configmap fluent-bit-cluster-info -n amazon-cloudwatch kubectl delete -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
EKS Fargate クラスターで実行中のコンテナログをストリーミングする
Amazon EKS on Fargate には、Fluent Bit に基づく組み込みのログルーターがあります。これは、Fluent Bit コンテナをサイドカーとして明示的に実行しないことを意味します。代わりに、Amazon がユーザーのためにそれを実行します。詳細については、「Fargate ログ記録」を参照してください。
コンテナログを CloudWatch Logs にストリーミングするには、次の手順に従います。
1. 次のように、aws-observability という専用の Kubernetes 名前空間を作成します。
cat <<EOF > aws-observability-namespace.yaml kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled EOF kubectl apply -f aws-observability-namespace.yaml
2. コンテナログを CloudWatch Logs に送るには、Fluent Conf データ値を持つ ConfigMap を作成します。
cat <<EOF > aws-logging-cloudwatch-configmap.yaml kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name cloudwatch_logs Match * region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true log_key log parsers.conf: | [PARSER] Name crio Format Regex Regex ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>P|F) (?<log>.*)$ Time_Key time Time_Format %Y-%m-%dT%H:%M:%S.%L%z filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio EOF kubectl apply -f aws-logging-cloudwatch-configmap.yaml
3. CloudWatch IAM ポリシーを使用して IAM ポリシーを作成し、Fargate プロファイルに指定されているポッド実行ロールにアタッチします。
- CloudWatch IAM ポリシーをコンピュータにダウンロードします。ポリシーは GitHub でも表示できます。
curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
- ダウンロードしたポリシーファイルから IAM ポリシーを作成します。
aws iam create-policy —policy-name eks-fargate-logging-policy —policy-document file://permissions.json
- IAM ポリシーを Fargate プロファイルに指定されているポッド実行ロールにアタッチします。111122223333 をお客様のアカウント ID に置き換えます。
aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name your-pod-execution-role
EKS Fargate で実行されている AWS Fluent Bit のトラブルシューティングの詳細については、「トラブルシューティング」ページを参照してください。
EKS Fargate ポッドのストリーミングログを無効にする
EKS Fargate ポッドのストリーミングログを無効にするには、次のコマンドを実行します。
kubectl delete namespace aws-observability
ポッドを削除し、aws-observability 名前空間を削除した後に再デプロイします。
関連情報
関連するコンテンツ
- 質問済み 2ヶ月前lg...
- 質問済み 9ヶ月前lg...
- 質問済み 1年前lg...
- 質問済み 8ヶ月前lg...
- AWS公式更新しました 3年前
- AWS公式更新しました 1年前