[k8s] Prometheus & Grafana 구축

minujana
10 min readJan 18, 2021

--

이번 포스팅에서는 쿠버네티스 클러스터에 Prometheus 와 Grafana를 구축하여 리소스 모니터링 환경을 만들어 보겠다. 앞서 포스팅에서 구축했던 환경에 그대로 이어서 진행을 했다. 특별히 Prometheus나 Grafana를 위한 요구사항이 있는것 같지는 않으니 각자의 환경에 맞춰 진행하면 될듯하다.

현재 구축을 진행하는 k8s 클러스터 환경은 다음과 같다.

  • 마스터 3 node (3중화)
  • 워커 1 node
  • Ceph Cluster 4 node (위 4개 노드 사용)
    → Ceph RBD
    → Ceph FileSystem
  • LoadBalancer (MetalLB)

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는 오픈되어 있기 때문에 손쉽게 받아 올 수 있다.

  1. 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를 이용하여 효율적으로 클러스터의 리소스를 운영하도록 하자

--

--

minujana
minujana

No responses yet