[k8s] Prometheus & Grafana 구축
Tags: Grafana, K8s, Monitoring, Prometheus, Kubernetes

0. Helm Install

Prometheus 를 Helm 차트를 이용해서 구축을 진행할 것이기에 먼저, Helm 을 설치하여 주도록 하자, Helm 설치는 공식문서를 참고하였다.

# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3

# chmod 700 get_helm.sh

# ./get_helm.sh

그리고 난 후, Helm의 공식 Repo를 git으로 clone 하자. 공식 Repo를 바로 등록해서 helm install을 하게되면, 구성 후, Yaml 수정과 배포를 다시 반복해야 하기 때문에 Repo를 clone 한 후, 수정하고 나서 helm으로 한번에 설치를 진행하는게 편리하다.

#git clone https://github.com/helm/charts.git

공식 Helm Repo는 오픈되어 있기 때문에 손쉽게 받아 올 수 있다.

Chart Download

#cd charts/stable

#helm lint prometheus-operator

먼저 helm lint 커맨드를 이용하여 해당 차트를 컴파일(?) 해보면, 다음과 같은 경고를 확인할 수 있다.

[WARNING] /root/helm/prometheus-operator: chart directory is missing these dependencies: kube-state-metrics,prometheus-node-exporter,grafana

prometheus-operator 차트가 다음과 같은 3가지 차트와 의존성이 걸려있다는 뜻이다. 따라서 3개의 차트를 패키징하여 prometheus-operator 차트에 포함시켜주자

#helm package kube-state-metrics

#helm package prometheus-node-exporter

#helm package grafana

위 커맨드를 이용하면 .tgz 라는 패키징된 압축파일이 생기게 된다 해당 파일을 prometheus-operator로 옮겨주자

#mkdir ./prometheus-operator/charts

#mv *.tgz ./prometheus-operator/charts

#cp -r ./prometheus-operator ~/

#cd ~

홈으로 해당 디렉토리를 복사하여(편의를 위해서) 차트를 배포하기 전에values.yaml 파일을 수정하여 변수값을 설정해주자

2. Values Setup

#cd ~/prometheus-operator/

#vi values.yaml

...

...

storage: #alert manager의 storage 설정이다.

volumeClaimTemplate:

spec:

storageClassName: csi-rbd-sc

accessModes: ["ReadWriteOnce"]

resources:

requests:

storage: 10Gi

...

storageSpec: #Prometheus의 storage 설정

volumeClaimTemplate:

spec:

storageClassName: csi-rbd-sc

accessModes: ["ReadWriteOnce"]

resources:

requests:

storage: 10Gi

...

위의 경우 나는 현재 클러스터에 Ceph 스토리지를 구축해놓은 상태이기 때문에 위처럼 Ceph RBS를 StorageClass로 설정을 하도록 설정을 해두었다. 기본 설정인 emptyDir 로 배포를 해도 배포는 진행되지만, 혹시 파드가 죽어서 재생성 되거나 하면 Data가 모두 날아가게 된다.

위 처럼 꼭 storageClass를 이용하여 pvc 로 스토리지를 파드에 할당하지 않더라도, HostPath 나 nfs 등등 다른 방식으로 만든 스토리지도 사용가능하니 상황에 맞게 yaml을 수정해주면 된다.

3. Chart Deploy

수정한 Chart를 이제 helm 을 이용하여 배포해보자 커맨드는 아래와 같다.

#kubectl create namespace prometheus

#helm install [provider name] [chart dir] --namespace [namespace]

ex) #helm install prometheus ./prometheus-operator --namespace prometheus

배포가 성공적으로 되면 아래와 같이 확인 할 수 있다.

[root@kube-master01 helm]# helm list -n prometheus

NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION

prometheus prometheus 2 2021-01-18 15:26:29.871931175 +0900 KST deployed prometheus-operator-9.3.2 0.38.1 [root@kube-master01 helm]# kubectl get po -n prometheus

NAME READY STATUS RESTARTS AGE

alertmanager-prometheus-prometheus-oper-alertmanager-0 2/2 Running 0 8m44s

prometheus-grafana-6dfc75647d-88kwn 2/2 Running 0 3d

prometheus-kube-state-metrics-95d956569-57dsn 1/1 Running 0 3d

prometheus-prometheus-node-exporter-9h4ls 1/1 Running 0 3d

prometheus-prometheus-node-exporter-h8kjp 1/1 Running 0 3d

prometheus-prometheus-node-exporter-lxhz6 1/1 Running 0 3d

prometheus-prometheus-node-exporter-pmtbk 1/1 Running 0 3d

prometheus-prometheus-oper-operator-6d9c4bdb9f-d2f66 2/2 Running 0 3d

prometheus-prometheus-prometheus-oper-prometheus-0 3/3 Running 1 3d [root@kube-master01 helm]# kubectl get svc -n prometheus

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 3d

prometheus-grafana ClusterIP 10.111.129.168 <none> 80/TCP 3d

prometheus-kube-state-metrics ClusterIP 10.109.67.250 <none> 8080/TCP 3d

prometheus-operated ClusterIP None <none> 9090/TCP 3d

prometheus-prometheus-node-exporter ClusterIP 10.110.159.6 <none> 9100/TCP 3d

prometheus-prometheus-oper-alertmanager ClusterIP 10.110.97.8 <none> 9093/TCP 3d

prometheus-prometheus-oper-operator ClusterIP 10.109.217.45 <none> 8080/TCP,443/TCP 3d

prometheus-prometheus-oper-prometheus ClusterIP 10.100.184.60 <none> 9090/TCP 3d

4. Export Grafana

배포는 위처럼 하면 완료 됬고, kube-proxy를 이용해서 Grafana 포탈을 접속할 수있지만, 이보다는 NodePort를 이용하여 clusterIP:NodePort 로 접속을 하는게 더 편하고, 이보다는 LoadBalancer를 이용하여 LoadBalancer Ip로 접속하는 것이 더 편리하고 관리도 쉽다

MetalLB로 LoadBalancer IP Pool을 구성해놓았기 때문에 Grafana 서비스타입만 바꿔주면 된다.

#kubectl edit svc -n prometheus prometheus-grafana

...

type: LoadBalancer

기존에 설정되어있는 ClusterIP 에서 LoadBalancer 로 타입을 바꿔주고 저장하면 다음과 같이 확인할 수 있다.

[root@kube-master01 helm]# kubectl get svc -n prometheus prometheus-grafana

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

prometheus-grafana LoadBalancer 10.111.129.168 10.1.10.25 80:30423/TCP 3d

따라서, MetalLB에 의해서 외부 IP로 노출된 Grafana 접속 주소는 다음과 같다. http://10.1.10.25:80 해당 url로 접속하면 다음과 같은 Grafana Web을 확인할 수 있다.

ID: grafana

PWD: prom-operator

접속하여 Home 메뉴에 아래로 쭉 스크롤 하여 Nodes 를 보면 다음과 같이 클러스터의 각 노드의 리소스들을 확인 할 수 있다.

Grafana를 더욱 유용하게 사용할 수 있도록 DIY하여 원하는 정보를 모니터링 하고, Alert를 이용하여 효율적으로 클러스터의 리소스를 운영하도록 하자