연재 시리즈

EKS 스터디 - 4주차 3편 - AMP에 EKS메트릭 저장

악분 2023. 5. 14. 17:37
반응형

안녕하세요. 이 글은 EKS메트릭을 AMP(AWS Managed Prometheus)에 저장하고 AMG(AWS Managed Grafana)에서 시각화하는 방법을 설명합니다.

 

AMP란?

AMP(Amazon Managed Prometheus)는 서버리스 프로메테우스입니다. AWS가 프로메테우스를 직접 관리하고 사용자는 프로메테우스 설정만 하면 됩니다. AMP는 AWS리소스(SNS 등)를 연계하여 알림 기능도 구현할 수 있습니다.

 

AMP는 AWS 다중 가용영역(Availability Zone)을 활영하여 HA(High Availability)를 지원합니다. AMP에 저장된 데이터는 150일동안 저장됩니다.

 

AMP 설치방법

AMP는 워크스페이스 단위로 구분합니다. 워크스페이스가 프로메테우스 인스턴스라고 생각하시면 됩니다.

 

워크스페이스를 생성하면 AMP주소가 자동으로 생성됩니다. 사용자는 AMP주소를 사용하여 메트릭 저장과 쿼리를 실행합니다.

 

AMP쿼리 실행방법

AMP에 저장된 데이터를 조회하려면 promql(프로메테우스 쿼리)를 실행해야 합니다. AMP로 promql를 사용하려면 SigV4서명이 필요합니다. AWS에서 제공하는 awscurl를 사용하면 SigV4서명을 단순화합니다.

 

awscurl은 파이썬으로 개발된 도구입니다. 그러므로 pip를 사용하여 awscurl를 다운로드합니다.

pip install awscurl

 

awscurl를 사용하려면 AWS profile가 필요합니다. 또는 accesskey, secretkey를 실행인자로 설정가능합니다. AMP 워크스페이스 ID를 지정하면 promql실행할 수 있습니다.

export REGION=ap-northeast-2
export WORKSPACE_ID="{your_AMP_workspace_id}"
export AMP_QUERY_ENDPOINT=https://aps-workspaces.$REGION.amazonaws.com/workspaces/$WORKSPACE_ID/api/v1/query

awscurl -X POST --region $REGION \
  --service aps "$AMP_QUERY_ENDPOINT?query=up"

 

EKS메트릭 저장

원리

AMP 원격쓰기(remote write)를 사용하여 EKS 메트릭을 AMP에 저장할 수 있습니다. AMP가 EKS 메트릭을 직접 수집하지 않습니다. 그 대신, EKS에 프로메테우스를 직접 설치하여 메트릭을 수집해야 합니다. 그리고 프로메테우스는 수집한 메트릭을 원격쓰기를 사용하여 AMP에게 전달합니다.

프로메테우스 원격쓰기는 https://jjon.tistory.com/entry/prometheus-disk-storage 블로그를 참고하시면 좋습니다.

 

원격쓰기로 메트릭을 전송할 때 외부 네트워크를 사용합니다. 외부 네트워크를 사용하고 싶지 않으면 VPC endpoint를 생성해야 합니다.

참고자료: https://catalog.workshops.aws/observability/en-US/aws-managed-oss/amp/ingest-metrics#deploy-prometheus-server

 

AMP 생성

EKS메트릭을 저장할 AMP 워크스페이스를 생성합니다.

 

프로메테우스 오퍼레이터 설치

프로메테우스 오퍼레이터를 helm chart로 설치합니다. 프로메테우스 오퍼레이터로 실행된 프로메테우스는 EKS 메트릭을 수집합니다. helm chart values에는 IRSA설정과 AMP 원격쓰기 저장소 설정이 필요합니다.

 

prometheus 네임스페이스를 생성합니다. prometheus 네임스페이스에 프로메테우스 오퍼레이터를 생성할 예정입니다.

kubectl create ns prometheus

 

EKS OIDC provider를 생성합니다. EKS OIDC provider는 IRSA과정에 필요합니다.

EKS_CLUSTER_NAME="basic-cluster"
eksctl utils associate-iam-oidc-provider --cluster ${EKS_CLUSTER_NAME} --approve

 

IRSA를 생성합니다. IAM policy는 AWS 관리형 policy를 사용합니다.

NAMESPACE="prometheus"
EKS_CLUSTER_NAME="basic-cluster"
SERVICEACCOUNT_NAME="amp-iamproxy-ingest-role"

eksctl create iamserviceaccount \
	--name ${SERVICEACCOUNT_NAME } \
	--namespace ${NAMESPACE} \
	--cluster ${EKS_CLUSTER_NAME} \
	--attach-policy-arn arn:aws:iam::aws:policy/AmazonPrometheusRemoteWriteAccess \
	--approve \
	--override-existing-serviceaccounts

 

프로메테우스 오퍼레이터 helm차트를 추가합니다.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

 

helm차트 values.yaml파일을 생성합니다. RSA설정과 AMP 원격쓰기 저장소를 설정합니다. 저는 alertmanager, grafana 생성은 비활성화 했습니다. 예제는 github을 참고해주시길 바랍니다.

eks_cluster_name="test-eks"
irsa_serviceaccount="amp-iamproxy-ingest-role"
amp_workspace_id=$(aws amp list-workspaces --alias $eks_cluster_name | jq .workspaces[0].workspaceId -r)
aws_region="ap-northeast-2"

cat <<EOT > values.yaml
alertmanager:
  enabled: false

grafana:
  enabled: false

prometheus:
  serviceAccount:
    create: false
    name: $irsa_serviceaccount

  ingress:
    enabled: false

  prometheusSpec:
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 1d
    retentionSize: "10GiB"
    scrapeInterval: 15s
    evaluationInterval: 15s
    remoteWrite:
    - url: https://aps-workspaces.$aws_region.amazonaws.com/workspaces/$amp_workspace_id/api/v1/remote_write
      sigv4:
        region: $aws_region
      queueConfig:
        maxSamplesPerSend: 1000
        maxShards: 200
        capacity: 2500
EOT

 

프로메테우스 오퍼레이터 helm차트를 릴리즈합니다.

NAMESPACE="prometheus"

helm upgrade --install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
--namespace ${NAMESPACE} \
--version 45.7.1 \
-f values.yaml

 

프로메테우스 오퍼레이터가 잘 생성되었는지 확인합니다.

kubectl --namespace prometheus get pods -l "release=kube-prometheus-stack"

 

프로메테우스 pod가 잘 생성되었는지 확인합니다.

kubectl -n prometheus get po -l prometheus=kube-prometheus-stack-prometheus

 

프로메테우스 로그를 확인합니다. 프로메테우스가 수집한 메트릭을 AMP에게 성공적으로 전달하는지 로그로 확인가능합니다.

kubectl -n prometheus logs  -l prometheus=kube-prometheus-stack-prometheus

 

AMP에서 EKS 메트릭 쿼리 조회 예제

이제 AMP에 EKS메트릭을 조회할 수 있습니다. 아래 예제는 컨테이너 cpu사용량을 조회합니다.

export REGION=ap-northeast-2
export WORKSPACE_ID="{your_AMP_workspace_id}"
export AMP_QUERY_ENDPOINT=https://aps-workspaces.$REGION.amazonaws.com/workspaces/$WORKSPACE_ID/api/v1/query

awscurl -X POST --region $REGION \
  --service aps "$AMP_QUERY_ENDPOINT?query=container_cpu_usage_seconds_total"  | jq

 

AMP에 저장된 데이터를 시각화하려면 그라파나가 필요합니다. 다음 절에서 AMG(AWS Managed Grafana)를 사용하여 데이터 시각화하는 방법을 설명합니다.

 

AMG란?

AMG(Aws Managed Grafana)는 서버리스 Grafana입니다. AWS가 그라파나를 관리하고 사용자는 그라파나 설정만 하면 됩니다. 또 다른 장점은 인증/인과 관리가 쉽습니다. AWS SSO 또는 SAML를 사용할 수 있습니다.

참고자료:&nbsp;https://aws.amazon.com/ko/blogs/mt/fine-grained-access-control-in-amazon-managed-grafana-using-grafana-teams/

 

AMG 설치방법

AMG는 워크스페이스 단위로 구분합니다. 워크스페이스는 그라파나 인스턴스라고 생각하시면 됩니다.

 

AMG 워크스페이스를 생성할 때, 인증/인가 방법을 선택하는 과정이 있습니다. AWS I­­Dentity Center를 사용하면 AWS SSO를 사용합니다. SAML를 사용하면 타사 SAML provider 연동이 가능합니다.

 

AMG는 AWS리소스를 data source로 등록이 가능합니다. AMP, CloudWatch등을 등록할 수 있습니다.

 

AMP연동 실습

AMP를 AMG에 연결하면 AMP메트릭 대시보드를 만들 수 있습니다. AWS data source방법으로  AMP를 연결할 수 있습니다.

 

AWS data source은 지원되지 않은 리전이 있습니다. 2023.5월 기준으로 서울리전은 AWS data source방법으로 AMP연결기능이 지원되지 않습니다. 그러므로 SigV4서명방법으로 AMP를 연결해야 합니다.

 

이 글은 EKS 메트릭을 AMP에 저장한 후, AMG와 AMP를 연동하여 메트릭을 시각화합니다.

 

AMG생성

AMG 워크스페이스를 생성합니다.

 

인증/인가는 AWS IAM Identity Center를 선택합니다.

 

워크스페이스가 생성되면 AMG접속 주소가 생성됩니다.

 

AMG 유저 생성

AMG에 접속하면 AWS 로그인 페이지가 나옵니다. AMG생성 단계에서 인증/인가 방법을 AWS IAM Identity Center를 선택했으므로, AWS SSO로그인 페이지로 이동됩니다.

 

AWS SSO계정은 AMG Authentication메뉴에서 관리합니다. 로그인 계정을 생성하기 위해 Assign new user or group버튼을 클릭합니다.

 

AWS SSO계정을 AMG 계정으로 등록합니다.

 

만약 SSO계정이 안보이면 AWS SSO계정을 생성해야 합니다.

 

AMG권한 계정권한 설정은 Action버튼으로 쉽게 할 수 있습니다. 아래 예제는 AMG Admin권한을 설정합니다.

 

등록한 AWS SSO계정으로 AMG로그인을 하면 그라파나 홈페이지가 보입니다.

 

AMP연동

AMP연동은 AWS Data Source를 이용하면 몇 번의 클릭으로 쉽게 연동할 수 있습니다.

 

하지만, 2023년 5월 기준으로 서울리전은 AWS Data Source으로 AMP연동을 지원하지 않습니다.

 

그러므로Data source로 AMP를 등록해야 합니다.

참고자료: https://docs.aws.amazon.com/ko_kr/prometheus/latest/userguide/AMP-compatible-APIs.html

 

프로메테우스를 선택합니다.

 

AMP query endpoint 주소를 HTTP url에 입력합니다. endpoint주소에서 “/api/v1/query”는 제거해야 합니다.

 

HTTP url설정 후, SigV4 Auth인증을 활성화 합니다. 그리고 AWS IAM accesskey, secretkey를 입력하고 리전을 선택합니다.

 

설정을 마치고 Save&Test버튼을 클릭합니다. AMP연결이 잘 된다면 “Data source is working”메세지가 표시됩니다.

 

EKS메트릭 대시보드 생성

AMG 대시보드를 생성하여 AMP에 저장된 EKS메트릭를 시각화를 할 수 있습니다. 예제에서는 대시보드 메뉴에서 Import버튼을 클릭하여 사용자가 공개한 대시보드를 불러옵니다.

 

13548번호(https://grafana.com/grafana/dashboards/13548-kubernetes-compute-resources-node-groups/)를 갖는 대시보드를 불러옵니다.

 

불러온 대시보드를 확인하면 EKS 워커노드 메트릭이 보입니다.

 

마치며

AMP와 AMG의 핵심은 서버리스라고 생각합니다. 사용자가 프로메테우스와 그라파나를 관리하지 않고 업무 효율성을 높일 수 있을 것 같습니다. 

 

저는 아직 메트릭시스템을 관리하는 것을 실무로 하지 않아, 메트릭 시스템의 설정과 시스템 디자인을 잘 모릅니다. 하지만 느낀 것은 타노스 역할을 AMP가 대신할 수 있을 것 같습니다.

 

참고자료

이하여백

반응형