[Grafana] 시작 및 소개 (with k8s)
Grafana는 모니터링 업계를 주도하는 오픈소스 기반 기업 중 하나다.
요즘에 와서는 조금 저렴하게 모니터링 스택을 자체 구축한다고 하면 거의 최우선순위로 고려되는 오픈소스 스택이라고 할 수 있다.
처음에는 2014년쯤에 Prometheus 같은 시계열 DB 데이터를 시각화하는 시각화 도구로 시작해서, 문어발처럼 모니터링 전반으로 기술 범위를 확장해나갔다.
이 포스트에서는 Grafana에 대한 개략적인 소개와 기본 설치 방법 정도만 다룬다.
타 시스템과의 연동
흔히 Grafana라고 말하는 것은 대시보드 인터페이스 그 자체를 말하고, 여러가지 DB나 데이터소스의 데이터를 긁어와서 볼만하게 시각화해주는 것을 주 목적으로 삼는다.
아래는 프로메테우스로 metric 대시보드를 구성한 예시다.
이외에도 사용할 수 있는 외부 데이터소스는 매우 많다.

지원되는 데이터 소스를 보면 별별게 다 있다. 어지간한건 다 꼽을 수 있다.
Grafana Stack
그라파나는 다른 시스템들과의 연동도 풍부하게 지원하지만, 그 시스템들의 대체재들도 상당수 자체적으로 구현해서 지원한다.
그 예로,
- Mimir는 자체적으로 만들어서 제공하는 메트릭 스토리지다. 그러니까, Prometheus를 대체할 수 있다.
- Loki는 로그 저장 및 검색 시스템이다. 로그를 저기다 쌓고 Grafana를 통해서 다룰 수 있다.
- Tempo는 전반적인 trace 모니터링 정보를 저장하는 시스템이다. 이 trace가 몇초동안 실행되었고, 오류를 얼마나 발생했고 그런걸 추적하는 용도다.
- pyroscope는 프로파일링 정보를 실시간으로 수집하는 용도의 시스템이다.
각 구성요소의 사용법에 대해서는 따로 정리해둔 포스트가 있다.
https://blog.naver.com/sssang97/223478540289
라이센스
Grafana는 기본적으로 오픈소스 라이센스다.
초기에는 자유로운 Apache 라이센스를 쓰다가, 다른 기업들이 날먹하는걸 막으려고 프로젝트들을 대부분 AGPL로 바꾼 상태다. 상당히 까다로운 라이센스다.
단순히 이걸 서버로 실행하는건 되는데, Grafana 자체의 코드를 수정해서 쓰거나, Grafana 소스를 import한 프로그램을 만든다거나 하면 소스 공개 의무가 생기는 그런거다.
그래도 비슷한 기업형 오픈소스인 MongoDB/Elasticsearch 진영들이 지저분한 라이센스를 달아놓은 것에 비하면 낫다.
AGPL을 사용할 수 없는 경우라면 아예 엔터프라이즈 버전을 받고 엔터프라이즈 라이센스를 따라야 한다.
엔터프라이즈 버전은 유료 자체 라이센스인 Grafana Labs 라이센스가 적용된다.
근데 뭐 이걸로 뭔 부가서비스를 만드는게 아닌 이상 라이센스로 고민을 할 일은 거의 없을 것 같다. 대부분은 그냥 쿠버에 서버 올려서 쓰는 정도로 만족하지 않겠나...?
Cloud 서비스
기업형 오픈소스라고 얘들도 클라우드 서비스를 제공한다.
위에서 언급했던 Grafana 자체 Stack 시스템들을 자동으로 구성해서 제공해주는 정도다.
무료 사용랑이 있긴 한데.. 로그 50기가를 누구 코에 붙이지..?
수요가 얼마나 있는지는 모르겠다.
보통 돈이 많으면 Datadog으로 가고, 돈이 모자라면 Grafana를 쓰는 분위기라...
https://grafana.com/products/cloud/
Grafana 대시보드 구성 (k8s)
다른건 하지 않고 일반 뼈대가 되는 대시보드부터 구성해보자.
helm을 통해 설치할 것이다.
repo 받고
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update

네임스페이스 적절히 만들어준 다음에
kubectl create namespace grafana

설치한다.
helm install grafana grafana/grafana --namespace grafana

그리고 좀 기다리면 기본 리소스들이 생성된 것을 볼 수 있을 것이다.

근데 저 서비스가 별도 설정이 없으면 IP가 안열려서 볼 수가 없기 때문에, Service를 통해 외부 IP 할당을 해주는게 일반적인 사용법이 될 것이다.
kubectl patch svc grafana -n grafana -p '{"spec": {"type": "LoadBalancer"}}'

서비스에 대해서는 별도 포스트를 참조한다.
https://blog.naver.com/sssang97/223084158042
그렇게 IP를 뚫으면 그걸로 바로 접근이 가능하다.
그럼 이제 로그인을 해줘야 하는데
kubectl get secret --namespace grafana grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
이러면 최초 생성 패스워드가 튀어나오고
admin으로 로그인하면
들어가진다.

패스워드만 적당히 바꿔주고 둘러보자.
대시보드 섹션이 있지만, 아무것도 설정하지 않았기 때문에 뭔가 시각화해서 보여줄 거리는 없다.
config 설정하기
위에서는 별다른 설정도 없이 기본값으로 모든걸 구성했다.
하지만 저 기본 설정에서는 빠진 것도 많고, 프로덕션 환경에서 사용하기에는 모자란게 많다.
우선 디폴트 구성 yaml을 다운받는다.
curl https://raw.githubusercontent.com/grafana/helm-charts/main/charts/grafana/values.yaml > grafana.yaml
vi grafana.yaml

그럼 뭐 이런 식으로 잔뜩 뭐가 있는데, 하나씩 봐보자.
가장 중요한건 볼륨 설정이다.
기본 설정은 볼륨 설정이 꺼져있기 때문에, 이 Grafana 서버의 정보는 휘발성을 가진다.
그러니까, 컨테이너 내려갔다 다시 올라가면 모든 설정이 초기화된다는 것이다.
일반적인 환경에서는 이걸 활성화만 해주면 볼륨에 저장을 하기 때문에, 영속성을 보장할 수 있다.
여기서 유의할 점은, 클라우드 환경에서는 이게 클라우드 제공 볼륨으로 동적 볼륨 조정이 돼서 자동으로 처리되는데, 온프레미스 환경에서는 별도 설정 없이는 동작하지 않을 수 있다는 것이다.
참조
https://blog.naver.com/sssang97/223096927913
또 하나는 플러그인이다.
여기다 적당히 필요한 플러그인을 추가하면, 시작할때 플러그인을 설치하고 시작한다.

- alexanderzobnin-zabbix-app
- grafana-clock-panel
이렇게 적당히 추가해주면 된다.
또 하는 서비스다.
위에서는 kubectl patch를 통해 후처리로 로드밸런서를 열었었는데,
그냥 여기서 바꿔줘도 된다.
그리고 helm upgrade를 사용하면 바로 적용시킬 수 있다.
helm upgrade grafana grafana/grafana -f grafana.yaml -n grafana

좀 기다리면 된다.
참조
https://grafana.com/docs/grafana/latest/setup-grafana/installation/helm/
https://opensource.stackexchange.com/questions/5003/agplv3-source-redistribution-when-does-it-apply-to-my-code-for-a-server-side-ja/5004#5004
https://stackoverflow.com/questions/67457018/why-do-i-keep-getting-error-5-pod-has-unbound-immediate-persistentvolumeclaims