AWS Builder Center: Learn, Build and Connect with builders in the AWS community
AWS Builder Center is the official home for builders on AWS. Share and read what others are working on, follow people who inspire you, explore training and workshops, and find tools to support what you're building.
如何將容器日誌串流傳輸到 Amazon EKS 中的 CloudWatch?
我想使用 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.service、kubeproxy.service 和 docker.service。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
在 Amazon EC2 叢集上 Amazon EKS 中執行的串流容器日誌
請完成下列步驟:
-
若要建立名為 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 -
若要建立名為 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-name 和 my-cluster-region 替換為您叢集的名稱和區域。
-
若要使用 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 -
(選用) 若要在 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"}]}}}}' -
若要[為服務帳戶 (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 部署進行疑難排解
請完成下列步驟:
-
若要列出 amazon-cloudwatch 命名空間中的 Pod名稱,請執行下列命令:
kubectl get pods -n amazon-cloudwatch**注意:**Pod 名稱會以 fluent-bit-***** 形式傳回。
-
若要查看事件輸出,請執行以下命令:
kubectl describe pod POD_NAME -n amazon-cloudwatch**注意:**將 POD_NAME 替換為您 Pod 的名稱。
-
若要查看日誌,請執行以下命令:
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,請完成以下步驟:
-
若要建立名為 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 -
若要建立具有 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 -
為 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 命名空間後重新部署它們。
