Amazon ECS叢集自動探索的詳細指南 - Amazon CloudWatch

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

Amazon ECS叢集自動探索的詳細指南

Prometheus 提供數十種動態服務探索機制,如 <scrape_config> 中所述 不過,Amazon 沒有內建的服務探索ECS。 CloudWatch 客服人員新增此機制。

啟用 Amazon ECS Prometheus 服務探索時, CloudWatch 代理程式會定期API呼叫 Amazon ECS和 Amazon EC2 前端,以擷取目標ECS叢集中執行中ECS任務的中繼資料。

EC2:DescribeInstances ECS:ListTasks ECS:ListServices ECS:DescribeContainerInstances ECS:DescribeServices ECS:DescribeTasks ECS:DescribeTaskDefinition

CloudWatch 代理程式會使用中繼資料來掃描ECS叢集中的 Prometheus 目標。 CloudWatch 代理程式支援三種服務探索模式:

  • 容器 Docker 標籤型服務探索

  • ECS 任務定義ARN規則運算式型服務探索

  • ECS 服務名稱規則運算式型服務探索

所有模式都可搭配使用。 CloudWatch 代理程式會根據下列條件來取消複製探索的目標:{private_ip}:{port}/{metrics_path}

所有探索的目標都會寫入 CloudWatch 代理程式容器內sd_result_file組態欄位指定的結果檔案中。以下是範例結果檔案:

- targets: - 10.6.1.95:32785 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT: "9406" ECS_PROMETHEUS_JOB_NAME: demo-jar-ec2-bridge-dynamic ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-jar-ec2-bridge-dynamic-port TaskGroup: family:demo-jar-ec2-bridge-dynamic-port TaskRevision: "7" VpcId: vpc-01234567890 container_name: demo-jar-ec2-bridge-dynamic-port job: demo-jar-ec2-bridge-dynamic - targets: - 10.6.3.193:9404 labels: __metrics_path__: /metrics ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_B: "9404" ECS_PROMETHEUS_JOB_NAME: demo-tomcat-ec2-bridge-mapped-port ECS_PROMETHEUS_METRICS_PATH: /metrics InstanceType: t3.medium LaunchType: EC2 SubnetId: subnet-123456789012 TaskDefinitionFamily: demo-tomcat-ec2-bridge-mapped-port TaskGroup: family:demo-jar-tomcat-bridge-mapped-port TaskRevision: "12" VpcId: vpc-01234567890 container_name: demo-tomcat-ec2-bridge-mapped-port job: demo-tomcat-ec2-bridge-mapped-port

您可以將此結果檔案與 Prometheus 檔案型服務探索直接整合。如需 Prometheus 檔案型服務探索的詳細資訊,請參閱 <file_sd_config>

假設結果檔案寫入 /tmp/cwagent_ecs_auto_sd.yaml。下列 Prometheus 湊集組態將會使用它。

global: scrape_interval: 1m scrape_timeout: 10s scrape_configs: - job_name: cwagent-ecs-file-sd-config sample_limit: 10000 file_sd_configs: - files: [ "/tmp/cwagent_ecs_auto_sd.yaml" ]

CloudWatch 客服人員也會為探索的目標新增下列其他標籤。

  • container_name

  • TaskDefinitionFamily

  • TaskRevision

  • TaskGroup

  • StartedBy

  • LaunchType

  • job

  • __metrics_path__

  • Docker 標籤

當叢集具有EC2啟動類型時,會新增下列三個標籤。

  • InstanceType

  • VpcId

  • SubnetId

注意

不符合規則表達式的 Docker 標籤 [a-zA-Z_][a-zA-Z0-9_]* 會被篩選掉。這與 Prometheus 文件中的組態檔案label_name 列出的 Prometheus 慣例相符。

ECS 服務探索組態範例

本節包含示範ECS服務探索的範例。

範例 1

"ecs_service_discovery": { "sd_frequency": "1m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { } }

此範例會啟用 Docker 標籤型服務探索。 CloudWatch 客服人員每分鐘會查詢ECS任務的中繼資料一次,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml檔案中。

docker_label 區段中的 sd_port_label 的預設值為 ECS_PROMETHEUS_EXPORTER_PORT。如果ECS任務中任何執行中的容器具有 ECS_PROMETHEUS_EXPORTER_PORT Docker 標籤,代理 CloudWatch 程式會使用其值container port來掃描容器的所有公開連接埠。如果有相符項目,則會使用映射的主機連接埠加上容器的私有 IP,以下列格式建構 Prometheus 匯出工具目標:private_ip:host_port

docker_label 區段中的 sd_metrics_path_label 的預設值為 ECS_PROMETHEUS_METRICS_PATH。如果容器具有此 Docker 標籤,則其值將被用作 __metrics_path__。如果容器沒有此標籤,則會使用預設值 /metrics

docker_label 區段中的 sd_job_name_label 的預設值為 job。如果容器具有此 Docker 標籤,其值會附加為目標的其中一個標籤,以取代 Prometheus 組態中指定的預設任務名稱。此 docker 標籤的值會用作 CloudWatch Logs 日誌群組中的日誌串流名稱。

範例 2

"ecs_service_discovery": { "sd_frequency": "15s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A", "sd_job_name_label": "ECS_PROMETHEUS_JOB_NAME" } }

此範例會啟用 Docker 標籤型服務探索。THe CloudWatch 代理程式會每 15 秒查詢ECS任務的中繼資料,並將發現的目標寫入 CloudWatch 代理程式容器內的/tmp/cwagent_ecs_auto_sd.yaml檔案中。將掃描帶有 Docker 標籤的容器 ECS_PROMETHEUS_EXPORTER_PORT_SUBSET_A。Docker 標籤的值 ECS_PROMETHEUS_JOB_NAME 可用作任務名稱。

範例 3

"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "task_definition_list": [ { "sd_job_name": "java-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9404; 9406", "sd_task_definition_arn_pattern": ".*:task-definition/.*javajmx.*:[0-9]+" }, { "sd_job_name": "envoy-prometheus", "sd_metrics_path": "/stats/prometheus", "sd_container_name_pattern": "^envoy$", "sd_metrics_ports": "9901", "sd_task_definition_arn_pattern": ".*:task-definition/.*appmesh.*:23" } ] }

此範例會啟用ECS任務定義ARN規則表達式型服務探索。 CloudWatch 客服人員將每五分鐘查詢ECS任務的中繼資料,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml檔案中。

定義了兩個任務定義ARN規則過期區段:

  • 在第一個區段中,ARN會篩選ECS任務定義javajmx中包含 ECS 的任務,以進行容器連接埠掃描。如果這些ECS任務中的容器在 9404 或 9406 上公開容器連接埠,則對應的主機連接埠以及容器的私有 IP 會用來建立 Prometheus 匯出器目標。sd_metrics_path 的值會將 __metrics_path__ 設定為 /metrics。因此, CloudWatch 代理程式將從 抓取 Prometheus 指標private_ip:host_port/metrics,抓取指標會傳送至java-prometheus日誌群組 中 CloudWatch 日誌串流中的日誌串流/aws/ecs/containerinsights/cluster_name/prometheus

  • 對於第二個區段,:23會在其ECS任務定義appmesh中篩選使用 ECS的任務ARN,並在使用 version 時篩選容器連接埠掃描的任務。對於名稱為 envoy 且在 9901 上公開容器連接埠的容器,則會使用映射的主機連接埠以及容器的私有 IP 來建立 Prometheus 匯出工具目標。這些ECS任務中的值會公開 9404 或 9406 上的容器連接埠,映射的主機連接埠以及容器的私有 IP 會用來建立 Prometheus 匯出器目標。sd_metrics_path 的值會將 __metrics_path__ 設定為 /stats/prometheus。因此, CloudWatch代理程式將從 抓取 Prometheus 指標private_ip:host_port/stats/prometheus,並將抓取指標傳送至envoy-prometheus日誌群組 中 CloudWatch 日誌串流中的日誌串流/aws/ecs/containerinsights/cluster_name/prometheus

範例 4

"ecs_service_discovery": { "sd_frequency": "5m", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "service_name_list_for_tasks": [ { "sd_job_name": "nginx-prometheus", "sd_metrics_path": "/metrics", "sd_metrics_ports": "9113", "sd_service_name_pattern": "^nginx-.*" }, { "sd_job_name": "haproxy-prometheus", "sd_metrics_path": "/stats/metrics", "sd_container_name_pattern": "^haproxy$", "sd_metrics_ports": "8404", "sd_service_name_pattern": ".*haproxy-service.*" } ] }

此範例會啟用ECS服務名稱規則表達式型服務探索。 CloudWatch 客服人員將每五分鐘查詢ECS一次服務的中繼資料,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml檔案中。

定義了兩個服務名稱規則表達式區段:

  • 在第一個區段中,會針對容器連接埠掃描^nginx-.*篩選與名稱符合規則表達式之ECS服務相關聯的ECS任務。如果這些ECS任務中的容器在 9113 上公開容器連接埠,映射的主機連接埠以及容器的私有 IP 會用來建立 Prometheus 匯出器目標。sd_metrics_path 的值會將 __metrics_path__ 設定為 /metrics。因此, CloudWatch 代理程式將從 抓取 Prometheus 指標private_ip:host_port/metrics,而抓取指標會傳送至nginx-prometheus日誌群組 中 CloudWatch 日誌串流。 /aws/ecs/containerinsights/cluster_name/prometheus

  • 或第二個區段,.*haproxy-service.*會針對容器連接埠掃描篩選與名稱符合規則表達式之ECS服務相關聯的ECS任務。對於名稱為 haproxy 且在 8404 上公開容器連接埠的容器,則會使用映射的主機連接埠以及容器的私有 IP 來建立 Prometheus 匯出工具目標。sd_metrics_path 的值會將 __metrics_path__ 設定為 /stats/metrics。因此, CloudWatch 代理程式將從 中抓取 Prometheus 指標private_ip:host_port/stats/metrics,而抓取的指標會傳送至haproxy-prometheus日誌群組 中 CloudWatch 日誌串流。 /aws/ecs/containerinsights/cluster_name/prometheus

範例 5

"ecs_service_discovery": { "sd_frequency": "1m30s", "sd_result_file": "/tmp/cwagent_ecs_auto_sd.yaml", "docker_label": { "sd_port_label": "MY_PROMETHEUS_EXPORTER_PORT_LABEL", "sd_metrics_path_label": "MY_PROMETHEUS_METRICS_PATH_LABEL", "sd_job_name_label": "MY_PROMETHEUS_METRICS_NAME_LABEL" } "task_definition_list": [ { "sd_metrics_ports": "9150", "sd_task_definition_arn_pattern": "*memcached.*" } ] }

此範例會啟用兩種ECS服務探索模式。 CloudWatch 客服人員每 90 秒會查詢ECS任務的中繼資料,並將發現的目標寫入 CloudWatch 客服人員容器內的/tmp/cwagent_ecs_auto_sd.yaml檔案中。

若為 Docker 型服務探索組態:

  • 具有 docker 標籤ECS的任務MY_PROMETHEUS_EXPORTER_PORT_LABEL會篩選 Prometheus 連接埠掃描。目標 Prometheus 容器連接埠由標籤 MY_PROMETHEUS_EXPORTER_PORT_LABEL 的值指定。

  • Docker 標籤的值 MY_PROMETHEUS_EXPORTER_PORT_LABEL 可用於 __metrics_path__。如果容器沒有此 Docker 標籤,則會使用預設值 /metrics

  • Docker 標籤的值 MY_PROMETHEUS_EXPORTER_PORT_LABEL 可用作任務名稱。如果容器沒有此 Docker 標籤,則會使用 Prometheus 組態中定義的任務名稱。

針對ECS任務定義,以表達式為基礎的ARN一般服務探索組態:

  • ARN 會篩選ECS任務定義memcached中具有 ECS的任務,以進行容器連接埠掃描。目標 Prometheus 容器連接埠由 sd_metrics_ports 定義為 9150。使用預設指標路徑 /metrics。使用 Prometheus 組態中定義的任務名稱。