如何將容器日誌串流至 Amazon EKS 中的 CloudWatch?
我想要將 Amazon Elastic Kubernetes Service (Amazon EKS) 中執行的容器日誌串流至 CloudWatch Logs 之類的日誌記錄系統。該如何進行?
簡短描述
您可以使用外部資源 Fluent Bit 或 Fluentd,將日誌從容器傳送至 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_ID 和 IAM_ROLE_NAME。
kubectl annotate serviceaccounts fluent-bit -n amazon-cloudwatch "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 並重新部署。
相關資訊
相關內容
- 已提問 23 天前lg...
- 已提問 1 個月前lg...
- 已提問 10 個月前lg...
- AWS 官方已更新 1 年前
- AWS 官方已更新 5 個月前
- AWS 官方已更新 5 個月前