如何將容器日誌串流至 Amazon EKS 中的 CloudWatch?

上次更新日期:2022 年 5 月 13 日

我想要將 Amazon Elastic Kubernetes Service (Amazon EKS) 中執行的容器日誌串流至 CloudWatch Logs 之類的日誌記錄系統。該如何進行?

簡短描述

您可以使用 Fluent BitFluentd,將日誌從容器傳送至 CloudWatch Logs。Fluent Bit 是 Container Insights 的預設日誌解決方案,因此,最佳實務是使用 Fluent Bit 而不是 Fluentd。Amazon 在 Amazon Elastic Container Registry (Amazon ECR) 上提供 Fluent Bit 容器映像。如需詳細資訊,請參閱 Amazon ECR 上的 cloudwatch-agent

若您將 Fluent Bit 設定為 DaemonSet,以將日誌傳送至 CloudWatch,如果這些日誌群組尚未存在,則 FluentBit 會建立這些日誌群組:

日誌群組名稱 日誌來源
/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 for kubelet.service、kubeproxy.service 和 docker.service 中的日誌

解決方案

先決條件

執行下列步驟之前,請先檢閱先決條件:

  • 您的 EKS 叢集正在執行時,節點處於「就緒」狀態,且 kubectl 命令已安裝並在執行中。
  • 已設定 AWS Identity and Access Management (IAM) 受管 CloudWatchAgentServerPolicy,使您的 Amazon EKS 工作節點能夠將指標和日誌傳送至 CloudWatch。您可以將政策連接至工作節點的 IAM 角色,以執行此操作。或者,將 IAM 角色用於叢集的服務帳戶,然後將政策連接至此角色。如需詳細資訊,請參閱服務帳戶的 IAM 角色
  • 您正在執行支援 Kubernetes 版本 1.18 或更新版本的叢集。這是 Container Insights for EKS Fargate 的要求。此外,您已定義 Fargate 設定檔,以便在 Fargate 上排程 Pod。
  • 已設定 EKS Pod 執行角色,以允許在 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 服務帳戶建立關聯。用 AWS 帳戶 ID 和用於服務帳戶的 IAM 角色取代 ACCOUNT_IDIAM_ROLE_NAME

kubectl annotate serviceaccounts fluent-bit -n cloudwatch-agent "eks.amazonaws.com/role-arn=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME"

如需更多自訂內容,請參閱將 Fluent Bit 設定為 DaemonSet 以將日誌傳送至 CloudWatch Logs

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.    使用 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 IAM 政策來建立 IAM 政策,然後將其連接至針對 Fargate 設定檔指定的 Pod 執行角色。

  • 將 CloudWatch IAM 管理政策下載至您的電腦。您也可以在 GitHub 上檢視此政策
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 設定檔指定的 Pod 執行角色。請用您的帳戶 ID 取代 111122223333。
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 Pod 的串流日誌

若要停用 EKS Fargate Pod 的串流記錄,請執行下列命令:

kubectl delete namespace aws-observability

刪除 aws-observability 命名空间之后,刪除 Pod 並重新部署。


此文章是否有幫助?


您是否需要帳單或技術支援?