Amazon EKS で CloudWatch にコンテナログをストリーミングする方法を教えてください。

所要時間3分
0

Fluent Bit または Fluentd を使用して、Amazon Elastic Kubernetes Service (Amazon EKS) で実行しているコンテナのログを Amazon CloudWatch Logs にストリーミングしようとしています。

簡単な説明

Fluent Bit が CloudWatch Container Insights のデフォルトのログソリューションであるため、Fluentd ではなく Fluent Bit を使用することをおすすめします。Amazon は、Amazon Elastic Container Registry (Amazon ECR) に Fluent Bit のコンテナイメージを提供しています。詳細については、「Amazon ECS 用の AWS for Fluent Bit イメージリポジトリ」を参照してください。

Fluent Bit をダウンロードする方法については、Fluent Bit のウェブサイトで「Fluent Bit の始め方」を参照してください。Fluentd については、Fluentd のウェブサイトで「Fluentd のダウンロード」を参照してください。

ログを CloudWatch に送信するために Fluent Bit を DaemonSet として設定する際、Fluent Bit は次のロググループおよびソースを作成します。

  • /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 ログのソースは、kubelet.servicekubeproxy.servicedocker.service に関する /var/log/journal 内のログです。

解決策

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。

Amazon EC2 クラスター上の Amazon EKS で実行するコンテナのログをストリーミングする

次の手順を実行します。

  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. クラスター名とログの送信先の AWS リージョンを含む、fluent-bit-cluster-info という名前の ConfigMap を作成するには、次のコマンドを実行します。

    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

    注: 実際のものでそれぞれ、my-cluster-namemy-cluster-region をクラスター名とリージョンに置き換えます。

  3. Fluent Bit を使用して Amazon Elastic Compute Cloud (Amazon EC2) クラスターにログを送信するには、次の 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. (オプション) Amazon ECR で Fluent Bit を使用するには、次の DaemonSet コマンド 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. サービスアカウント用の AWS Identity and Access Management ロール (IRSA) を作成するには、次の eksctl コマンドを実行します。

    eksctl create iamserviceaccount \
        --name fluent-bit \
        --namespace amazon-cloudwatch \
        --cluster $CLUSTER \
        --attach-policy-arn "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy" \
        --approve \
        --override-existing-serviceaccounts

    詳細については、「Fluent Bit を DaemonSet として設定し、CloudWatch Logs にログを送信する」を参照してください。

Fluent Bit のデプロイに関するトラブルシューティング

次の手順を実行します。

  1. amazon-cloudwatch 名前空間のポッド名を一覧表示するには、次のコマンドを実行します。

    kubectl get pods -n amazon-cloudwatch

    注: ポッド名は、fluent-bit-***** と返されます。

  2. イベントの出力を確認するには、次のコマンドを実行します。

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    注: POD_NAME は、実際のポッド名に置き換えます。

  3. ログを確認するには、次のコマンドを実行します。

    kubectl logs pod-name -n amazon-cloudwatch

    注: POD_NAME は、実際のポッド名に置き換えます。

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

Fargate クラスター上の Amazon EKS で実行するコンテナのログをストリーミングする

AWS Fargate クラスター上の Amazon EKS には、Fluent Bit をベースにしたログルーターが組み込まれています。AWS はユーザーに代わって自動的に Fluent Bit を実行します。詳細については、「クラスターで AWS 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. Fluent Conf のデータ値を使用してConfigMap を作成し、コンテナログを CloudWatch Logs にストリーミングするには、次のコマンドを実行します。

    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 用の AWS マネージドポリシーを作成します。次に、Fargate プロファイルに指定したポッド実行ロールに IAM ポリシーをアタッチします。

    IAM ポリシーファイルをダウンロードするには、次のコマンドを実行します。

    curl -o permissions.json https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json

    ポリシーファイルから IAM ポリシーを作成するには、次の create-policy コマンドを実行します。

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json

    Fargate プロファイルに指定したポッド実行ロールに IAM ポリシーをアタッチするには、次の attach-role-policy コマンドを実行します。

    aws iam attach-role-policy \
    --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \
    --role-name your-pod-execution-role

    注: 111122223333 は、実際の アカウント ID に置き換えます。

    詳細については、「トラブルシューティング」を参照してください。

Fargate ポッドで EKS ログのストリーミングを無効にする

Fargate ポッドで EKS ログのストリーミングを無効にするには、次のコマンドを実行します。

kubectl delete namespace aws-observability

ポッドを削除し、aws-observability 名前空間を削除してから、ポッドを再デプロイします。

コメントはありません

関連するコンテンツ