EKS 모니터링 구성

엔스마트·2024년 8월 22일

Amazon EKS

목록 보기
4/4

이 문서는 (1) Grafana + Prometheus, (2) Container Insights를 활용하여 EKS 모니터링하는 방법을 설명합니다.

Grafana + Prometheus

1. 네임스페이스 생성

모니터링에 사용할 네임스페이스를 생성합니다.

kubectl create ns <NAMESPACE_NAME>

2. Helm 설치

모니터링 도구 설치를 위해 Kubernetes 패키지 관리 매니저인 Helm을 설치합니다.

sudo curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

성공적으로 설치되었는지 확인합니다.

helm version

3. Prometheus & Grafana 설치

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

4. Ingress 설정

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


5. 모니터링 구성

참고 대시보드

ServiceIDURL비고
EC2617AWS EC2EC2의 CPU, Network, Disk, Status, Volume 등 메트릭 데이터
11265Amazon EC2EC2의 CPU, Network, Disk, Status 등 메트릭 데이터
EKS20577AWS - EKSEKS의 Node, Pod, Latency, Error 등 메트릭 데이터

CloudWatch

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

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

(옵션) Grafana CloudWatch 역할 생성

  1. 정책 생성
    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": "*"
        }
    ]
}
  1. 역할 생성
    AWS Console > IAM > 역할 생성에서 아래 내용을 참고하여 역할을 생성합니다.
  • 신뢰할 수 있는 엔터티 유형 - AWS 계정
  • 권한 - 위에서 만든 정책 권한
  1. 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 리소스 데이터를 선택하면 아래와 같이 메트릭 데이터를 확인할 수 있습니다.

Prometheus

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

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

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

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


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

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

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


EKS Container Insights

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 서비스의 지표를 추가하여 대시보드 위젯을 구성할 수 있습니다.

profile
클라우드 전환, MSA 서비스, DevOps 환경 구축과 기술지원 그리고 엔터프라이즈 시스템을 구축하는 최고 실력과 경험을 가진 Architect Group 입니다.

0개의 댓글