추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기 - Amazon CloudWatch

추가 Prometheus 소스 스크레이핑 및 해당 지표 가져오기

Prometheus 모니터링이 포함된 CloudWatch 에이전트는 Prometheus 지표를 스크레이프하는 데 두 가지 구성이 필요합니다. 하나는 Prometheus 설명서의 <scrape_config>에 설명된 표준 Prometheus 구성을 위한 것입니다. 다른 하나는 CloudWatch 에이전트 구성을 위한 것입니다.

Amazon EKS 클러스터에서 구성은 prometheus-eks.yaml(EC2 시작 유형의 경우) 또는 prometheus-eks-fargate.yaml(Fargate 시작 유형의 경우)에 다음과 같은 두 config 맵으로 정의됩니다.

  • name: prometheus-config 섹션에는 Prometheus 스크레이핑 설정이 포함되어 있습니다.

  • name: prometheus-cwagentconfig 섹션에는 CloudWatch 에이전트에 대한 구성이 포함되어 있습니다. 이 섹션을 사용하여 CloudWatch가 Prometheus 지표를 수집하는 방법을 구성할 수 있습니다. 예를 들어 CloudWatch에 가져올 지표를 지정하고 해당 지표의 측정기준을 정의합니다.

Amazon EC2 인스턴스에서 실행되는 Kubernetes 클러스터에서 구성은 prometheus-k8s.yaml YAML 파일에 다음과 같은 두 config 맵으로 정의됩니다.

  • name: prometheus-config 섹션에는 Prometheus 스크레이핑 설정이 포함되어 있습니다.

  • name: prometheus-cwagentconfig 섹션에는 CloudWatch 에이전트에 대한 구성이 포함되어 있습니다.

추가 Prometheus 지표 소스를 스크레이프하고 해당 지표를 CloudWatch에 가져오려면 Prometheus 스크레이프 구성과 CloudWatch 에이전트 구성을 모두 수정한 다음, 업데이트된 구성으로 에이전트를 다시 배포합니다.

VPC 보안 그룹 요구 사항

Prometheus 워크로드의 보안 그룹 수신 규칙은 프라이빗 IP로 Prometheus 지표를 스크레이프하기 위해 CloudWatch 에이전트에 대한 Prometheus 포트를 열어야 합니다.

CloudWatch 에이전트의 보안 그룹 송신 규칙은 CloudWatch 에이전트가 프라이빗 IP로 Prometheus 워크로드의 포트에 연결할 수 있도록 허용해야 합니다.

Prometheus 스크레이프 구성

CloudWatch 에이전트는 Prometheus 설명서의 <scrape_config>에 설명된 대로 표준 Prometheus 스크레이프 구성을 지원합니다. 이 섹션을 편집하여 이 파일에 이미 있는 구성을 업데이트하고 Prometheus 스크레이핑 대상을 더 추가할 수 있습니다. 기본적으로 샘플 구성 파일에는 다음과 같은 글로벌 구성 줄이 포함되어 있습니다.

global: scrape_interval: 1m scrape_timeout: 10s
  • scrape_interval - 대상을 스크레이프하는 빈도를 정의합니다.

  • scrape_timeout - 스크레이프 요청 시간이 초과되기 전에 대기할 시간을 정의합니다.

작업 수준에서 이러한 설정에 다른 값을 정의하여 전역 구성을 재정의할 수도 있습니다.

Prometheus 스크레이핑 작업

CloudWatch 에이전트 YAML 파일에는 일부 기본 스크레이핑 작업이 이미 구성되어 있습니다. 예를 들어 prometheus-eks.yaml에서 기본 스크레이핑 작업은 scrape_configs 섹션의 job_name 줄에서 구성됩니다. 이 파일에서 다음 기본 kubernetes-pod-jmx 섹션에서는 JMX Exporter 지표를 스크레이프합니다.

- job_name: 'kubernetes-pod-jmx' sample_limit: 10000 metrics_path: /metrics kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__address__] action: keep regex: '.*:9404$' - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: pod_name - action: replace source_labels: - __meta_kubernetes_pod_container_name target_label: container_name - action: replace source_labels: - __meta_kubernetes_pod_controller_name target_label: pod_controller_name - action: replace source_labels: - __meta_kubernetes_pod_controller_kind target_label: pod_controller_kind - action: replace source_labels: - __meta_kubernetes_pod_phase target_label: pod_phase

이러한 각 기본 대상은 스크레이프되고 지표는 임베디드 지표 형식을 사용하여 로그 이벤트로 CloudWatch에 전송됩니다. 자세한 내용은 로그 내에 지표 포함 단원을 참조하십시오.

Amazon EKS 및 Kubernetes 클러스터의 로그 이벤트는 CloudWatch Logs의 /aws/containerinsights/cluster_name/prometheus 로그 그룹에 저장됩니다. Amazon ECS 클러스터의 로그 이벤트는 /aws/ecs/containerinsights/cluster_name/prometheus 로그 그룹에 저장됩니다.

각 스크레이핑 작업은 이 로그 그룹의 서로 다른 로그 스트림에 포함됩니다. 예를 들어 Prometheus 스크레이핑 작업 kubernetes-pod-appmesh-envoy는 App Mesh에 대해 정의됩니다. Amazon EKS 및 Kubernetes 클러스터의 모든 App Mesh Prometheus 지표는 /aws/containerinsights/cluster_name>prometheus/kubernetes-pod-appmesh-envoy/라는 로그 스트림에 전송됩니다.

새 스크레이핑 대상을 추가하려면 YAML 파일의 scrape_configs 섹션에 새 job_name 섹션을 추가하고 에이전트를 다시 시작합니다. 이 프로세스의 예는 새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표 단원을 참조하세요.

Prometheus에 대한 CloudWatch 에이전트 구성

CloudWatch 에이전트 구성 파일에는 metrics_collected 아래에 Prometheus 스크레이핑 구성에 대한 prometheus 섹션이 있습니다. 여기에는 다음 구성 옵션이 포함됩니다.

  • cluster_name - 로그 이벤트에서 레이블로 추가할 클러스터 이름을 지정합니다. 이 필드는 선택 사항입니다. 생략하는 경우 에이전트가 Amazon EKS 또는 Kubernetes 클러스터 이름을 감지할 수 있습니다.

  • log_group_name - 스크레이프한 Prometheus 지표의 로그 그룹 이름을 지정합니다. 이 필드는 선택 사항입니다. 생략하는 경우 CloudWatch는 Amazon EKS 및 Kubernetes 클러스터의 로그에 /aws/containerinsights/cluster_name/prometheus를 사용합니다.

  • prometheus_config_path - Prometheus 스크레이프 구성 파일 경로를 지정합니다. 이 필드의 값이 env:로 시작하는 경우 Prometheus 스크레이프 구성 파일 내용이 컨테이너의 환경 변수에서 검색됩니다. 이 값은 변경하지 마세요.

  • ecs_service_discovery - Amazon ECS Prometheus 서비스 검색을 위한 구성을 지정하는 섹션입니다. 자세한 내용은 Amazon ECS 클러스터의 자동 검색에 대한 자세한 가이드 단원을 참조하십시오.

    ecs_service_discovery 섹션에는 다음 필드가 포함될 수 있습니다.

    • sd_frequency는 Prometheus Exporter를 검색하는 빈도입니다. 숫자와 단위 접미사를 지정합니다. 예를 들어 1분마다 한 번의 경우 1m 또는 30초마다 한 번의 경우 30s입니다. 유효한 단위 접미사는 ns, us, ms, s, m, h입니다.

      이 필드는 선택 사항입니다. 기본값은 60초(1분)입니다.

    • sd_target_cluster는 자동 검색의 대상 Amazon ECS 클러스터 이름입니다. 이 필드는 선택 사항입니다. 기본값은 CloudWatch 에이전트가 설치된 Amazon ECS 클러스터의 이름입니다.

    • sd_cluster_region은 대상 Amazon ECS 클러스터의 리전입니다. 이 필드는 선택 사항입니다. 기본값은 CloudWatch 에이전트가 설치된 Amazon ECS 클러스터의 리전입니다.

    • sd_result_file은 Prometheus 대상 결과의 YAML 파일 경로입니다. Prometheus 스크레이프 구성은 이 파일을 참조합니다.

    • docker_label은 Docker 레이블 기반 서비스 검색을 위한 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 Docker 레이블 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.

      • sd_port_label은 Prometheus 지표에 대한 컨테이너 포트를 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본 값은 ECS_PROMETHEUS_EXPORTER_PORT입니다. 컨테이너에 이 Docker 레이블이 없다면 CloudWatch 에이전트는 이 필드를 건너뜁니다.

      • sd_metrics_path_label은 Prometheus 지표 경로를 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본 값은 ECS_PROMETHEUS_METRICS_PATH입니다. 컨테이너에 이 도커 레이블이 없다면 에이전트는 기본 경로 /metrics를 가정합니다.

      • sd_job_name_label은 Prometheus 스크레이프 작업 이름을 지정하는 컨테이너의 Docker 레이블 이름입니다. 기본 값은 job입니다. 컨테이너에 이 Docker 레이블이 없다면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.

    • task_definition_list는 태스크 정의 기반 서비스 검색의 구성을 지정하는 데 사용할 수 있는 선택적 섹션입니다. 이 섹션을 생략하면 태스크 정의 기반 검색이 사용되지 않습니다. 이 섹션에는 다음 필드가 포함될 수 있습니다.

      • sd_task_definition_arn_pattern은 검색할 Amazon ECS 태스크 정의를 지정하는 데 사용할 패턴입니다. 이는 정규 표현식입니다.

      • sd_metrics_ports는 Prometheus 지표에 대한 containerPort를 나열합니다. containerPort를 세미콜론으로 구분합니다.

      • sd_container_name_pattern은 Amazon ECS 태스크 컨테이너 이름을 지정합니다. 이는 정규 표현식입니다.

      • sd_metrics_path는 Prometheus 지표 경로를 지정합니다. 이 필드를 생략하면 에이전트는 기본 경로 /metrics를 가정합니다.

      • sd_job_name은 Prometheus 스크레이프 작업 이름을 지정합니다. 이 필드를 생략하면 CloudWatch 에이전트는 Prometheus 스크레이프 구성의 작업 이름을 사용합니다.

  • metric_declaration - 생성할 임베디드 지표 형식이 있는 로그 배열을 지정하는 섹션입니다. CloudWatch 에이전트가 기본적으로 가져오는 각 Prometheus 소스에 대한 metric_declaration 섹션이 있습니다. 이러한 섹션에는 각각 다음 필드가 포함됩니다.

    • label_matchersource_labels에 나열된 레이블의 값을 확인하는 정규 표현식입니다. 일치하는 지표는 CloudWatch에 전송된 임베디드 지표 형식에 포함할 수 있습니다.

      source_labels에 여러 레이블이 지정된 경우 label_matcher의 정규 표현식에 ^ 또는 $ 문자를 사용하지 않는 것이 좋습니다.

    • source_labelslabel_matcher 줄에 의해 확인되는 레이블의 값을 지정합니다.

    • label_separator는 여러 source_labels가 지정된 경우 label_matcher 줄에 사용할 구분 기호를 지정합니다. 기본값은 ;입니다. 다음 예에서 label_matcher 줄에 이 기본값이 사용된 것을 볼 수 있습니다.

    • metric_selectors는 수집하여 CloudWatch에 보낼 지표를 지정하는 정규 표현식입니다.

    • dimensions는 선택한 각 지표의 CloudWatch 측정기준으로 사용할 레이블 목록입니다.

다음 metric_declaration 예를 참조하세요.

"metric_declaration": [ { "source_labels":[ "Service", "Namespace"], "label_matcher":"(.*node-exporter.*|.*kube-dns.*);kube-system", "dimensions":[ ["Service", "Namespace"] ], "metric_selectors":[ "^coredns_dns_request_type_count_total$" ] } ]

이 예에서는 다음 조건이 충족될 경우 임베디드 지표 형식 섹션을 로그 이벤트로 전송하도록 구성합니다.

  • Service의 값에 node-exporter 또는 kube-dns가 포함되어 있습니다.

  • Namespace의 값이 kube-system입니다.

  • Prometheus coredns_dns_request_type_count_total 지표에 ServiceNamespace 레이블이 모두 포함되어 있습니다.

전송되는 로그 이벤트에는 다음과 같은 강조 표시된 섹션이 포함됩니다.

{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"coredns_dns_request_type_count_total" } ], "Dimensions":[ [ "Namespace", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "Namespace":"kube-system", "Service":"kube-dns", "coredns_dns_request_type_count_total":2562, "eks_amazonaws_com_component":"kube-dns", "instance":"192.168.61.254:9153", "job":"kubernetes-service-endpoints", ... }

새로운 Prometheus 스크레이프 대상을 추가하기 위한 튜토리얼: Prometheus API 서버 지표

Kubernetes API 서버는 기본적으로 엔드포인트에 Prometheus 지표를 표시합니다. Kubernetes API 서버 스크레이핑 구성에 대한 공식 예제는 Github에 있습니다.

다음 튜토리얼에서는 아래 단계를 수행하여 Kubernetes API 서버 지표를 CloudWatch로 가져오는 방법을 보여 줍니다.

  • CloudWatch 에이전트 YAML 파일에 Kubernetes API 서버의 Prometheus 스크레이핑 구성 추가

  • CloudWatch 에이전트 YAML 파일에서 임베디드 지표 형식 지표 정의 구성

  • (선택 사항) Kubernetes API 서버 지표에 대한 CloudWatch 대시보드 생성

참고

Kubernetes API 서버는 게이지, 카운터, 히스토그램 및 요약 지표를 표시합니다. 이 Prometheus 지표 지원 릴리스에서는 CloudWatch가 게이지, 카운터 및 요약 유형의 지표만 가져옵니다.

CloudWatch에서 Kubernetes API 서버 Prometheus 지표 수집을 시작하려면
  1. 다음 명령 중 하나를 입력하여 prometheus-eks.yaml, prometheus-eks-fargate.yaml 또는 prometheus-k8s.yaml 파일의 최신 버전을 다운로드합니다.

    EC2 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks.yaml

    Fargate 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-eks-fargate.yaml

    Amazon EC2 인스턴스에서 실행되는 Kubernetes 클러스터의 경우 다음 명령을 입력합니다.

    curl -O https://raw.githubusercontent.com/aws-samples/amazon-cloudwatch-container-insights/latest/k8s-deployment-manifest-templates/deployment-mode/service/cwagent-prometheus/prometheus-k8s.yaml
  2. 텍스트 편집기로 파일을 열고 prometheus-config 섹션을 찾은 후 이 섹션 안에 다음 섹션을 추가합니다. 그리고 변경 사항을 저장합니다.

    # Scrape config for API servers - job_name: 'kubernetes-apiservers' kubernetes_sd_configs: - role: endpoints namespaces: names: - default scheme: https tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [__meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name] action: keep regex: kubernetes;https - action: replace source_labels: - __meta_kubernetes_namespace target_label: Namespace - action: replace source_labels: - __meta_kubernetes_service_name target_label: Service
  3. 텍스트 편집기에서 YAML 파일을 열어 둔 상태로 cwagentconfig.json 섹션을 찾습니다. 다음 하위 섹션을 추가하고 변경 사항을 저장합니다. 이 섹션에서는 API 서버 지표를 CloudWatch 에이전트 허용 목록에 넣습니다. 다음과 같은 세 유형의 API 서버 지표가 허용 목록에 추가됩니다.

    • etcd 객체 카운트

    • API 서버 등록 컨트롤러 지표

    • API 서버 요청 지표

    {"source_labels": ["job", "resource"], "label_matcher": "^kubernetes-apiservers;(services|daemonsets.apps|deployments.apps|configmaps|endpoints|secrets|serviceaccounts|replicasets.apps)", "dimensions": [["ClusterName","Service","resource"]], "metric_selectors": [ "^etcd_object_counts$" ] }, {"source_labels": ["job", "name"], "label_matcher": "^kubernetes-apiservers;APIServiceRegistrationController$", "dimensions": [["ClusterName","Service","name"]], "metric_selectors": [ "^workqueue_depth$", "^workqueue_adds_total$", "^workqueue_retries_total$" ] }, {"source_labels": ["job","code"], "label_matcher": "^kubernetes-apiservers;2[0-9]{2}$", "dimensions": [["ClusterName","Service","code"]], "metric_selectors": [ "^apiserver_request_total$" ] }, {"source_labels": ["job"], "label_matcher": "^kubernetes-apiservers", "dimensions": [["ClusterName","Service"]], "metric_selectors": [ "^apiserver_request_total$" ] },
  4. 클러스터에 Prometheus가 지원되는 CloudWatch 에이전트를 이미 배포한 경우 다음 명령을 입력하여 해당 에이전트를 삭제해야 합니다.

    kubectl delete deployment cwagent-prometheus -n amazon-cloudwatch
  5. 다음 명령 중 하나를 입력하여 업데이트된 구성으로 CloudWatch 에이전트를 배포합니다. EC2 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다.

    kubectl apply -f prometheus-eks.yaml

    Fargate 시작 유형의 Amazon EKS 클러스터의 경우 다음 명령을 입력합니다. MyClusterregion을 배포와 일치하는 값으로 바꿉니다.

    cat prometheus-eks-fargate.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -

    Kubernetes 클러스터의 경우 다음 명령을 입력합니다. MyClusterregion을 배포와 일치하는 값으로 바꿉니다.

    cat prometheus-k8s.yaml \ | sed "s/{{cluster_name}}/MyCluster/;s/{{region_name}}/region/" \ | kubectl apply -f -

이 작업을 완료하면 kubernetes-apiservers라는 새 로그 스트림이 /aws/containerinsights/cluster_name/prometheus 로그 그룹에 나타납니다. 이 로그 스트림은 다음과 같은 임베디드 지표 형식 정의가 있는 로그 이벤트를 포함해야 합니다.

{ "CloudWatchMetrics":[ { "Metrics":[ { "Name":"apiserver_request_total" } ], "Dimensions":[ [ "ClusterName", "Service" ] ], "Namespace":"ContainerInsights/Prometheus" } ], "ClusterName":"my-cluster-name", "Namespace":"default", "Service":"kubernetes", "Timestamp":"1592267020339", "Version":"0", "apiserver_request_count":0, "apiserver_request_total":0, "code":"0", "component":"apiserver", "contentType":"application/json", "instance":"192.0.2.0:443", "job":"kubernetes-apiservers", "prom_metric_type":"counter", "resource":"pods", "scope":"namespace", "verb":"WATCH", "version":"v1" }

CloudWatch 콘솔의 ContainerInsights/Prometheus 네임스페이스에서 지표를 볼 수 있습니다. 또한 선택적으로 Prometheus Kubernetes API 서버 지표에 대한 CloudWatch 대시보드를 생성할 수도 있습니다.

(선택 사항) Kubernetes API 서버 지표에 대한 대시보드 생성

대시보드에서 Kubernetes API 서버 지표를 보려면 먼저, 이전 단원의 단계를 완료하여 CloudWatch에서 이러한 지표 수집을 시작해야 합니다.

Kubernetes API 서버 지표에 대한 대시보드를 생성하려면
  1. https://console.aws.amazon.com/cloudwatch/에서 CloudWatch 콘솔을 엽니다.

  2. 올바른 AWS 리전을 선택했는지 확인합니다.

  3. 탐색 창에서 대시보드를 선택합니다.

  4. 대시보드 생성을 선택합니다. 새 대시보드의 이름을 입력하고 대시보드 생성을 선택합니다.

  5. 이 대시보드에 추가에서 취소를 선택합니다.

  6. 작업, 소스 보기/편집을 선택합니다.

  7. Kubernetes API 대시보드 소스라는 JSON 파일을 다운로드합니다.

  8. 텍스트 편집기로 다운로드한 JSON 파일을 열고, 다음과 같이 변경합니다.

    • 모든 {{YOUR_CLUSTER_NAME}} 문자열을 정확한 클러스터 이름으로 바꿉니다. 텍스트 앞이나 뒤에 공백을 추가하지 않도록 하세요.

    • 모든 {{YOUR_AWS_REGION}} 문자열을 지표가 수집되는 리전의 이름으로 바꿉니다. 예: us-west-2. 텍스트 앞이나 뒤에 공백을 추가하지 않도록 하세요.

  9. JSON blob 전체를 복사하여 CloudWatch 콘솔의 텍스트 상자에 붙여넣어 이미 상자에 있는 내용을 바꿉니다.

  10. 업데이트, 대시보드 저장을 선택합니다.