이 문서는 (1) Grafana + Prometheus, (2) Container Insights를 활용하여 EKS 모니터링하는 방법을 설명합니다.
모니터링에 사용할 네임스페이스를 생성합니다.
kubectl create ns <NAMESPACE_NAME>
모니터링 도구 설치를 위해 Kubernetes 패키지 관리 매니저인 Helm을 설치합니다.
sudo curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
성공적으로 설치되었는지 확인합니다.
helm version
helm을 사용하여 Prometheus 리포지토리를 추가합니다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm을 최신 버전으로 업데이트 한 후 kube-prometheus-stack 파일을 다운받습니다.
kube-prometheus-stack에는 Prometheus, Grafana, Alertmanager 및 Kubernetes 관련 모니터링 도구들이 포함되어 있습니다.
helm repo update
# kube-prometheus-stack 차트의 최신 버전 pull
helm pull prometheus-community/kube-prometheus-stack
# 압축 해제
tar -xvzf <FILE_NAME>
추가 설정들과 설정 파일을 이용하여 모니터링 관련 차트를 설치합니다.
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace <NAMESPACE_NAME> \
--set defaultRules.create=false \
--set alertmanager.service.type=NodePort \
--set grafana.service.type=NodePort \
--set grafana.defaultDashboardsEnabled=false \
--set grafana.sidecar.dashboards.enabled=false \
--set grafana.sidecar.datasources.enabled=false \
--set prometheus.service.type=NodePort \
--set prometheus.serviceMonitor.selfMonitor=false \
--values ./values.yaml
Grafana, Prometheus 모두 로드 밸런서를 통해 접근할 것이기 때문에 아래와 같이 Ingress 파일을 생성합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: prometheus-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/group.name: monitoring
alb.ingress.kubernetes.io/group.order: '1'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/type: instance
alb.ingress.kubernetes.io/load-balancer-name: eks-load-balancer
alb.ingress.kubernetes.io/healthcheck-path: /prometheus/-/healthy # Check prometheus health status
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /prometheus
pathType: Prefix
backend:
service:
name: <PROMETHEUS_SERVICE_NAME>
port:
number: 9090
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: grafana-ingress
namespace: monitoring
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/group.name: monitoring
alb.ingress.kubernetes.io/group.order: '2'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/type: instance
alb.ingress.kubernetes.io/load-balancer-name: eks-load-balancer
alb.ingress.kubernetes.io/healthcheck-path: /api/health # Check grafana health status
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <GRAFANA_SERVICE_NAME>
port:
number: 80
생성한 파일을 적용하고 DNS 이름을 통해 Grafana와 Prometheus에 접속되는지 확인합니다.
kubectl apply -f <INGRESS_FILE_NAME>
Grafana 초기 계정 정보
- ID - admin
- PW - prom-operator (value.yaml 에서 수정 필요)

Prometheus의 subpath를 설정한 경우 (ex> /prometheus) Ingress 생성 후 prometheusSpec의 externalUrl과 routePrefix를 추가 설정해주어야 합니다.
- ex) http://<INGRESS_DNS_NAME>/prometheus
helm upgrade --install prometheus prometheus-community/kube-prometheus-stack \ --namespace <NAMESPACE_NAME> \ --set defaultRules.create=false \ --set alertmanager.service.type=NodePort \ --set grafana.service.type=NodePort \ --set grafana.defaultDashboardsEnabled=false \ --set grafana.sidecar.dashboards.enabled=false \ --set grafana.sidecar.datasources.enabled=false \ --set prometheus.service.type=NodePort \ --set prometheus.serviceMonitor.selfMonitor=false \ --set prometheus.prometheusSpec.externalUrl="http://<INGRESS_DNS_NAME>/prometheus" \ --set prometheus.prometheusSpec.routePrefix=/prometheus \ --values ./values.yaml

| Service | ID | URL | 비고 |
|---|---|---|---|
| EC2 | 617 | AWS EC2 | EC2의 CPU, Network, Disk, Status, Volume 등 메트릭 데이터 |
| 11265 | Amazon EC2 | EC2의 CPU, Network, Disk, Status 등 메트릭 데이터 | |
| EKS | 20577 | AWS - EKS | EKS의 Node, Pod, Latency, Error 등 메트릭 데이터 |
Grafana > Connections > Data sources에서 CloudWatch 데이터 소스를 추가합니다.

AWS의 Assume Role ARN을 입력하고 기본 리전 코드를 선택합니다.
Assume Role ARN은 CloudWatch 관련 정책 권한이 있는 역할을 선택해야합니다.
※ 새로 생성해야하는 경우 (옵션) Grafana CloudWatch 역할 생성 참고

- 정책 생성
AWS Console > IAM > 정책 생성에서 CloudWatch, Log 권한이 있는 정책을 생성합니다.{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowReadingMetricsFromCloudWatch", "Effect": "Allow", "Action": [ "cloudwatch:DescribeAlarmsForMetric", "cloudwatch:DescribeAlarmHistory", "cloudwatch:DescribeAlarms", "cloudwatch:ListMetrics", "cloudwatch:GetMetricStatistics", "cloudwatch:GetMetricData", "cloudwatch:GetInsightRuleReport" ], "Resource": "*" }, { "Sid": "AllowReadingLogsFromCloudWatch", "Effect": "Allow", "Action": [ "logs:DescribeLogGroups", "logs:GetLogGroupFields", "logs:StartQuery", "logs:StopQuery", "logs:GetQueryResults", "logs:GetLogEvents" ], "Resource": "*" }, { "Sid": "AllowReadingTagsInstancesRegionsFromEC2", "Effect": "Allow", "Action": [ "ec2:DescribeTags", "ec2:DescribeInstances", "ec2:DescribeRegions" ], "Resource": "*" }, { "Sid": "AllowReadingResourcesForTags", "Effect": "Allow", "Action": "tag:GetResources", "Resource": "*" }, { "Sid": "AllowReadingAcrossAccounts", "Effect": "Allow", "Action": [ "oam:ListSinks", "oam:ListAttachedLinks" ], "Resource": "*" } ] }
- 역할 생성
AWS Console > IAM > 역할 생성에서 아래 내용을 참고하여 역할을 생성합니다.
- 신뢰할 수 있는 엔터티 유형 - AWS 계정
- 권한 - 위에서 만든 정책 권한
- AssumeRole 권한 부여
AWS Console > IAM > 역할 > Grafana에서 사용하고 있는 노드 역할의 상세 페이지로 이동합니다.
권한의 인라인 정책 생성 > JSON 형식으로 2번에서 생성한 역할을 추가합니다.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": <GRAFANA_CLOUDWATCH_ROLE> } ] }
Save & test 버튼을 클릭하여 메트릭 API가 정상적으로 동작함을 확인한 후 대시보드를 생성합니다.

대시보드는 New Dashboard를 클릭하여 커스텀하게 생성하거나 생성되어 있는 대시보드를 활용하여 생성할 수 있습니다.

커스텀하게 생성하는 경우 서비스 유형, 메트릭 및 인스턴스 ID를 활용하여 Panel을 구성합니다.

생성되어있는 대시보드를 활용하는 경우 대시보드 ID나 JSON 형식으로 되어있는 대시보드 구성 파일을 Import합니다.

대시보드 ID를 입력하여 대시보드를 가져온 후 CloudWatch 리소스 데이터를 선택하면 아래와 같이 메트릭 데이터를 확인할 수 있습니다.

Grafana > Connections > Data sources에서 Prometheus 데이터 소스를 추가합니다.

Prometheus server URL은 Prometheus에 접속 가능한 DNS나 IP 주소를 입력합니다.

생성된 데이터 소스를 사용하여 대시보드를 구성합니다.
대시보드는 New Dashboard를 클릭하여 커스텀하게 생성하거나 생성되어 있는 대시보드를 활용하여 생성할 수 있습니다.

커스텀하게 생성하는 경우 데이터 소스를 Prometheus로 선택한 다음 메트릭, 필터 데이터를 입력하거나 PromQL로 추가합니다.


생성되어 있는 대시보드를 활용할 경우 대시보드 ID나 JSON 형식으로 되어있는 대시보드 구성 파일을 Import합니다.

이전에 생성한 Prometheus 데이터 소스를 선택한 후 대시보드를 생성합니다.

대시보드의 필터를 활용하여 원하는 Prometheus 리소스 데이터를 확인할 수 있습니다.

AWS EKS Container Insights는 Amazon CloudWatch를 사용하여 EKS 클러스터의 성능 메트릭과 로그를 수집하고 모니터링할 수 있는 서비스입니다.
EKS Container Insights를 사용하기 위해서는 Amazon CloudWatch Observability EKS 애드온을 사용하는 방법과 Amazon CloudWatch Agent 및 Fluent Bit을 수동으로 설치하여 로그와 메트릭을 수집하는 방법이 있습니다.
해당 문서에서는 Amazon CloudWatch Observability EKS 애드온을 설치하여 Container Insights를 사용하는 방법에 대해 설명합니다.
EKS 클러스터의 워커 노드에 연결된 IAM 역할을 찾아 CloudWatchAgentServerPolicy 정책을 추가합니다.
aws iam attach-role-policy \
--role-name <WORKER_NODE_ROLE_NAME> \
--policy-arn arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy
클러스터에 지표를 수집하여 CloudWatch로 전송하는 CloudWatch Observability 추가 기능을 설치합니다.
aws eks create-addon --cluster-name <EKS_CLUSTER_NAME> --addon-name amazon-cloudwatch-observability
추가 기능을 설치한 후에 CloudWatch에서 서비스/유형별 지표를 확인할 수 있습니다.

필요한 지표만 모아서 확인할 수 있도록 사용자 지정 대시보드를 생성하고 필요한 지표를 대시보드에 추가합니다.

생성한 대시보드에 EC2, EKS 등 AWS 서비스의 지표를 추가하여 대시보드 위젯을 구성할 수 있습니다.
