Fargate 記錄 - Amazon EKS

協助改善此頁面

想要為此使用者指南做出貢獻嗎? 捲動至此頁面底部,然後選取 [編輯此頁面於] GitHub。您的貢獻將有助於使我們的用戶指南更適合所有人。

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Fargate 記錄

重要

AWS Fargate Amazon EKS 在 AWS GovCloud (美國東部)和 AWS GovCloud (美國西部)中不可用。

Amazon EKS on Fargate 提供了基於 Fluent Bit 的內建日誌路由器。這意味著您沒有明確地執行 Fluent Bit 容器以作為輔助,但 Amazon 會為您執行。您只需設定日誌路由器即可。組態會透過必須符合以下條件的專用 ConfigMap 生效:

  • 名稱 aws-logging

  • 在名為 aws-observability 的專用命名空間中建立

  • 不能超過 5300 個字元。

一旦建立了 ConfigMap,Amazon EKS on Fargate 會使用其自動偵測並設定日誌路由器。Fargate 使用的版本 AWS 為Fluent Bit,這是由Fluent Bit AWS管理的上游相容發行版本。有關更多內容,敬請參閱(AWS 詳Fluent Bit見) GitHub。

日誌路由器允許您使用的服務廣度進行日誌 AWS 分析和存儲。您可以將日誌從 Fargate 直接流式傳輸到 Amazon CloudWatch Amazon OpenSearch 服務。您也可以透過 Amazon 資料 Fire hose,將日誌串流到 Amazon S3Amazon Kinesis 資料串流和合作夥伴工具等目的地。

必要條件

日誌路由器組態

設定日誌路由器

在以下步驟中,使用自己的值取代每一個 example value

  1. 建立名為 aws-observability 的專用 Kubernetes 命名空間。

    1. 將下列內容儲存到電腦上名為 aws-observability-namespace.yaml 的檔案中。name 的值必須為 aws-observability,且需要 aws-observability: enabled 標籤。

      kind: Namespace apiVersion: v1 metadata: name: aws-observability labels: aws-observability: enabled
    2. 建立命名空間。

      kubectl apply -f aws-observability-namespace.yaml
  2. 建立具有 Fluent Conf 資料值的 ConfigMap,將容器日誌寄送至目的地。Fluent Conf 就是 Fluent Bit,這是一種快速且輕量的日誌處理器組態語言,用於將容器日誌路由至您選擇的日誌目的地。如需詳細資訊,請參閱 Fluent Bit 文件中的組態檔案

    重要

    一般 Fluent Conf 中包含的主要區段是 ServiceInputFilterOutput。然而,Fargate 日誌路由器僅接受:

    • FilterOutput 區段。

    • Parser 區段。

    如果您提供任何其他區段,則這些區段將被拒絕。

    Fargate 日誌路由器管理 ServiceInput 區段。其具有下列 Input 區段,無法修改,也不需要在您的 ConfigMap 中。但是,您可以從中取得洞察,例如記憶體緩衝區限制和套用於日誌的標籤。

    [INPUT] Name tail Buffer_Max_Size 66KB DB /var/log/flb_kube.db Mem_Buf_Limit 45MB Path /var/log/containers/*.log Read_From_Head On Refresh_Interval 10 Rotate_Wait 30 Skip_Long_Lines On Tag kube.*

    建立 ConfigMap 時,請考慮下列 Fargate 用來驗證欄位的規則:

    • 應該在每個相應的索引鍵下指定 [FILTER][OUTPUT][PARSER]。例如,[FILTER] 必須位於 filters.conf 之下。您可以在 filters.conf 下有一或多個 [FILTER][OUTPUT][PARSER] 區段也應該位於其相應的索引鍵之下。透過指定多個 [OUTPUT] 區段中,您可以同時將日誌路由到不同的目的地。

    • Fargate 驗證每個區段所需的索引鍵。Namematch 對於每個 [FILTER][OUTPUT] 都是必要項目。Nameformat 對於每個 [PARSER] 都是必要項目。索引鍵不區分大小寫。

    • ConfigMap 中不允許環境變數 (例如:${ENV_VAR})。

    • 在每個 filters.confoutput.confparsers.conf 中每個指令或鍵值對的縮排必須是相同的。鍵值對必須比指令縮排更多。

    • Fargate 會根據以下支援的篩選條件進行驗證:grepparserrecord_modifierrewrite_tagthrottlenestmodifykubernetes

    • Fargate 會根據以下支援的輸出進行驗證:esfirehosekinesis_firehosecloudwatchcloudwatch_logskinesis

    • 必須在 ConfigMap 中提供至少一個支援的 Output 外掛程式來啟用記錄。啟用記錄時不需要 FilterParser

    您也可以使用所需的組態在 Amazon EC2 上執行 Fluent Bit,以對因驗證而產生的任何問題進行故障診斷。使用下列範例之一建立您的 ConfigMap

    重要

    Amazon EKS Fargate 記錄不支援 ConfigMaps 的動態組態。ConfigMaps 的任何變更僅會套用於新的 Pods。變更不會套用至現有 Pods。

    使用您所需的日誌目的地範例建立 ConfigMap

    注意

    您也可以將 Amazon Kinesis Data Streams 用於您的日誌目的地。如果您使用 Kinesis Data Streams,請確定 Pod 執行角色已獲 kinesis:PutRecords 許可。如需詳細資訊,請參閱《Fluent Bit:官方手冊》中的 Amazon Kinesis Data Streams 許可

    CloudWatch

    建立適用於 CloudWatch 的 ConfigMap

    使用時有兩個輸出選項 CloudWatch:

    下列範例說明如何使用cloudwatch_logs外掛程式將記錄檔傳送至 CloudWatch。

    1. 將下列內容儲存到名為 aws-logging-cloudwatch-configmap.yaml 的檔案中。region-code以叢集所 AWS 區域 在的位置取代。[OUTPUT] 下的參數為必要項目。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: flb_log_cw: "false" # Set to true to ship Fluent Bit process logs to CloudWatch. filters.conf: | [FILTER] Name parser Match * Key_name log Parser crio [FILTER] Name kubernetes Match kube.* Merge_Log On Keep_Log Off Buffer_Size 0 Kube_Meta_Cache_TTL 300s output.conf: | [OUTPUT] Name cloudwatch_logs Match kube.* region region-code log_group_name my-logs log_stream_prefix from-fluent-bit- log_retention_days 60 auto_create_group true 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
    2. 將清單檔案套用至叢集。

      kubectl apply -f aws-logging-cloudwatch-configmap.yaml
    3. 將 CloudWatch IAM 政策下載到您的電腦。您也可以在上檢視原則 GitHub。

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/cloudwatchlogs/permissions.json
    Amazon OpenSearch Service

    要創建一ConfigMap個 Amazon OpenSearch 服務

    如果您想將日誌發送到 Amazon OpenSearch 服務,則可以使用 es 輸出,這是一個插件C。下列範例說明如何使用外掛程式將記錄檔傳送至 OpenSearch。

    1. 將下列內容儲存到名為 aws-logging-opensearch-configmap.yaml 的檔案中。使用您自己的值取代每一個 ‭example value‬。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name es Match * Host search-example-gjxdcilagiprbglqn42jsty66y.region-code.es.amazonaws.com Port 443 Index example Type example_type AWS_Auth On AWS_Region region-code tls On
    2. 將清單檔案套用至叢集。

      kubectl apply -f aws-logging-opensearch-configmap.yaml
    3. 將 OpenSearch IAM 政策下載到您的電腦。您也可以在上檢視原則 GitHub。

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/amazon-elasticsearch/permissions.json

      請確定 OpenSearch 儀表板的存取控制已正確設定。 OpenSearch 儀表板all_access role中必須具有 Fargate Pod 執行角色和對應的 IAM 角色。必須為 security_manager 角色進行相同的映射。您可以新增先前的映射,方法是選取 MenuSecurityRoles,然後選取個別的角色。如需詳細資訊,請參閱如何對 CloudWatch 日誌進行疑難排解,以便將其串流到 Amazon ES 網域?

    Firehose

    若要建立ConfigMap適用於 Firehose 的步驟

    將記錄傳送至 Firehose 時,您有兩個輸出選項:

    下列範例說明如何使用kinesis_firehose外掛程式將記錄檔傳送至 Firehose。

    1. 將下列內容儲存到名為 aws-logging-firehose-configmap.yaml 的檔案中。region-code以叢集所 AWS 區域 在的位置取代。

      kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability data: output.conf: | [OUTPUT] Name kinesis_firehose Match * region region-code delivery_stream my-stream-firehose
    2. 將清單檔案套用至叢集。

      kubectl apply -f aws-logging-firehose-configmap.yaml
    3. 將 Firehose 身分與存取權管理政策下載到您的電腦。您也可以在上檢視原則 GitHub。

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
  3. 使用上一個步驟中下載的政策檔案,建立 IAM 政策。

    aws iam create-policy --policy-name eks-fargate-logging-policy --policy-document file://permissions.json
  4. 使用下列命令,將 IAM 政策連接至為 Fargate 設定檔指定的 Pod 執行角色。使用您的帳戶 ID 取代 111122223333。將 AmazonEKSFargatePodExecutionRole 取代為您的 Pod 執行角色 (如需詳細資訊,請參閱 建立 Fargate Pod 執行角色)。

    aws iam attach-role-policy \ --policy-arn arn:aws:iam::111122223333:policy/eks-fargate-logging-policy \ --role-name AmazonEKSFargatePodExecutionRole

Kubernetes 篩選條件支援

此功能需要符合以下最低的 Kubernetes 版本和平台層級要求,或使用更新的版本。

Kubernetes 版本 平台層級
1.23 版和更新版本 eks.1

Fluent Bit Kubernetes 篩選條件允許您將 Kubernetes 中繼資料新增至您的日誌檔案。如需有關篩選條件的相關資訊,請參閱 Fluent Bit 說明文件中的 Kubernetes。您可以使用 API 伺服器端點來套用篩選條件。

filters.conf: | [FILTER] Name kubernetes Match kube.* Merge_Log On Buffer_Size 0 Kube_Meta_Cache_TTL 300s
重要
  • Kube_URLKube_CA_FileKube_Token_CommandKube_Token_File 是服務擁有的組態參數,您無法指定這些參數。Amazon EKS Fargate 會將這些值填入。

  • Kube_Meta_Cache_TTL 是 Fluent Bit 等待直到其可以與 API 伺服器通訊,以取得最新中繼資料所需的時間。若並未指定 Kube_Meta_Cache_TTL,則 Amazon EKS Fargate 會附加預設值 30 分鐘,以減少 API 伺服器上的負載。

將 Fluent Bit 程序日誌傳送至帳戶

您可以選擇 CloudWatch 使用以下命令將Fluent Bit流程日誌運送到 Amazon ConfigMap。傳送 Fluent Bit 處理記錄以 CloudWatch需要額外的記錄擷取和儲存成本。region-code以叢集所 AWS 區域 在的位置取代。

kind: ConfigMap apiVersion: v1 metadata: name: aws-logging namespace: aws-observability labels: data: # Configuration files: server, input, filters and output # ====================================================== flb_log_cw: "true" # Ships Fluent Bit process logs to CloudWatch. output.conf: | [OUTPUT] Name cloudwatch Match kube.* region region-code log_group_name fluent-bit-cloudwatch log_stream_prefix from-fluent-bit- auto_create_group true

記錄位於叢集 AWS 區域 所在的位置 CloudWatch。日誌群組的名稱是 my-cluster-fluent-bit-logs,而 Fluent Bit logstream 的名稱是 fluent-bit-podname-pod-namespace

注意
  • 只有當 Fluent Bit 程序成功啟動時,才會傳送程序日誌。若在啟動 Fluent Bit 時失敗,程序日誌就會遺失。您只能將處理日誌運送到 CloudWatch。

  • 若要對您帳戶的傳送程序日誌除錯,您可以套用先前的 ConfigMap 以取得程序日誌。Fluent Bit 無法啟動通常是由於您的 ConfigMap 在啟動時未被 Fluent Bit 解析或接受。

停止傳送 Fluent Bit 處理日誌

傳送Fluent Bit程序記錄 CloudWatch 需要額外的記錄擷取和儲存費用。若要排除現有 ConfigMap 設定中的處理日誌,請執行下列步驟。

  1. 在啟用 Fargate 記 CloudWatch 錄之後,找出為 Amazon EKS 叢集Fluent Bit處理日誌自動建立的日誌群組。它遵循格式 {cluster_name}-fluent-bit-logs

  2. 刪除記 CloudWatch 錄群組中每個Pod's處理程序記錄所建立的現有記 CloudWatch 錄資料流。

  3. 編輯 ConfigMap 和設定 flb_log_cw: "false"

  4. 重新啟動叢集中的任何現有 Pods。

測試應用程式

  1. 部署範例 Pod。

    1. 將下列內容儲存到電腦上名為 sample-app.yaml 的檔案中。

      apiVersion: apps/v1 kind: Deployment metadata: name: sample-app namespace: same-namespace-as-your-fargate-profile spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - name: http containerPort: 80
    2. 將清單檔案套用至叢集。

      kubectl apply -f sample-app.yaml
  2. 使用您在 ConfigMap 中設定的目的地檢視 NGINX 日誌。

大小考量因素

建議您為日誌路由器規劃最多 50 MB 的記憶體。如果您希望應用程式以非常高的輸送量產生日誌,則應該規劃最多 100 MB。

故障診斷

若要確認記錄功能是因某些原因 (例如無效的 ConfigMap,以及無效的原因) 啟用或停用,請使用 kubectl describe pod pod_name 檢查您的 Pod 事件。輸出可能包含可釐清是否已啟用記錄的 Pod 事件,例如下列範例輸出。

[...] Annotations: CapacityProvisioned: 0.25vCPU 0.5GB Logging: LoggingDisabled: LOGGING_CONFIGMAP_NOT_FOUND kubernetes.io/psp: eks.privileged [...] Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning LoggingDisabled <unknown> fargate-scheduler Disabled logging because aws-logging configmap was not found. configmap "aws-logging" not found

Pod 事件是暫時性的,具體取決於設定的時段。您也可以使用 kubectl describe pod pod-name 來檢視 Pod's 註釋。在 Pod 註釋中,可參閱是否已啟用或停用記錄功能,及其原因的相關資訊。