天天看點

AWS ECS On Fargate 監控可觀測最佳實踐

作者:觀測雲

概述

Amazon ECS on Fargate 為使用者提供了簡單、高效且可靠的容器化解決方案,使使用者能夠專注于應用程式開發和運作,而無需擔心基礎設施管理的複雜性。與其同時,使用者需要實時了解在該環境中應用程式運作的性能、可用性、健康狀況和資源使用情況。進而能夠及時發現潛在問題并采取措施,幫助使用者優化資源使用、感覺問題和識别瓶頸等,以提高整體性能和使用者體驗。

觀測雲全面支援在 Amazon ECS on Fargate 上的可觀測能力,提供包括對基礎資源的監控、應用程式鍊路跟蹤和日志監控等。文章将對在該環境上如何實作可觀測進行說明和展示。

Amazon ECS On Fargate 簡介

Amazon Elastic Container Service (Amazon ECS) 是一種高度可擴充、高性能的容器編排服務,支援 Docker 容器,可以輕松運作和擴充容器化應用程式。Amazon ECS 與Fargate 相結合,提供了一種無需管理基礎設施的方式來運作容器。

Fargate 是一種無伺服器計算引擎,可以在 Amazon ECS 中運作容器。它允許您在不需要預置或管理伺服器的情況下運作容器。Fargate 負責管理底層的計算基礎設施,如虛拟機、核心更新檔、安全更新等。您隻需要關注容器化應用程式的打包和部署。

使用 Amazon ECS 和 Fargate 的主要優勢包括:

  • 無伺服器:不需要預置或管理基礎設施,可以快速啟動和擴充容器化應用程式。
  • 簡單性:不需要管理底層的作業系統、叢集或虛拟機。Fargate 負責管理基礎設施。
  • 可擴充性:可以根據應用程式需求自動擴充和縮減容器執行個體。
  • 高可用性: Fargate 跨多個可用區域運作容器,提供高可用性。
  • 安全性: Fargate 提供了安全的計算環境,并與 AWS 安全服務內建。
  • 內建:與其他亞馬遜雲服務(如 ALB、CloudWatch、IAM 等)無縫內建。

Amazon ECS 與 AWS Fargate 結合使用,可以幫助您更輕松地部署、管理和擴充容器化應用程式,而無需擔心底層基礎設施的管理。這種無伺服器的方式可以降低運維成本,提高資源使用率,加快應用程式的傳遞速度。

AWS ECS On Fargate 中的監控資料采集說明

DataKit 是觀測雲的一款開源、一體式的資料采集 OneAgent,它提供全平台作業系統(Linux/Windows/macOS)的支援,擁有全面資料采集能力,涵蓋主機、容器、中間件、Tracing、日志等各種資料采集的能力。

在 ECS 環境中,将通過 DataKit 進行監控資料采集,并上傳到觀測雲。

AWS ECS On Fargate 監控可觀測最佳實踐

如上圖所示,在 ECS On Fargate 的環境中,在每一個需要接入可觀測資料的 ECS 任務中,除了業務容器外,都需要配置一一對應的 DataKit 和 Log-router 容器。DataKit 會負責采集運作任務中容器的運作名額,應用的鍊路資料等。日志資料通過 Log-router(Amazon Firelens - Fluent-bit )的方式進行采集,并把采集的日志資料通過 logstream 的方式傳輸給 DataKit,并由 DataKit 進行資料處理後最終上傳給觀測雲進行後續的查詢和分析。各類型監控資料采集的進一步說明如下:

名額采集

DataKit 支援通過環境變量參數 “ENV_ECS_FARGATE: on” 的設定開啟 AWS ECS Fargate 相關的運作名額。同時,支援通過 DataKit 中的 “statsd” 采集子產品來對例如 Java 應用的 JVM 運作名額、NodeJS 應用的 rumetime 運作名額等進行采集和監控分析。

鍊路采集

在 AWS ECS 環境中,應用容器在啟動時,通過加載 ddtrace agent 的方式産生對應的調用鍊路資料,并發送給 DataKit。DataKit 作為 Sidecar 與應用容器運作在同一個 Amazon ECS 任務中來接收應用産生的鍊路資料,并上傳到觀測雲中進行查詢分析。

日志采集

在 AWS ECS 環境中,通過 AWS FireLens(Fluent-Bit 插件) 作為 Sidecar 與應用容器運作在同一個 Amazon ECS 任務中來采集應用日志資料,并把采集到的日志資料發送給 datakit 的 logstream 采集子產品,并最終上傳觀測雲中進行日志的查詢和分析。無需修改應用部署腳本,手動安裝額外軟體或編寫其他代碼。

AWS ECS 任務配置說明

該部分将對如何在 ECS On Fargate 環境中進行觀測資料采集的部署配置進行說明。

前置條件

應用鏡像

以 Java 應用為例,如果需要采集 Java 應用的調用鍊路資料,需要在應用的鏡像中提前加入 ddtrace java agent 檔案,并預留一個 Java 的定制化啟動參數入口,友善後續對啟動參數通過環境變量進行靈活調整。如下是這部分在 dockerfile 中的示例:

Bash
COPY dd-java-agent.jar /dd-java-agent.jar
ENTRYPOINT ["sh", "-ec", "exec java ${JAVA_OPTS} -jar ${your_app.jar}"]
           

觀測雲提供的最新 Java DDTrace agent 的下載下傳連結位址:

https://static.guance.com/dd-image/dd-java-agent.jar

建立 ECS 任務定義

在同一個 AWS ECS 任務中,将建立三個容器,分别是應用容器、datakit 容器和 log-router 容器。詳細的容器配置說明如下:

應用容器

應用容器 Json 格式的配置資訊如下:

Bash
        {
            "name": "javatest",
            "image": "registry.cn-xxx.com/test/javatest:v2.0",
            "cpu": 1024,
            "portMappings": [
                {
                    "name": "javservice",
                    "containerPort": 9080,
                    "hostPort": 9080,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "essential": true,
            "environment": [
                {
                    "name": "DD_SERVICE",
                    "value": "java_service"
                },
                {
                    "name": "DD_ENV",
                    "value": "test"
                },
                {
                    "name": "JAVA_OPTS",
                    "value": "-javaagent:/dd-java-agent.jar"
                },
                {
                    "name": "DD_AGENT_HOST",
                    "value": "localhost"
                },
                {
                    "name": "DD_TRACE_AGENT_PORT",
                    "value": "9529"
                }
            ],
            "mountPoints": [],
            "volumesFrom": [],
            "logConfiguration": {
                "logDriver": "awsfirelens",
                "options": {
                    "Format": "json",
                    "Host": "localhost",
                    "Name": "http",
                    "Port": "9529",
                    "URI": "/v1/write/logstreaming?type=firelens&source=java&service=javatest&tags=project=test,app_name=java_app,cloud=amazon"
                }
            },
            "systemControls": []
        }      
           

這裡有兩個主要的配置項,說明如下:

  • 通過 environment 變量 JAVA_OPTS 配置 Java 的啟動參數以及 ddtrace 相關的參數。DDtrace 具體支援的參數說明,可以參考如下連結: https://docs.guance.com/integrations/ddtrace-java/
  • logConfiguration,配置通過 AWS Firelens fluent-bit plugin (logstash) 來進行應用日志的采集和轉發。關于AWS Firelens plugin的詳細資訊,參考如下的鍊路: https://github.com/aws-samples/amazon-ecs-firelens-examples/tree/mainline/examples/fluent-bit/logstash

關于在 URI 配置中,logstreaming 支援的參數說明如下:

  • type:資料格式,目前支援 influxdb 和 firelens 類型當 type 為 inflxudb 時( /v1/write/logsreaming?type=influxdb ),說明資料本身就是行協定格式将隻添加内置 Tags 不再做其他操作當 type 為 firelens 時( /v1/write/logstreaming?type=firelens ),資料格式應是 JSON 格式的多條日志當此值為空時,會對資料做分行和 Pipeline 等處理
  • source:辨別資料來源
  • service:添加 service 标簽字段
  • tags:添加自定義 tag,多個 tag 間以英文逗号分割
  • Pipeline:指定資料需要使用的 pipeline 名稱

Datakit 容器

Datakit 容器 Json 格式的配置資訊如下:

Bash
{
            "name": "datakit",
            "image": "pubrepo.guance.com/datakit/datakit:latest",
            "cpu": 0,
            "portMappings": [],
            "essential": false,
            "environment": [
                {
                    "name": "ENV_DATAKIT_INPUTS",
                    "value": "[[inputs.logstreaming]] \n ignore_url_tags = false"
                },
                {
                    "name": "ENV_DATAWAY",
                    "value": "https://openway.guance.com?token=tkn_098042exxxx"
                },
                {
                    "name": "ENV_HTTP_LISTEN",
                    "value": "0.0.0.0:9529"
                },
                {
                    "name": "ENV_DEFAULT_ENABLED_INPUTS",
                    "value": "dk,container,ddtrace,statsd"
                },
                {
                    "name": "ENV_ECS_FARGATE",
                    "value": "on"
                }
            ],
            "mountPoints": [],
            "volumesFrom": [],
            "systemControls": []
        }
           

通過 environment 環境變量來對 DataKit 進行對應的配置。部分變量使用說明如下:

  • ENV_DATAKIT_INPUTS:開啟 logstreaming 采集子產品。主要用來接收通過 AWS Firelens fluent-bit 采集的日志資料
  • ENV_DATAWAY:資料上傳路由位址。每個工作空間都會有一一對應的 Token
  • ENV_HTTP_LISTEN:DataKit 預設監聽位址和端口
  • ENV_DEFAULT_ENABLED_INPUTS:配置預設開啟的資料采集器子產品
  • ENV_ECS_FARGATE:是否開啟采集 ECS 中容器運作的相關名額

Log-Router 容器

Log-Router 容器 Json 格式的配置資訊如下:

Bash
{
            "name": "log_router",
            "image": "public.ecr.aws/aws-observability/aws-for-fluent-bit:stable",
            "cpu": 0,
            "memoryReservation": 50,
            "portMappings": [],
            "essential": true,
            "environment": [],
            "mountPoints": [],
            "volumesFrom": [],
            "user": "0",
            "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                    "awslogs-create-group": "true",
                    "awslogs-group": "/ecs/ecs-aws-firelens-sidecar-container",
                    "awslogs-region": "cn-northwest-1",
                    "awslogs-stream-prefix": "firelens"
                }
            },
            "systemControls": [],
            "firelensConfiguration": {
                "type": "fluentbit"
            }
        }
           

該部分可以保持預設配置,不用做額外調整。

運作 AWS ECS Fargate 任務

基于新建立的任務定義建立 ECS Fargate 服務。服務成功啟動後,将看到如下的三個在運作狀态的容器:

AWS ECS On Fargate 監控可觀測最佳實踐

觀測雲上使用效果展示

當完成上面所述的配置,并在 AWS 上成功啟動任務後,我們就可以通過觀測雲全面監控 AWS ECS 中的服務運作情況。使用效果說明如下:

關于名額

當開啟 ECS Fargate 的名額采集後,在觀測雲預設的基礎設施監控中,可以實時監控ECS 容器的運作狀态。

AWS ECS On Fargate 監控可觀測最佳實踐

同時,也可以通過觀測雲的場景儀表闆能力,自定義 ECS 相關的看闆。如下圖所示:

AWS ECS On Fargate 監控可觀測最佳實踐

關于日志

可以通過觀測雲的日志檢視器快速檢視日志資訊包括支援資訊模糊查詢,正規表達式查詢等。也可以通過不同的過濾條件來對日志資訊進行直接的篩選檢視。如下圖所示:

AWS ECS On Fargate 監控可觀測最佳實踐

同時,在檢視日志詳情的過程中,如果使用者想進一步了解産生該日志的鍊路資訊,觀測雲也提供日志詳細頁面直接關聯到對應鍊路的能力。如下圖所示:

AWS ECS On Fargate 監控可觀測最佳實踐

關于應用鍊路

當發生服務調用後,在觀測雲的 “應用性能監測” 中可以通過檢視器看到鍊路相關的資訊,如下圖所示:

AWS ECS On Fargate 監控可觀測最佳實踐

支援點選某一條鍊路來檢視對應的詳細資訊,包括鍊路調用火焰圖,調用依賴關系等。同時,可以通過關聯内置視圖來快速實作關聯分析的能力。

如下圖所示,當關聯了ecs fargate的運作名額視圖後,使用者可以看到這條鍊路在被調用的時間點上(紅色豎線對應的位置),對應ECS中容器的資源使用和運作情況。

AWS ECS On Fargate 監控可觀測最佳實踐

如果關聯了應用的日志,就能夠在鍊路中直接關聯到該服務調用時産生的日志資訊來做快速的關聯分析。

AWS ECS On Fargate 監控可觀測最佳實踐

如果是 Java 應用,也可以快速關聯 JVM 的運作名額情況。幫助使用者快速了解服務調用時,JVM 的運作情況是否有異常,如下圖所示:

AWS ECS On Fargate 監控可觀測最佳實踐

上述提到的這些關聯分析視圖,都是可以根據使用者的分析需求來做靈活的自定義配置和添加删除。

至此,我們就完成了對 AWS ECS On Fargate 環境的基本可觀測能力的實作。