跳至内容

如何在 Amazon EKS 中将容器日志流式传输到 CloudWatch?

3 分钟阅读
0

我想使用 Fluent Bit 或 Fluentd 将在 Amazon Elastic Kubernetes Service (Amazon EKS) 中运行的容器的日志流式传输到 Amazon CloudWatch Logs。

简短描述

由于 Fluent Bit 是 CloudWatch Container Insights 的默认日志解决方案,因此最佳做法是使用 Fluent Bit 而不是 Fluentd。Amazon 在 Amazon Elastic Container Registry (Amazon ECR) 上提供了 Fluent Bit 容器映像。有关详细信息,请参阅 Amazon ECS 的 AWS for Fluent Bit 映像存储库

要下载 Fluent Bit,请参阅 Fluent Bit 网站上的 Getting started with Fluent Bit。要下载 Fluentd,请参阅 Fluentd 网站上的 Download Fluentd

当您将 Fluent Bit 设置为 DaemonSet 以将日志发送到 CloudWatch 时,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. 要创建名为 fluent-bit-cluster-info 的 ConfigMap(其中包含集群名称和要向其发送日志的 AWS 区域),请运行以下命令:

    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,请运行以下 aws-for-fluent-bit DaemonSet 命令:

    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 命名空间中的容器组 (pod) 名称,请运行以下命令:

    kubectl get pods -n amazon-cloudwatch

    **注意:**容器组 (pod) 名称以 fluent-bit-***** 的形式返回。

  2. 要检查事件输出,请运行以下命令:

    kubectl describe pod POD_NAME -n amazon-cloudwatch

    **注意:**请将 POD_NAME 替换为您的容器组 (pod) 的名称。

  3. 要查看日志,请运行以下命令:

    kubectl logs pod-name -n amazon-cloudwatch

    **注意:**请将 POD_NAME 替换为您的容器组 (pod) 的名称。

删除 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 托管式策略。然后,将该 IAM 策略附加到您为 Fargate 配置文件指定的容器组 (pod) 执行角色。

    要下载 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

    将 IAM 策略附加到您为 Fargate 配置文件指定的容器组 (pod) 执行角色,请运行以下 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 容器组 (pod) 的流式传输日志功能

要关闭 Fargate 上 EKS 容器组 (pod) 的流式传输日志功能,请运行以下命令:

kubectl delete namespace aws-observability

删除容器组 (pod),然后在删除 aws-observability 命名空间后重新部署这些容器组。