KUBERNETES

15. 모니터링 대시보드 구축

이번 장은 모니터링 대시보드 용도로 사용하는 그라파나를 알아봅니다.

1. 그라파나 소개

그라파나는 2014년에 Torkel Ödegaard에 의해 개발되었으며, 현재는 Grafana Labs에서 관리합니다. 솔루션은 다양한 데이터 소스에서 데이터를 수집하여 시각화하는 데 중점을 두고 있으며, 사용자는 이를 통해 복잡한 데이터를 쉽게 이해할 수 있는 그래픽과 대시보드로 변환할 수 있습니다. 

주요 특장점은 아래와 같습니다.

  • 풍부한 예시, 사용자 친화적인 인터페이스와 커스터마이제이션
    그라파나는 직관적이고 사용자 친화적인 웹 기반 인터페이스를 제공합니다. 이를 통해 사용자는 복잡한 코딩 지식 없이도 손쉽게 대시보드를 생성하고 관리할 수 있습니다. 또한, 공식 사이트와 커뮤니티에서 손쉽게 참고할 수 있는 다양한 대시보드를 제공합니다. 사용자는 간단한 설정만으로 실무에 사용 가능한 완성도가 높은 대시보드를 바로 가져다 사용할 수 있습니다.

    앞에서 설치한 Prometheus-Stack 헬름 차트에도 이미 다양한 대시보드가 포함되어 사용자는 새로운 대시보드를 만들지 않아도 쿠버네티스 운영에 필요한 대시보드를 바로 사용할 수 있습니다.
  • 다양한 데이터 소스와의 호환성
    Prometheus, InfluxDB, Elasticsearch, MySQL 등과 같은 다양한 데이터 소스와 호환됩니다. 이러한 유연성은 사용자가 다양한 환경과 시스템에 대한 모니터링과 분석을 하나의 플랫폼에서 진행할 수 있게 합니다. 사용자는 여러 데이터 소스를 통합해서 하나의 사이트에서 중앙 집중식 대시보드를 구성할 수 있습니다. 물론, AWS 등 퍼블릭 클라우드 관련 데이터도 쉽게 추가할 수 있습니다.

  • 뛰어난 모니터링 및 경고 시스템
    알람 설정도 편리합니다. 시스템 모니터링 및 경고 기능을 제공하여, 성능 문제나 이상 상태를 신속하게 파악하고 대응할 수 있도록 도와줍니다.

그라파나는 엔터프라이즈 버전을 제공하나 무료 오픈소스로도 이러한 기능을 충분히 활용할 수 있습니다. 그럼 실제로 어떻게 사용하는지 실습으로 알아보겠습니다.

2. 그라파나 사이트 접속

그라파나에 접속하기 위한 주소는 이미 앞에서 설치한 프로메테우스 커뮤니티 헬름 차트에 포함되어 있습니다. 헬름 차트에 많은 구성이 파라미터 형식으로 제공하여 사용자는 각자 환경에 맞게 변수를 수정해서 적용하면 됩니다.

그라파나 주소는 아래의 인그레스 설정으로 확인합니다. 

ingress:
    enabled: true
    ingressClassName: alb
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing # internet-facing or internal
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/group.name: sg-external
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/ssl-redirect: "443"
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/certificate-arn: ${CERTIFICATE_ARN}
      external-dns.alpha.kubernetes.io/hostname: ${GRAFANA_HOST}
    hosts:
    - ${GRAFANA_HOST}

필자는 보안 상 변수 처리하였는데 $GRAFANA_HOST가 인그레스에서 사용하는 외부 접속 주소입니다. 해당 주소를 External DNS 컨트롤러가 자동으로 Route 53에 등록합니다. 사용자는 Route 53에서 해당 도메인을 등록하는 추가 작업없이 해당 주소를 입력하여 접속할 수 있습니다.

해당 주소를 브라우저에 입력하면 아래와 같이 로그인 화면이 실행됩니다. 기본 아이디, 패스워드는 admin/prom-operator 입니다.

만약 패스워드 등을 변경하면 아래와 같이 그라파나 Secret 정보에서 확인할 수 있습니다. K Krew로 설치 가능한 ‘view-secret’ 플러그인을 사용하면 편리하게 패스워드를 평문으로 조회할 수 있습니다.

(jerry-test:monitoring)~$ k get secrets prometheus-grafana
NAME                 TYPE     DATA   AGE
prometheus-grafana   Opaque   3      24h
(jerry-test:monitoring)~$ k view-secret prometheus-grafana admin-password
prom-operator

3. 프로메테우스-커뮤니티 헬름 차트 대시보드 확인

그럼 대시보드를 확인합니다. 그라파나가 매우 유용한 것이 사용자 계층이 넓어 실무에 사용 가능한 수준의 풍부한 내용과 훌륭한 디자인의 대시보드를 무료로 제공한다는 것입니다. 실무를 하면 모니터링 대시보드를 만드는 것은 아주 고된 작업인 것을 알 수 있습니다. 여러 사용자(특히, 상사분 ^^)의 취향에 맞는 대시보드를 만드는 것은 매우 어렵습니다. 하지만 그라파나는 다양한 대시보드가 이미 포함되어 있어 처음부터 만들 필요없이 기존 대시보드를 가져다 사용할 수 있는 것이 매우 큰 장점입니다.

대시보드 메뉴는 화면 왼편에서 확인할 수 있습니다.

해당 메뉴를 선택하면 아래와 같이 ‘General’ 폴더를 확인할 수 있습니다. 해당 폴더에 프로메테우스 커뮤니티 헬름 차트 설치 시 기본으로 제공하는 다양한 대시 보드가 포함되어 있습니다.

클릭하고 확인하면 다양한 대시보드가 있습니다. 설치 시점에 따라 달라지는데 기본으로 20개가 넘는 다양한 대시보드를 제공합니다. 각각의 대시보드가 다들 훌륭하고 용도도 서로 다르므로 각자 요구 사항에 따라 하나씩 확인해 보면서 필요한 대시보드를 사용할 수 있습니다.

DevOps 입장에서 필자가 주로 참조하는 대시보드는 아래 2가지 입니다. ‘Kubernetes / Compute Resources / Cluster’, ‘Kubernetes / Compute Resources / Namespace (Workloads)’ 입니다. 즐겨찾기에 등록하면 다음에 보다 빠르게 확인할 수 있습니다.

2번째 Namespaces(Workloads) 대시보드는 각 네임스페이스의 특정 워크로드(Deployment, Statefulset 등) 단위로 분류가 되어 원하는 파드의 자원 사용량 등을 빠르게 확인할 수 있습니다.

<Redis 네임스페이스 조회 사례>

그럼, 추가 대시보드를 확인하기 전에 모니터링 대시보드에 관한 간단한 질문을 드려보겠습니다.

우리는 대시보드가 왜 필요할까요? 대시보드에는 어떠한 정보가 포함되어야 할까요? 

거듭 말씀드리지만 여러 해답이 있고 각 해답마다 타당한 이유가 있으므로 하나의 정답이 있는 것은 아닙니다. 각자의 해답은 모두 장, 단점이 있어 모두 맞다고 생각합니다. 대시보드에 관한 글쓴이의 의견은 1) 현재 우리 서비스 현황을 숫자 기반의 데이터로 빠르게 파악하는 것과 2) 장애 상황 발생 시 빠르게 대처하고 3) 장애를 예방하기 위한 계획을 세우기 위하여 대시보드가 필요하다 생각합니다.

관련하여 구글은 주요한 모니터링 항목 요소를 4가지 황금 신호(Golden-Signals)로 선정하여 공유하였습니다.

  • 응답속도(Latency)
    사용자 요청에 응답하는 소요 시간
  • 트래픽(Traffic)
    서비스 사용량 (예. HTTP requests per second)
  • 장애(Errors)
    단순 에러 이 외 내부 응답 목표 시간인 10초 이상 지연된 요청을 포함한 전체 장애 건수  
  • 포화도(Saturation)
    트래픽 증가 혹은 노드 장애 등의 상황 시 예비 노드에서 처리 가능한 시스템 자원 사용률

기본적인 내용이지만 단순히 하드웨어 측면의 CPU, 메모리 사용현황만 파악하는 것이 아니라 애플리케이션 측면에서 응답속도와 트래픽 사용량 등의 모니터링을 강조하고 있습니다. 관리자 측면이 아닌 실제 고객이 어떻게 느끼는지가 더욱 중요한 요소입니다. 대시보드 설계 시 위와 같은 요소를 고려하여 사전에 주요한 페이지 리스트를 선정하고 목표 응답 시간 및 현재 사용자 수 등 모니터링 항목을 서비스 담당자와 협의하여 신중하게 정의하는 시간이 필요합니다. 대시보드를 만들 때 임원분들이 보기 좋은 페이지를 만드는 것만 신경쓰는 어리석음을 범하지 말아야 합니다.

또한 대시보드를 만들때는 명확한 목표를 정하여 가능하면 간단하고 정확한 질문에 답할 수 있는 직관적인 대시보드가 필요합니다. 그리고 되도록 작은 수량의 대시보드에서 원인이 되는 문제를 빠르게 찾을 수 있고 중복된 대시보드를 만들지 않도록 주기적으로 검토하는 작업이 필요합니다.

거듭 말씀드리지만, 대부분 단순히 CPU, 메모리 사용량 대시보드를 만들고 마는데, MSA 환경에서 서비스가 작게 구분될 수록 각 서비스 개발자가 자신의 서비스에 대하여 현재 응답속도, 사용량, 장애 여부, 자원 사용량 등을 포함한 개별적인 대시보드를 준비하는 노력이 필요합니다.

4. 그라파나 공식 홈페이지 – 대시보드 공유 사이트

그럼, 사전 포함된 대시보드 이 외에 대시보드는 어떻게 찾을 수 있을까요? 다행히 그라파나는 공식 홈페이지에서 대시보드 공유 사이트를 제공하고 전세계 많은 사용자들이 베스트 프랙티스 기반의 대시보드를 공유하고 있습니다.

https://grafana.com/grafana/dashboards/

사용 방법은 각자 원하는 애플리케이션, 예를 들어 카프카, 레디스, MySQL 등 필요한 대시보드를 검색하여 사용합니다. 미리보기, 조회 수, 별점 등을 참고하여 원하는 대시보드를 선택하여 사용하면 됩니다.

필자가 추천하는 대시보드는 아래의 ‘dotdc’ 사용자가 제공하는 대시보드입니다.

<dotdc 사용자 대시보드>

 4가지 ‘Kubernetes / Views /’로 시작하는 대시보드를 필자는 내부에 설치하고 자주 들여다 봅니다. 위 화면에서 ‘Kubernetes / Views / Global ’ 대시보드를 선택하면 아래와 같이 미리보기와 해당 대시보드의 ‘ID: 15757’를 확인할 수 있습니다.

해당 ID를 이용하여 내부에 설치한 그라파나에 가져오기(‘Import’) 할 수 있습니다. 

그라파나 대시보드 메뉴에서 ‘New’ – ‘Import’ 선택합니다.

이어지는 화면에서 앞에서 확인한 ‘ID’ 정보를 입력합니다.

그럼 간단하게 해당 대시보드를 가져올 수 있습니다. 대시보드는 현재 클러스터 서비스의 현황을 보여줍니다. 디자인도 매우 뛰어나고 직관적으로 필요한 핵심 정보를 잘 나타냅니다.

  • 전체 노드, 네임스페이스, 파드 숫자 등의 클러스터 전반의 정보
  • 클러스터 자원 효율성 – 전체 클러스터의 자원 용량(Total), 실제 자원 사용율(Real), Requests, Limits 정보를 백분율(%)으로 제공
  • 시간 대 별 ConfigMap, Containers, Secrets 등의 변화량 히스토리 정보 제공

클러스터에서 Karpenter, HPA, KEDA 등의 오토스케일러 시스템을 운영하면 시간대 별 자원 사용량 변화가 잦아 확인이 필요합니다. 이때 아래와 같이 시간 대 별 노드 수량 변화량을 확인하면 어떤 이벤트들이 있었는지 확인하는 데 매우 유용합니다.

동일하게 네임스페이스, 노드, 파드 등을 현황을 파악하는데 4가지 대시보드로 다양하게 사용할 수 있습니다. 필자는 주로 4개의 대시보드를 이용하여 많은 문제를 해결하고 있습니다.

이처럼 다양한 대시보드를 ID 입력만으로 편리하게 가져올 수 있습니다. 

5. 대시보드 추가 – 프로메테우스 헬름 차트 포함

그럼 위와 같이 대시보드를 Import를 GUI 상에서 ‘ID’를 추가하는 방법이 아닌 헬름 차트에 포함하는 방법을 소개합니다. 실제 업무에 EKS 클러스터를 10개 이상 운영하는 경우도 빈번히 발생합니다. 그때마다 일일이 대시보드를 수동으로 추가하는 것은 번거롭습니다. 무엇보다 클러스터 관련 모든 설정은 GUI 혹은 명령어가 아닌 코드에 포함하는 것이 휴먼 에러를 줄이는 방법입니다. 

앞에서 설치한 프로메테우스-커뮤니티 헬름 차트의 Values.yaml 파일에 아래의 그라파나 – dashboard 관련 설정을 추가합니다.

grafana:
  enabled: true

  dashboardProviders:
    dashboardproviders.yaml:
      apiVersion: 1
      providers:
      - name: provider-site
        orgId: 1
        folder: ''
        type: file
        disableDeletion: false
        editable: true
        options:
          path: /var/lib/grafana/dashboards/provider-site

# now using that provider to import dashboards
  dashboards:
    provider-site:
      kubernetes-views-global:
        # url: https://grafana.com/api/dashboards/1860/revisions/27/download
        gnetId: 15757
        revision: 31
        datasource: Prometheus
      kubernetes-views-namespaces:
        gnetId: 15758
        revision: 27
        datasource: Prometheus
      kubernetes-views-nodes:
        gnetId: 15759
        revision: 19
        datasource: Prometheus
      kubernetes-views-pods:
        gnetId: 15760
        revision: 22
        datasource: Prometheus
      prometheus:
        gnetId: 19105
        revision: 1
        datasource: Prometheus

 .grafana.dashboardProviders
대시보드를 추가하기 위해서는 ConfigMap 구성이 필요한데 해당 구성에 ‘dashboardProviders’ 설정이 필요합니다. 임의의 이름(provider-site)을 지정하여 설정을 추가합니다. 

. grafana.dashboards.provider-site.kubernetes-views-global
gnetId: ‘15757’, revision: ‘31’ 
앞에서 확인한 그라파나 사이트에서 원하는 대시보드의 ID, Revision을 입력합니다. 상세 페이지에서 ID, Revision을 확인하고 해당 정보를 입력합니다. 복수의 대시보드를 ID, Revision을 입력하면 한번에 가져올 수 있습니다.

그라파나는 해당 설정을 ConfigMap으로 읽어와서 API로 그라파나 사이트의 대시보드를 호출하여 대시보드를 생성하는 구조입니다.

(jerry-test:monitoring)~$ k describe cm prometheus-grafana
(중략)
    download_dashboards.sh: |
      #!/usr/bin/env sh
      set -euf
      mkdir -p /var/lib/grafana/dashboards/provider-site
    
      curl -skf \
      --connect-timeout 60 \
      --max-time 60 \
      -H "Accept: application/json" \
      -H "Content-Type: application/json;charset=UTF-8" \
+       "https://grafana.com/api/dashboards/15757/revisions/31/download" \
+       | sed '/-- .* --/! s/"datasource":.*,/"datasource": "Prometheus",/g' \
+     > "/var/lib/grafana/dashboards/provider-site/kubernetes-views-global.json"

이제 수정한 Values 파일을 이용하여 헬름 차트를 업그레이드(helm upgrade prometheus)를 하면 설정에 추가한 대시보드를 그라파나 사이트에서 확인할 수 있습니다.

그라파나는 아직 대시보드를 커스텀 리소스(CR)로 제공하지 않는 것 같아 위와 같이 헬름 차트에 수동으로 추가하는 작업이 필요합니다.

조금 불편한 점은 대시보드가 ConfigMap의 설정이라 대시보드를 바로 수정할 수 없습니다.

수정이 필요하면 대시보드를 ‘JSON’ 형태로 내려받아 수정 후 다시 업로드 해야 합니다. 

6. 대시보드 데이터 소스

그라파나는 데이터 시각화 솔루션이며 데이터는 Prometheus에서 가져옵니다. 간단히 그림으로 표현하면 아래와 같습니다.

그라파나의 데이터소스 관련 설정은 화면 왼편의 ‘Connections’ 메뉴에서 확인할 수 있습니다.

메뉴를 선택하고 이어지는 화면에서 ‘Data sources’를 선택합니다.

확인하면 ‘Prometheus’ 데이터 소스를 확인할 수 있습니다. 저희가 별도로 추가 설정 작업을 하지 않았는데 프로메테우스 정보가 입력되어 있습니다. 프로메테우스 커뮤니티 헬름 차트에서 해당 설정이 자동으로 포함되어 있습니다.

프로메테우스 주소를 확인하면 ‘http://prometheus-kube-prometheus-prometheus.monitoring:9090’ 입니다. 이는 프로메테우스 서비스 이름과 동일합니다. 클러스터 내부에서 파드 간 통신 시 서비스 이름을 이용하여 통신하기 때문입니다. 그라파나는 프로메테우스의 서비스 이름을 이용하여 호출합니다.

(jerry-test:monitoring)~$ k get svc prometheus-kube-prometheus-prometheus
NAME                                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
prometheus-kube-prometheus-prometheus   ClusterIP   172.20.128.66   <none>        9090/TCP,8080/TCP   2d10h

이번 장에서 실습을 활용하여 Grafana를 소개하였습니다. 그라파나의 편리함과 유연성을 직접 경험하셨기를 바랍니다. 

그라파나는 복잡한 데이터를 시각화하고, 모니터링하는 데 있어서 매우 효과적입니다. 앞으로도 그라파나를 활용하여 시스템 운영과 관련된 다양한 데이터를 좀 더 직관적이고 빠르게 이해하기를 바랍니다. 마지막으로, 항상 새로운 기능과 업데이트에 주의를 기울여 그라파나의 최신 트렌드를 따라가시길 권장드립니다.

해당 기술 블로그에 질문이 있으시면 언제든지 문의해 주세요. 직접 답변해 드립니다.
k8sqna@jennifersoft.com

1.그라파나 역사 – https://en.wikipedia.org/wiki/Grafana#:~:text=History%20Grafana%20was%20first%20released,12 
2. 구글 SRE 핸드북 – 4 Golden Signals https://sre.google/sre-book/monitoring-distributed-systems/#xref_monitoring_golden-signals
3. 대시보드 모범 사례  https://grafana.com/docs/grafana/latest/best-practices/best-practices-for-creating-dashboards/#best-practices-to-follow

Next

Contact Us

안녕하세요? 제니퍼소프트입니다.
기술 문의의 경우 질문자의 회사/이름/연락처를 본문에 기술해 주셔야만 원할한 지원이 가능합니다.
보내주신 문의 사항을 검토하여 빠른 시일 내에 답변해 드리겠습니다.

  • Chris
  • Irene

메일을 보냈습니다.

메일 전송이 완료되었습니다.
빠른 시일 내에 답변드리겠습니다.
감사합니다.
제니퍼소프트 웹사이트는 쿠키를 사용합니다. 쿠키에 대한 자세한 정보 및 삭제 방법은 제니퍼소프트의 개인정보처리방침을 참고하시기 바라며 본 사이트를 계속해서 이용하는 것은 제니퍼소프트의 쿠키 사용에 동의함을 의미합니다.