為您的叢集啟動 AWS Fargate 記錄 - Amazon EKS

協助改進此頁面

若要為本使用者指南貢獻內容,請點選每個頁面右側面板中的在 GitHub 上編輯此頁面連結。

為您的叢集啟動 AWS Fargate 記錄

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

  • 名稱 aws-logging

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

  • 不可超過 5300 個字元。

一旦建立了 ConfigMap,Amazon EKS on Fargate 會使用其自動偵測並設定日誌路由器。Fargate 使用 Fluent Bit 的 AWS 版本,是由 AWS 管理的 Fluent Bit 上游合規發行版本。如需詳細資訊,請參閱 GitHub 上的適用於 Fluent Bit 的 AWS

日誌路由器可讓您使用 AWS 服務廣度進行日誌分析和儲存。您可以直接將日誌從 Fargate 串流至 Amazon CloudWatch 和 Amazon OpenSearch Service。您也可以透過 Amazon Data Firehose 將日誌串流至 Amazon S3Amazon Kinesis Data Streams 與合作夥伴工具等目的地。

日誌路由器組態

重要

若要成功發布日誌,您叢集所在的 VPC 必須具有對日誌目的地的網路存取權。這主要涉及使用者為其 VPC 自訂輸出規則。如需使用 CloudWatch 的範例,請參閱《Amazon CloudWatch Logs 使用者指南》中的搭配介面 VPC 端點使用 CloudWatch Logs

在下列步驟中,使用您自己的值取代每一個範例值

  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 記錄不支援 ConfigMap 的動態組態。ConfigMap 的任何變更僅適用於新的 Pod。變更不會套用至現有 Pod。

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

      注意

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

    CloudWatch

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

    以下範例顯示如何使用 cloudwatch_logs 外掛程式將日誌傳送至 CloudWatch。

    1. 將下列內容儲存到名為 aws-logging-cloudwatch-configmap.yaml 的檔案中。使用叢集所在的 AWS 區域取代 region-code[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
    Amazon OpenSearch Service

    如果您想要將日誌傳送到 Amazon OpenSearch Service,您可以使用 es 輸出,這是用 C 語言編寫的外掛程式。下列範例說明如何使用該外掛程式將日誌傳送到 OpenSearch。

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

      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
    Firehose

    將日誌傳送到 Firehose 時,您有兩個輸出選項:

    • kinesis_firehose:用 C 語言編寫的輸出外掛程式。

    • firehose:用 Golang 編寫的輸出外掛程式。

      以下範例顯示如何使用 kinesis_firehose 外掛程式將日誌傳送到 Firehose。

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

        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. 為 Fargate Pod 執行角色設定許可,以將日誌傳送至目的地。

    1. 將您目的地的 IAM 政策下載到您的電腦。

      CloudWatch

      將 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

      將 OpenSearch IAM 政策下載到您的電腦。您也可以在 GitHub 上檢視政策

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

      確認 OpenSearch Dashboards 的存取控制設定正確。OpenSearch 儀表板中的 all_access role 需要具有 Fargate Pod 執行角色和 IAM 角色映射。必須為 security_manager 角色進行相同的映射。您可以新增先前的映射,方法是選取 MenuSecurityRoles,然後選取個別的角色。如需詳細資訊,請參閱如何對 CloudWatch Logs 進行故障診斷,以便將其串流至我的 Amazon ES 網域?

      Firehose

      將 Firehose IAM 政策下載到您的電腦。您也可以在 GitHub 上檢視政策

      curl -O https://raw.githubusercontent.com/aws-samples/amazon-eks-fluent-logging-examples/mainline/examples/fargate/kinesis-firehose/permissions.json
    2. 從您下載的政策檔案建立 IAM 政策。

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

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

Kubernetes 篩選條件支援

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 程序日誌傳送至帳戶

您可以選擇性地使用以下 ConfigMap 將 Fluent Bit 程序日誌傳送至 Amazon CloudWatch。將 Fluent Bit 處理日誌傳送至 CloudWatch 需要額外的記錄擷取和儲存費用。使用叢集所在的 AWS 區域取代 region-code

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 記錄後,找出為 Amazon EKS 叢集的 Fluent Bit 程序日誌自動建立的 CloudWatch 日誌群組。它遵循格式 my-cluster-fluent-bit-logs

  2. 刪除針對 CloudWatch 日誌群組中每個 Pod 程序日誌所建立的現有 CloudWatch 日誌串流。

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

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

測試應用程式

  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 [...] 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 註釋。在 Pod 註釋中,可參閱是否已啟用或停用記錄功能及其原因的相關資訊。