跳至內容

如何將容器日誌串流傳輸到 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 網站上的 Fluent Bit 入門。有關 Fluentd,請參閱 Fluentd 網站上的下載 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: 日誌來源是 /var/log/journal 中的日誌,包含 kubelet.servicekubeproxy.servicedocker.service

解決方法

**注意:**如果您在執行 AWS Command Line Interface (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. 若要[為服務帳戶 (IRSA) 建立 AWS Identity and Access Management 角色](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html),請執行下列 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 Pod 上 EKS 的串流日誌

若要關閉 Fargate Pod 上 EKS 的串流日誌,請執行以下命令:

kubectl delete namespace aws-observability

刪除 Pod,然後在刪除 aws-observability 命名空間後重新部署它們。