23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
기존의 모놀리스한 방식의 소프트웨어와 달리, 다수의 Micro service들을 통해 서비스가 만들어지는 Container 및 kubernetes 환경에서 개별 동작에 대한 가시성의 확보는 점점 중요해지고 있다. 시스템, 소프트웨어, 서비스 등 IT 전반에서 정상적 운영과 활용을 위해 운영 자원들에 대한 모니터링은 필수 요소이다.
TACO는 Cloud Native한 환경을 지원하기 위한 Container 플랫폼을 제공하고 있으며, 플랫폼 및 내부의 구성요소를 모니터링 하도록 자체적인 LMA(Logging-Monitoring-Alerting) 서비스를 제공한다. TACO는 다양한 오픈소스를 활용하고 있으며 숫자기반 데이터를 수집하고 가시성을 제공하기 위한 주요 컴포넌트로 Prometheus를 사용하고 있다.
본 블로그에서는 Cloud환경에서 모니터링을 위한 사실상 표준으로 자리매김한 Prometheus에 대한 소개를 하고자 한다.
Prometheus는 SoundCloud사에서 만든 오픈소스 툴킷으로 시스템을 모니터링하고 알람을 발생시켜 운영을 지원하는 것을 주요한 기능으로 갖는다. CNCF를 통해 오픈 생태계를 확장해 왔으며, CNCF 졸업 후 다양한 회사들이 참여하고 있는 독립형 오픈소스 프로젝트로 자리잡았다. kubernetes를 사용하는 환경에서, Prometheus를 활용한 매트릭 수집 및 대시보드 구축이 표준적 모니터링 방식으로 자리잡고 있다.
.png)
다차원 데이터 지원
다차원 데이터 모델을 지원하여 다양한 데이터를 표기하고 저장할 수 있다.
강력한 검색
PromQL이라는 고유의 질의언어를 제공한다. PromQL을 사용하면 수집된 시계열 데이터를 원하는 시간대역을 옮기면서 자르고 분류할 수 있으며 그래프/테이블/알람을 생성에 활용할 수 있다.
훌륭한 시각화
Prometheus 자체의 웹UI를 통해 데이터에 접근할 수 있고 Grafana 통합 및 콘솔 템플릿 언어등 다양한 시각화 방식을 지원한다.
효율적 저장소
지정된 방식으로 데이터를 메모리와 로컬 디스크에 저장한다. 기능별로 분리해서 데이터를 수집할 수 있으며 통합기능(federation)을 사용하면 성능을 확장할 수 있다.
간단한 운영
일반 모니터링 시스템들이 공유저장소를 활용하여 복잡한 구조를 가져가고 다수의 서버를 운영해야 하는 것에 비해 prometheus는 단일 시스템에서 로컬저장소를 사용하므로 서버별 독립성을 갖고 간단하게 운영할 수 있다.
정확한 알람발생
알람은 PromQL을 통해 정의될 수 있으며 Alertmanager를 통해 notification 서비스를 제공한다.
다양한 클라이언트 라이브러리
다양한 언어의 클라이언트 라이브러리를 제공하며 추가적으로 사용자 라이브러리를 추가하는것도 지원하고 있다. 이를 사용하여 원하는 서비스에 모니터링을 쉽게 적용할 수 있다.
많은 통합방식
기존 모니터링에서 수집되는 데이터에 대한 통합을 지원하기 위한 다양한 기능들이 존재
아래 그림은 Prometheus의 컴포넌트들과 서로간의 관계를 한눈에 보여준다.

Deployment View와 Logical View가 혼용되어 있고 Prometheus와 주변시스템까지 담고 있어 다소 복잡하게 보여질 수 있으므로 아래에서 데이터의 흐름과 연관지어 간단하게 설명한다.
Jobs/exporter는 메트릭을 수집하는 프로세스로 간단하게 모니터링 데이터를 수집하는 Agent 역할을 한다. exporter는 수집한 메트릭을 HTTP를 통해 가져갈 수 있도록 /metrics라는 HTTP endpoint를 제공한다.
Prometheus server는 exporter에 수집된 데이터를 주기적으로 가져와(Retrieval) 시계열 저장소에 넣고(TSDB) 독자적인 웹서버(HTTP sever)를 통해 조회 및 활용할 수 있도록 한다. agent가 데이터를 서버로 넣어주는 PUSH방식을 사용하는 대부분의 모니터링 시스템과 다르게 prometheus는 exporter들의 HTTP endpoint에서 수집된 데이터를 주기적으로 가져오는 역할을 수행하는 Pool 방식으로 동작한다.
Alertmanger는 Prometheus Server가 판단한 내용을 기반으로 알람을 보내주면 이를 설정된 방식으로 notification 해주는 역할을 한다.
Grafana를 비롯한 다양한 클라이언트는 PromQL을 사용하여 데이터를 시각화하거나 재가공 할 수 있다.
앞에서 언급했던 것처럼 Prometheus는 server-side pool 방식을 사용하여 데이터를 수집하므로, exporter가 메트릭을 전달하기 위해서는 prometheus의 수집주기까지 메트릭을 유지하고 있어야 한다. 하지만 상황에 따라서 순간 발생하고 사라지는 spot성 데이터들이 있고 이들을 수집하기 위한 방법이 필요하고 Prometheus에서는 Pushgateway를 제공하고 있다. 짧은 주기를 갖는 데이터들을 pushgateway로 필요한 순간 보내면 데이터 발생주체(exporter)가 사라져도, prometheus의 데이터 수집주기에 pushgateway를 통해 그 데이터들을 수집해 갈 수 있다.
Prometheus server는 내부의 TSDB를 통해 노드의 로컬저장소로 수집된 메트릭을 저장한다.
Prometheus server는 다양한 방식으로 데이터 수집대상을 가져올수 있는데 위 그림의 serverice discovery에 표현되어 있다.
TACO에서는 메트릭 기반 모니터링 시스템으로 prometheus와 다양한 exporter를 활용했다. 본 절에서는 TACO에서 사용한 모니터링 스택의 구성과 사용방법을 제시한다.
.png)
첫번째로 모니터링이 필요한 모든 자원에 대한 exporter를 구성하고 배포하여 메트릭을 생성한다. TACO에서 사용한 exporter는 다음과 같다. (각 exporter는 필요에 따라 선별 설치한다.)
node exporter
cpu, memory, disk, network 등 노드에 대한 메트릭 수집
kubernetes exporter
kubernetes의 각 자원별 메트릭 수집
etcd exporter
etcd 운영 메트릭 수집
log exporter
로그기반 알람을 위한 메트릭 수집
elasticsearch exporter
elasticsearch 운영 메트릭 수집
processor exporter
프로세스에 대한 사용현황 메트릭 수집
ceph exporter
taco storage (ceph)에 대한 운영 메트릭 수집
openstack exporter
OpenStack 운영 메트릭 수집
...
두번째로 exporter로부터 데이터를 통합하고 이를 저장하는 역할로 prometheus를 사용한다. 앞에서 살펴본것처럼 prometheus는 단일 노드에서 로컬 저장소를 사용하여 데이터를 저장하고 있으며 단일 컨테이너에서 수집, 저장, 웹인터페이스 노출까지 모두 수행하는 단순한 구조를 갖는다.
세번째로 모아진 데이터는 다양한 어플리케이션이나 시각화 소프트웨어들을 통해 데이터를 활용하는 구성을 갖고 있고 Grafana로 다양한 dashboard를 만들어 사용하고 있다.
Kubernetes Cluster Status
ETCD Status
Node Status
Calico
Cluster Overview
...
.png)
TACO가 PaaS 플랫폼으로 진화하면서 다양한 클러스터를 구축하게되었고 각 클러스터를 하나로 연동하여 가시성을 제공해야 하는 필요가 발생했다. 상용, Stage, 개발등 용도별 환경의 분리뿐 아니라 고가용성을 위한 AZ 분리 등을 위해서도 클러스터를 분리하여 사용하는 경우들이 있었다. 앞에서 잠시 언급했던 prometheus의 federation기능을 사용하여 각 클러스터별 데이터를 하나로 모으고 함께 활용할 수 있는 구조를 설계하여 사용했다. 클러스터별 수집용 prometheus를 각각 배치하고 prometheus server들의 데이터를 모으는 모니터링 전용 클러스터를 구성하고 모니터링 클러스터에서 모아진 데이터를 기반으로 전체 클러스터의 상황에 대한 알람이나 대시보드를 만들어 활용헀다. 현재는 이러한 멀티클러스터 지원을 위한 주요 컴포넌트로 Thanos를 도입하고 변경 중 이다.
.png)
TACO에서는 prometheus를 operator를 통해 설치하고 있으며 operator와 custom resource를 배포하는데 helm을 사용한다.
prometheus는 prometheus-community라는 이름으로 helm repo를 운영하고 있으며 repo에 kube-prometheus-stack이라는 이름으로 helm chart를 제공하고 있다.
$ helm repo add prometheus-community https://prometheus-community.github.io/helm-chart
"prometheus-community" has been added to your repositories
$ helm repo update
$ helm search repo prometheus-community
NAME CHART VERSION APP VERSION DESCRIPTION
prometheus-community/manager 0.14.0 v0.23.0 The Alertmanager handles s sent by client ...
prometheus-community/kube-prometheus-stack 19.2.2 0.50.0 kube-prometheus-stack collects Kubernetes manif...
prometheus-community/kube-state-metrics 4.0.0 2.2.0 Install kube-state-metrics to generate and expo...
prometheus-community/prometheus 14.11.0 2.26.0 Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter 3.0.0 v0.9.1 A Helm chart for k8s prometheus adapter
prometheus-community/prometheus-blackbox-exporter 5.3.1 0.19.0 Prometheus Blackbox Exporter
prometheus-community/prometheus-cloudwatch-expo... 0.16.0 0.10.0 A Helm chart for prometheus cloudwatch-exporter
prometheus-community/prometheus-consul-exporter 0.4.0 0.4.0 A Helm chart for the Prometheus Consul Exporter
prometheus-community/prometheus-couchdb-exporter 0.2.0 1.0 A Helm chart to export the metrics from couchdb...
prometheus-community/prometheus-druid-exporter 0.11.0 v0.8.0 Druid exporter to monitor druid metrics with Pr...
prometheus-community/prometheus-elasticsearch-e... 4.7.0 1.2.1 Elasticsearch stats exporter for Prometheus
prometheus-community/prometheus-json-exporter 0.1.0 1.0.2 Install prometheus-json-exporter
prometheus-community/prometheus-kafka-exporter 1.5.0 v1.4.1 A Helm chart to export the metrics from Kafka i...
prometheus-community/prometheus-mongodb-exporter 2.8.1 v0.10.0 A Prometheus exporter for MongoDB metrics
prometheus-community/prometheus-mysql-exporter 1.3.0 v0.12.1 A Helm chart for prometheus mysql exporter with...
prometheus-community/prometheus-nats-exporter 2.8.1 0.8.0 A Helm chart for prometheus-nats-exporter
prometheus-community/prometheus-node-exporter 2.2.0 1.2.2 A Helm chart for prometheus node-exporter
prometheus-community/prometheus-operator 9.3.2 0.38.1 DEPRECATED - This chart will be renamed. See ht...
prometheus-community/prometheus-pingdom-exporter 2.4.1 20190610-1 A Helm chart for Prometheus Pingdom Exporter
prometheus-community/prometheus-postgres-exporter 2.3.7 0.10.0 A Helm chart for prometheus postgres-exporter
prometheus-community/prometheus-pushgateway 1.12.0 1.4.1 A Helm chart for prometheus pushgateway
prometheus-community/prometheus-rabbitmq-exporter 1.0.0 v0.29.0 Rabbitmq metrics exporter for prometheus
prometheus-community/prometheus-redis-exporter 4.6.0 1.27.0 Prometheus exporter for Redis metrics
prometheus-community/prometheus-snmp-exporter 0.1.5 0.19.0 Prometheus SNMP Exporter
prometheus-community/prometheus-stackdriver-exp... 1.11.0 0.11.0 Stackdriver exporter for Prometheus
prometheus-community/prometheus-statsd-exporter 0.4.1 0.22.1 A Helm chart for prometheus stats-exporter
prometheus-community/prometheus-to-sd 0.4.0 0.5.2 Scrape metrics stored in prometheus format and ...chart의 코드는 아래 링크를 통해 확인할 수 있다.
TACO에서는 이 chart를 사용하여 prometheus를 설치하는데 다음과 같은 명령으로 설치가 가능하다. 사전에 준비사항으로 v1.16 이상의 kubernetes cluster가 준비되고 local-path provisoner를 통해 local-path라는 storageclass가 설치되어야한다. local-path관련 자세한 사항은 이 링크(https://github.com/rancher/local-path-provisioner)를 참조하자.
# value-override.yaml
manager:
enabled: false
coreDns:
enabled: true
defaultRules:
create: false
fullnameOverride: lma
global:
rbac:
create: true
kubeApiServer:
enabled: true
kubeControllerManager:
enabled: false
kubeDns:
enabled: false
kubeEtcd:
enabled: false
kubeProxy:
enabled: true
kubeScheduler:
enabled: false
kubeStateMetrics:
enabled: false
kubelet:
enabled: false
nodeExporter:
enabled: false
prometheus:
prometheusSpec:
externalLabels:
taco_cluster: dev
podMonitorNamespaceSelector:
matchLabels:
name: lma
podMonitorSelectorNilUsesHelmValues: false
replicas: 1
retention: 30d
ruleNamespaceSelector:
matchLabels:
name: lma
ruleSelectorNilUsesHelmValues: false
serviceMonitorNamespaceSelector:
matchLabels:
name: lma
serviceMonitorSelectorNilUsesHelmValues: false
storageSpec:
volumeClaimTemplate:
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-path
service:
nodePort: 30008
type: NodePort
thanosService:
enabled: false
prometheusOperator:
cleanupCustomResource: true
cleanupCustomResourceBeforeInstall: true
createCustomResource: true
enabled: truehelm install prometheus prometheus-community/kube-prometheus-stack -f value-override.yamlTACO는 대부분의 개발물을 오픈소스로 제공하고 있으며 다음링크를 통해 위에서 이야기한 구조를 실제로 어떻게 설정하고 설치해서 사용했는지를 확인할 수 있다. 이 파일들을 사용하는 방법을 정확하게 알기위해서는 decapod에 대해 이해할 필요가 있으며 이는 다른 블로그(https://devocean.sk.com/internal/board/viewArticle.do?id=163435)를 참조하자.
본 블로그에서는 Prometheus에 대한 설명과 이를 활용하는 TACO에서의 사용예를 중심으로 설명했다. 구체적으로 설치하는 방법등은 이미 블로그로 작성된 부분이 있어 언급하지 않았다. 다음 블로그는 TKS (TACO kubernetes serivce)를 준비하면서 변경한 모니터링 구조의 중심인 Thanos와 이에대한 적용내역을 설명할 예정이다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.