목표

K6를 사용하여 성능 테스트 데이터를 생성하고, 이를 Prometheus로 수집하여 Grafana에서 시각화하는 환경을 구축합니다.
이 과정은 다음과 같은 순서로 진행됩니다:

  1. K6 설정: Prometheus로 테스트 데이터를 전송
  2. Prometheus 설정: 데이터를 수집 및 저장
  3. Grafana 설정: Prometheus 데이터를 기반으로 대시보드 시각화
  4. End-to-End 테스트 수행: 결과를 검증하고 최종 대시보드 확인

 

1. Prometheus 설정

1.1 Prometheus 설치

Prometheus는 Helm Chart를 사용하여 Kubernetes 클러스터에 설치합니다.

  • 설치 명령어
helm install prometheus prometheus-community/prometheus -f prometheus-values.yaml --namespace monitoring
  • Prometheus Helm Values 설정 Grafana 메트릭을 수집하기 위한 설정을 추가합니다. 
scrape_configs:
  - job_name: 'grafana'
    metrics_path: /metrics
    static_configs:
      - targets:
          - grafana.monitoring.svc.cluster.local:80
  • job_name: Prometheus에서 수집할 대상 이름
  • metrics_path: Grafana의 /metrics 경로에서 메트릭 데이터를 수집
  • static_configs: Grafana의 Kubernetes 서비스 경로

 

  • 설치 후 확인 Prometheus 관련 Pod들이 정상적으로 실행 중인지 확인
➜  ~ kubectl get pods -n monitoring
NAME                      READY   STATUS    RESTARTS   AGE
grafana-9ffd5d8bd-vw882   1/1     Running   0          20m

 

 

2. Grafana 설정

2.1 Grafana 설치

Grafana도 Helm Chart를 사용하여 설치합니다.

  • 설치 명령어
     
helm install grafana grafana/grafana -f grafana-values.yaml --namespace monitoring
  • Grafana Helm Values 설정 아래는 주요 설정값입니다.
ingress:
  enabled: true
  className: webapprouting.kubernetes.azure.com
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: "/"
  hosts:
    - <grafanahost>
  paths:
    - path: /
      pathType: Prefix
      backend:
        service:
          name: grafana
          port:
            number: 80
            
dashboardProviders:
  dashboardproviders.yaml:
    apiVersion: 1
    providers:
    - name: 'default'
      orgId: 1
      folder: ''
      type: file
      disableDeletion: false
      editable: true
      options:
        path: /var/lib/grafana/dashboards/default

dashboards:
  default:
    k6-dashboard:
      gnetId: 18030  # K6 Grafana Dashboard ID
      revision: 1
      datasource: Prometheus
  • 설명
    • ingress: Grafana의 외부 접속을 위한 Ingress 설정
    • dashboards: Grafana 설치 후 K6 대시보드를 자동으로 생성

 

2.2 Grafana 데이터 소스 추가

Prometheus를 Grafana의 데이터 소스로 설정합니다.

  • Helm Values 설정
datasources:
  datasources.yaml:
    apiVersion: 1
    datasources:
    - name: Prometheus
      type: prometheus
      url: <prometheus-host>
      access: proxy
      isDefault: true
  • 설명
    • name: 데이터 소스 이름
    • type: Prometheus 데이터 소스를 선택
    • url: Prometheus Ingress URL
    • access: Grafana가 Proxy 모드로 Prometheus에 연결

 

3. K6 설정 및 테스트 수행

3.1 K6 테스트 스크립트 작성

아래는 K6 테스트 스크립트 예제입니다.

  • stress.js
import { sleep, check } from 'k6';
import http from 'k6/http';

export const options = {
  vus: 50,
  duration: '100s',
};

export default function () {
  const res = http.get('http://52.231.96.153');
  check(res, {
    'status is 200': () => res.status === 200,
  });
  sleep(1);
}

3.2 K6 테스트 실행

Prometheus에 데이터를 전송하며 테스트를 실행합니다.

  • 명령어
K6_PROMETHEUS_RW_SERVER_URL=<prometheus-host>/api/v1/write \
k6 run -o experimental-prometheus-rw stress.js

 

  • 설명
    • K6_PROMETHEUS_RW_SERVER_URL: K6 데이터를 Prometheus로 전송하는 주소
    • -o experimental-prometheus-rw: K6가 Prometheus Remote Write를 사용하도록 설정

 

4. 결과 및 Grafana 대시보드 확인

4.1 Grafana 대시보드

  • Grafana UI에 접속
    • URL: <grafana-host>
    • 기본 로그인 정보
      • ID: admin
      • Password: 설치 시 생성된 비밀번호 확인
  • K6 대시보드
    • K6 테스트 데이터가 실시간으로 시각화된 대시보드를 확인합니다.
    • 주요 메트릭:
      • HTTP 요청 수
      • HTTP 실패율
      • 데이터 송수신량

 

5. Troubleshooting

  1. Ingress 설정 문제
    • className 또는 annotations 설정을 확인
    • Grafana와 Prometheus의 Ingress 경로가 올바르게 설정되었는지 점검
  2. Grafana 대시보드 자동 추가 실패
    • dashboards 및 dashboardProviders 설정 검토
    • 대시보드 경로가 /var/lib/grafana/dashboards에 올바르게 배치되었는지 확인
  3. Prometheus 메트릭 수집 문제
    • Prometheus의 scrape_configs 경로에서 Grafana 및 K6 메트릭이 정상적으로 수집되고 있는지 확인

 

결론

이번 작업에서는 K6, Prometheus, Grafana를 통합하여 Kubernetes 환경에서 성능 테스트와 데이터 시각화를 구현했습니다. 이 과정을 통해 메트릭 수집부터 시각화까지의 전체 흐름을 이해하고, 문제 해결을 통해 안정적인 구성을 완료할 수 있었습니다.

이와 같은 환경은 서비스의 성능 모니터링뿐 아니라, 안정적인 클라우드 인프라 구축에 중요한 기반을 제공합니다. 😊