MSA 구조를 운영하고자 할 때 가장 힘든 것은 수 많은 마이크로 서비스에 대한 관리와 운영일 것입니다.
하지만 리소스가 어떤 상태인지 모르고 관리와 운영을 한다는 것은 어불성설이겠죠.
그래서 Kubernetes 등의 MSA 구조를 운영하고자 할 때 "관측 가능성(Observability)"을 확보하는 것이 무엇보다 중요합니다.
특히 현재 가장 대중화된 디플로이 환경인 Kubernetes의 관측 가능성을 확보할 수 있는 툴들이 많이 등장했는데요.
이번 포스팅에서는 Kubernetes의 모니터링과 로깅을 위해 가장 많이 선택하는 Prometheus + Loki + Grafana 스택을 구성해보겠습니다.
구성하는 환경은 GCP의 관리형 Kubernetes 서비스인 GKE를 기반으로 하지만 바닐라 Kubernets나 다른 플랫폼의 관리형 Kube 서비스도 다를 것은 없습니다.
1. 관측 가능성 확보를 위한 첫 단계 - Monitoring
모니터링(Monitoring)이라고 하는 것이 무엇일까요?
흔히 시스템의 관측 가능성(Observability)를 확보하고자 할 때 빠지지 않는 단어가 모니터링이라는 단어입니다.
시스템 관리에서 모니터링이란 메트릭(Metric)이라는 시계열(Time-series)로 표현한 수치를 지속적으로 측정 및 수집함으로써 시스템이 어떤 상태에 있는지 보고자 하는 것입니다.
CPU 사용률(Utilization), Ram 이용률(Usage), 트래픽 지연 시간(Latency) 등 숫자로 표현되는 데이터를 시간 별로 수집한 것이 모니터링에 사용되는 데이터입니다.
그리고 Kuberenets에서 모니터링을 위해 사용되는 대표적인 툴이 Prometheus입니다.
정확히 말하자면 Prometheus는 메트릭(Metric)을 포함한 시계열(Time-series) 데이터를 수집하고 이를 기반으로 쿼리(query)하거나 경고(Alerting)할 수 있게 해주는 오픈소스 모니터링 툴입니다.
아래 이미지는 실제 Prometheus가 동작하는 아키텍쳐입니다.
중앙에 위치한 Prometheus server가 exporter로부터 metric을 당겨(pull)오거나, 경고를 보내(Push)거나, PromQL이라는 쿼리문을 바탕으로 응답을 보내주는 역할을 하게 됩니다.
Prometheus server를 제외한 Exporter, Data visualization, Alerting destination 등 나머지 구성요소들은 사용자 요건에 맞게 선택이 가능합니다.
이번 포스팅에서는 Exporter는 Node expoter, kube-state-metrics를, Data visualization은 Grafana를, Alert의 목적지는 Google Chat으로 구성해보겠습니다.
메트릭을 수집하는 exporter의 일종인 Node exporter에 대한 자세한 내용은 여기를, 데이터 시각화 툴인 Grafana는 여기를 참고하시면 되겠습니다.
Grafana는 2부에서 설치를 진행하도록 합니다.
2. Kubernetes Cluster 생성
이번 포스팅에서는 Google Cloud Platform의 관리형 Kubernetes 서비스인 GKE를 기반으로 툴들을 설치해보겠습니다.
그렇기 때문에 우선 GKE 클러스터를 생성하겠습니다. 생성 자체는 특별한 설정이 필요 없으니 이름과 리젼만 지정 후 생성하겠습니다.
Cluster가 생성되었다면 아래 명령어를 통해 새로운 namespace를 생성합니다.
1
|
kubectl create ns monitor
|
cs |
이것으로 GKE 단에서는 준비할 것이 끝났습니다.
3. Prometheus 설치
이제 본격적으로 GKE Cluster에 Prometheus를 설치해보겠습니다.
Prometheus를 설치하는 방법은 Docker, binary 등 다양한 방법이 있지만 이번 시간에는 가장 편리한 방법인 패키지 매니저 Helm을 이용한 설치를 진행하겠습니다.
Helm은 Kubernetes를 위한 패키지 매니저 툴로 레포지토리에서 아티팩트를 가져오는 것처럼 Chart라고 하는 패키지를 통해 Kubernetes 리소스들을 한 번에 가져올 수 있는 편리한 툴입니다.
환경에 Helm이 설치되어 있지 않다면 여기를 참고해 설치를 진행합니다.
추가할 레포지토리는 "kube-prometheus-stack"이라는 chart를 설치하기 위한 레포지토리이며 Node_expoter와 Grafana, kube_state_metrics를 포함하고 있습니다.
node_exporter는 노드 단의 메트릭을 수집해 Prometheus server에게 노출하는 exporter로 노드의 cpu 사용률, 램 사용률, 내트워크 대역폭 등 하드웨어에서 측정할 수 있는 수치를 보기 위해 설치합니다.
Kube_state_metrics는 Kubernetes 단의 메트릭을 수집하는 exporter로 pod리소스, deployment 리소스, replicaset 리소스 등 kubernetes api에서 측정할 수 있는 수치를 보기 위해 설치합니다.
두 exporter의 조합으로 Cluster의 하드웨어 단과 Kubernetes단의 메트릭에 대한 관측 가능성을 확보할 수 있습니다.
Helm 설치까지 완료했다면 이제 Prometheus를 설치할 레포지토리를 추가합니다.
1
2
|
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
|
cs |
이제 helm install.. 명령어만 입력하면 Prometheus를 설치할 수 있지만 주의해야 할 점이 있습니다.
Default로 설치를 진행하게 되면 emptydir에 Prometheus 데이터를 적재하기 때문에 노드가 삭제되면 데이터도 그대로 날아가게 됩니다.
이런 난감한 상황을 방지하려면 Prometheus가 Persistent volume을 마운트해 노드가 삭제되어도 데이터를 유지하도록 해야 합니다.
다행히도 helm 이용 시 몇 가지 값을 바꿔주는 것으로 쉽게 Persistent volume이 마운트된 상태로 Prometheus를 설치할 수 있습니다.
아래 명령어로 Chart의 value값을 가져옵니다.
1
|
helm show values prometheus-community/kube-prometheus-stack > prom-config.yaml
|
cs |
가져온 prom-config.yaml 파일은 Chart 설치 시 변경할 수 있는 값들의 매니페스트로 이루어져 있습니다.
파일을 아래와 같이 수정합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
storageSpec:
## Using PersistentVolumeClaim
##
volumeClaimTemplate:
spec:
storageClassName: standard
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 50Gi
|
cs |
위 명세는 prometheus가 emptydir가 아닌 standard 클래스의 스토리지를 Persistent Volume으로 사용하는 PersistentVolumeClaim 명세입니다.
이제 Prometheus 노드를 삭제해도 PV는 살아있어 데이터를 영구적으로 저장할 수 있습니다.
아래 사진과 같은 상태로 수정되었다면 파일을 다시 저장합니다.
이제 helm을 통해 설치를 진행하면 Prometheus가 Cluster에 설치됩니다. 아래 명령어로 설치를 진행합니다.
1
|
helm install --values prom-config.yaml prometheus prometheus-community/kube-prometheus-stack --namespace monitor
|
cs |
4. Prometheus 설치 확인
Prometheus가 올바르게 설치되었는지 확인하기 위해 아래 명령어로 포트포워딩을 실행합니다.
1
|
kubectl port-forward prometheus-promethes-kube-prometheus-prometheus-0 9090:9090 -n monitor
|
cs |
그 후 localhost:9090 주소로 접속하게 되면 아래와 같이 Prometheus web UI 화면을 볼 수 있습니다.
Prometheus 자체만으로는 대쉬보드의 기능이 빈약하지만 쿼리를 통해 간단한 모니터링은 할 수 있습니다.
예를 들어 검색창에 "prometheus_http_requests_total" 를 입력 후 Excute하게 되면 아래와 같이 관련 메트릭을 Graph형태로 시각화(Visualization)한 결과를 볼 수 있습니다.
여기까지 GKE Cluster에 모니터링을 위한 툴인 Prometheus를 설치해봤습니다.
클러스터의 Visibility의 확보를 위한 단계 중 이제 첫 단계를 완료한 셈입니다.
다음 포스팅에서는 데이터 시각화(Data visualization) 툴인 Grafana를 이용해 Prometheus로부터 가져온 데이터를 대쉬보드로 구성하고 Google chat Alerting과 Cloud Monitoring integration 기능도 사용해보겠습니다.
GKE Prometheus, Loki, Grafana로 Monitoring dashboard 구성하기(2)
GKE Prometheus, Loki, Grafana로 Monitoring dashboard 구성하기(3)
'Observability' 카테고리의 다른 글
Elasticsearch에 fluentd를 얹은 EFK stack 구축하기(with kubernetes) (9) | 2022.01.08 |
---|---|
클라우드 리소스 Observability 확보 도구 Steampipe 사용기 + GCP IAM report 제작기 (0) | 2021.12.27 |
Elasticsearch의 ELK Stack을 GKE Cluster에 구성해 GCP 관측 가능성 확보하기 (6) | 2021.12.12 |
GKE Prometheus, Loki, Grafana로 Monitoring dashboard 구성하기(3) (0) | 2021.08.20 |
GKE Prometheus, Loki, Grafana로 Monitoring dashboard 구성하기(2) (0) | 2021.08.12 |