쿠버네티스 교육

15. Kube 교육 - Prometheus Stack 설치

Jerry_이정훈 2021. 6. 4. 16:45
728x90

실습

  • prometheus-stack 설치
  • grafana 기본 모니터링 페이지 확인

Why Prometheus?

Kube 환경에서는 Prometheus가 모니터링 표준 입니다. (이미 2018년 CNCF Graduated, Kubernetes 이 후 2번째 CNCF 졸업 Project 입니다.) 다른 툴 비교하지 마시고 그냥 사용하시면 됩니다. ^^ 예산이 있다면 상용 툴 사용하는 것도 나쁘지 않습니다.

 

모니터링은 정말 Custom 영역이 많이 들어가는 부문이라 각 회사 상황에 따라 시간과 노력이 많이 필요 합니다. 운영 하면서 당연히 끊임없이 개선이 필요한 부문이죠. 그 광활한 부문 중 이번 포스팅에서는 설치 방법과 모니터링 페이지 확인까지 다루겠습니다.

 

Prometheus-stack 설치

다른 모든 application과 동일하게 prometheus도 Helm 으로 설치가 가능합니다. 특히 prometheus는 community에서 prometheus-stack, 즉 stack(쌓아올린 거) 이므로 prometheus 뿐만 아니라 prometheus-operator, grafana, alertmanager까지 한꺼번에 설치 가능한 Helm Chart를 제공합니다. 

 

두 번 특히는 다양한 grafana 모니터링 대쉬보드 및 alertmanager rule 까지 함께 포함되어 별다른 추가 작업 없이도 바로 실 운영 환경에 적용 가능한 수준이라 아주 훌륭합니다. 아마도 1주일 이상 작업이 필요할텐데, 30분 안에 끝낼 수 있습니다.


https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

 

prometheus-community/helm-charts

Prometheus community Helm charts. Contribute to prometheus-community/helm-charts development by creating an account on GitHub.

github.com

Helm Chart 파일을 다운받습니다.

[spkr@erdia22 29.Prometheus (spkn02:redis)]$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
te"prometheus-community" has been added to your repositories

[spkr@erdia22 29.Prometheus (spkn02:redis)]$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "harbor" chart repository
...Successfully got an update from the "helm-openldap" chart repository
(이하 생략)

[spkr@erdia22 29.Prometheus (spkn02:redis)]$ helm pull prometheus-community/kube-prometheus-stack

[spkr@erdia22 29.Prometheus (spkn02:redis)]$ tar xvfz kube-prometheus-stack-16.1.0.tgz 
kube-prometheus-stack/Chart.yaml
kube-prometheus-stack/Chart.lock
kube-prometheus-stack/values.yaml
(이하 생략)

향후 관리 편의를 위하여 directory 이름을 버전 이름으로 변경합니다. 

[spkr@erdia22 29.Prometheus (spkn02:redis)]$ mv kube-prometheus-stack kube-prometheus-stack-16.1.0

[spkr@erdia22 29.Prometheus (spkn01:prometheus)]$ ls -lrt
total 328
drwxr-xr-x 5 spkr spkr   4096 Apr 30 16:02 kube-prometheus-stack-14.3.0
drwxr-xr-x 5 spkr spkr   4096 May  3 14:56 kube-prometheus-stack-15.3.1
-rw-r--r-- 1 spkr spkr 298958 May 28 02:38 kube-prometheus-stack-16.1.0.tgz
drwxr-xr-x 5 spkr spkr   4096 May 28 02:40 kube-prometheus-stack-16.1.0
(이렇게 디렉토리 별로 관리하면 나중에 시간을 절약할 수 있습니다. ^^)

Helm Chart 수정

향후 히스토리 확인을 위하여 기존 values.yml Copy하여 새로운 my-values.yml 파일을 만듭니다. 

[spkr@erdia22 kube-prometheus-stack-16.1.0 (spkn02:redis)]$ cp values.yaml my-values.yml

문제는 my-values.yml 파일이 수정하기에 너무 길다는 것 입니다. ^^ (전체 2494 line…) 전체 내용을 알수는 없지만 인내를 가지고 아는 부문만 조금씩 변경하면 됩니다. ^^ 운영을 하시다 보면 필요에 의하여 하나씩 하나씩 알 수 있는 날이 옵니다. 

 

먼저 alertmanager, prometheus 의 service type을 ClusterIP 에서 NodePort(혹은 LoadBalancer)로 변경 합니다.

Prometheus resources 수정. scrape metric이 많은 경우 resource 문제가 있으므로 resource 여유 상황에 따라 넉넉하게 resource를 할당합니다. 

retention period 및 size는 중요합니다. 말 그대로 모니터링 데이터를 유지(retention)하는 기간 및 용량 입니다. 회사의 정책에 맞게 6개월, 1년 등으로 수정합니다. 

PVC 관련 설정도 변경 합니다.

전체 파일 내역은 아래 gist 사이트 파일 참조 하시면 됩니다. 

https://gist.github.com/junghoon2/158ab7ee3843241e5bd800f5b51fd2e9

 

prometheus-stack-values.yml

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 변경 내역은 향후 history 관리에 용이하도록 my-values.yml 최상단에 아래와 같이 별도 comment로 저장하시는 걸 추천 드립니다. 

만약 기존 설치 내역이 있으시면 아래와 같이 VSCode.Compare Selected 통하여 변경 내역만 빠르게 확인 할 수 있습니다. 

그라파나의 경우 별도 chart 디렉토리를 사용합니다. kube-prometheus-stack-16.1.0 - charts - grafana - values.yaml 파일을 수정합니다. 

동일하게 Storage Class, Nodeport, Resource limits/requests을 수정 합니다. 상세 values.yml 파일은 아래 링크를 참조 합니다.

https://gist.github.com/junghoon2/db0161e1140c72798a1ee486b0fb03c1

 

grafana-values.yml

GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 Helm Prometheus-stack 설치

먼저, 설치를 위한 Prometheus namespace 생성하시고 namespace를 변경합니다. (monitoring namespace도 많이 사용합니다.)

[spkr@erdia22 kube-prometheus-stack-16.1.0 (spkn02:prometheus)]$ k create ns prometheus

[spkr@erdia22 kube-prometheus-stack-16.1.0 (spkn02:redis)]$ kns prometheus
Context "spkn02" modified.
Active namespace is "prometheus".

설치를 시작합니다.

[spkr@erdia22 kube-prometheus-stack-16.1.0 (spkn01:prometheus)]$ helm install prometheus -f my-values.yml .
NAME: prometheus
LAST DEPLOYED: Fri May 28 03:58:36 2021
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace prometheus get pods -l "release=prometheus"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

설치가 약 3분 정도 걸립니다. 에러 아니니 쫄지 마시고 기다려 주시면 됩니다. ^^ 다양한 POD가 생성되고 있습니다.

[spkr@erdia22 47.GitLab (spkn01:prometheus)]$ kgpw

NAME                                                READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
prometheus-kube-prometheus-admission-create-w662x   0/1     Pending   0          0s    <none>   <none>   <none>           <none>
prometheus-kube-prometheus-admission-create-w662x   0/1     Pending   0          0s    <none>   node3    <none>           <none>
prometheus-kube-prometheus-admission-create-w662x   0/1     ContainerCreating   0          0s    <none>   node3    <none>           <none>
prometheus-kube-prometheus-admission-create-w662x   0/1     ContainerCreating   0          1s    <none>   node3    <none>           <none>
(이하 생략)

설치가 완료되면 아래와 같이 전체 POD가 정상 Running 중인 걸 확인 할 수 있습니다. 

[spkr@erdia22 diamanti-k8s-bootcamp (spkn01:prometheus)]$ kgp
NAME                                                     READY   STATUS    RESTARTS   AGE     IP              NODE    NOMINATED NODE   READINESS GATES
alertmanager-prometheus-kube-prometheus-alertmanager-0   2/2     Running   0          9m17s   10.233.92.44    node3   <none>           <none>
prometheus-grafana-84457b89df-2mnkf                      2/2     Running   0          9m34s   10.233.92.41    node3   <none>           <none>
prometheus-kube-prometheus-operator-5ffb587599-2stt6     1/1     Running   0          9m34s   10.233.92.36    node3   <none>           <none>
prometheus-kube-state-metrics-5b8f9bdbbd-msbth           1/1     Running   0          9m34s   10.233.92.40    node3   <none>           <none>
prometheus-prometheus-kube-prometheus-prometheus-0       2/2     Running   1          9m17s   10.233.96.67    node2   <none>           <none>
prometheus-prometheus-node-exporter-86pjn                1/1     Running   0          3m9s    172.17.16.151   node1   <none>           <none>
prometheus-prometheus-node-exporter-fbq69                1/1     Running   0          9m34s   172.17.16.152   node2   <none>           <none>
prometheus-prometheus-node-exporter-vl788                1/1     Running   0          9m34s   172.17.16.153   node3   <none>           <none>

이제 설치가 완료 되었습니다. 참 간단합니다. ㅎㅎ

 

Grafana 대쉬보드 확인

이제 모니터링 대쉬보드를 확인 하겠습니다. 

 

먼저 IP, 포트를 확인합니다.

[spkr@erdia22 47.GitLab (spkn01:prometheus)]$ k get svc
NAME                                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
alertmanager-operated                     ClusterIP   None            <none>        9093/TCP,9094/TCP,9094/UDP   40m
prometheus-grafana                        NodePort    10.233.31.89    <none>        80:30885/TCP                 41m
prometheus-kube-prometheus-alertmanager   NodePort    10.233.45.1     <none>        9093:30903/TCP               41m
prometheus-kube-prometheus-operator       ClusterIP   10.233.59.179   <none>        443/TCP                      41m
prometheus-kube-prometheus-prometheus     NodePort    10.233.54.103   <none>        9090:30090/TCP               41m
prometheus-kube-state-metrics             ClusterIP   10.233.52.131   <none>        8080/TCP                     41m
prometheus-operated                       ClusterIP   None            <none>        9090/TCP                     40m
prometheus-prometheus-node-exporter       ClusterIP   10.233.34.205   <none>        9100/TCP                     41m

grafana 서비스의 port는 30885 입니다. 참고로 node ip는 아래와 같이 nodes -o wide로 확인 가능합니다.

[spkr@erdia22 47.GitLab (spkn01:prometheus)]$ k get nodes -o wide
NAME    STATUS   ROLES    AGE    VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
node1   Ready    master   112d   v1.19.7   172.17.16.151   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://19.3.14
node2   Ready    master   112d   v1.19.7   172.17.16.152   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://19.3.14
node3   Ready    <none>   112d   v1.19.7   172.17.16.153   <none>        CentOS Linux 7 (Core)   3.10.0-1062.12.1.el7.x86_64   docker://19.3.14

브라우저에서 해당 IP, Port로 접속하시면 정상적으로 페이지 확인 할 수 있습니다.

password는 my-values.yml 파일에 설정하신 걸 사용합니다. 

 

다음으로 grafana 설정 관련입니다. prometheus-stack 이 좋은 게 이미 필요한 설정을 default로 포함되어 있습니다.

 

Data Sources를 확인해 보면 (화면 왼편)

이미 Prometheus가 등록되어 있습니다. (prometheus service 이름입니다.)

그뿐만 아니라 (정말 좋은게) 기본 모니터링 페이지도 같이 포함되어 있습니다. 화면 왼편 대쉬보드 - Manage를 확인해 보겠습니다. 

확인해보면 아래와 같이 많은 dashboards가 기본으로 포함되어 있습니다. 물론 기본 dashboards라 회사 상황에 맞지 않을 수 있습니다. 하지만 대쉬 보드 생성 시 기존 풍부한 대쉬보드를 참조 할 수 있어서 작업 시간을 엄청 절약 할 수 있습니다.  

각 대시보드를 선택하시면 다양한 Metric 확인이 가능합니다. (이걸 전부 일일이 만들기는 불가능했을 것 같습니다.)

 

사례로 실 운영 중인 Service 사용 현황 대시보드 몇가지 공유해 드립니다.

 



 

다음 포스팅에서 Custom 그라파나 대쉬보드 생성 및 Alertmanager 설정 등에 대하여 다루어 보겠습니다.

 

감사합니다.

 

Kubernetes 교육, 컨설팅, 기술 지원 문의 : leejunghoon@spkr.co.kr 

 

반응형