Amazon EKS で CloudWatch にコンテナログをストリーミングするにはどうすればよいですか?

所要時間3分
0

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_IDIAM_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 プロファイルに指定されているポッド実行ロールにアタッチします。

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 名前空間を削除した後に再デプロイします。


関連情報

Container Insights の使用

AWS公式
AWS公式更新しました 2年前