2023. 2. 5. 10:53 ㆍ개발 이야기/오픈소스
시간이 지남에 따라 Micro Service Architecture의 많은 이점들이 더욱 부각되고 이제는 소규모 기업에서도 컨테이너 기반의 MSA 아키텍처를 이용해 서비스를 운영하고 있습니다. 이에 따라 많은 컨테이너들을 관리해주는 컨테이너 오케스트레이션 kubernetes(k8s)의 인기 또한 나날이 뜨거워지고 있습니다. 하지만 여러 서버를 클러스터링해서 사용하는 kubernetes를 정말 기업이 가지고 있는 자산과 ROI에 맞게 fit하게 사용하고 있는지는 확인하기 어려운 것이 사실입니다. 또한, 서비스의 가용성에 문제가 있지는 않는지? 문제가 있다면 어디에 문제가 있는지? 파악하는 것은 devOps의 역량에 상당히 의존되는 경향이 있습니다. 세계적으로 이런 이슈가 계속해서 이야기되고 있고 이에따라 Cloud Native Computing Foundation(CNCF)에는 관측가능성(Observability)을 주제로 다양한 프로젝트가 진행되고 있습니다.
시계열 데이터와 로그 수집 플랫폼 Clymene-project는 클라우드 환경과 클라우드 환경이 아닌 Lagacy 환경 모두의 관측 가능성을 제공하는 오픈소스입니다. 또한 다양한 컴포넌트를 이용해서 각각의 환경에 걸맞는 아키텍처로 구성하여 사용할 수 있습니다.
Clymene-project의 이번 v2.2.1 릴리즈에서는 새로운 저장소 Druid를 지원하고 있습니다. Druid는 유연한 스키마를 가졌으며 시간 최적화 파티셔닝을 통해 시간 기반의 쿼리는 기존의 데이터베이스보다 훨씬 빠른 성능을 보여주는 오픈소스 시계열 데이터베이스입니다. 또한 SQL 구문을 지원하기 때문에 새로운 쿼리를 학습해야하는 수고를 덜어주고 있습니다. 이번 Post에서는 Druid와 Clymene-project의 컴포넌트를 통해 시계열 데이터 파이프라인을 구성하고 오픈소스 시각화 툴인 Grafana를 이용해서 k8s 모니터링 시스템을 구축하는 방법에 대해 알아보도록 하겠습니다.
Clymene-project의 컴포넌트들은 모두가 저장소에 데이터를 저장할 수도 있고, http/gRPC 형태로 포워딩만 할수도 있는데요. 아래의 이미지와 같이 clymene-agent가 데이터를 수집하여 kafka로 적재하여 druid로 저장할 수도 있지만,
clymene-gateway 컴포넌트를 이용하여 외부 노출은 최소화하고 clymene-agent로 부터 수집한 시계열 데이터를 gRPC 포맷으로 전달하고 gateway를 통해 kafka에 데이터를 적재하는 아키텍처로 구성해보겠습니다.
- kafka와 druid, grafana를 실행합니다
## example
$ git clone https://github.com/Clymene-project/Clymene.git
$ cd Clymene
$ docker-compose -f ./docker-compose/docker-compose-clymene_using_kafka_es.yml up -d
$ docker-compose -f ./docker-compose/docker-compose-grafana.yml up -d
# download druid https://www.apache.org/dyn/closer.cgi?path=/druid/25.0.0/apache-druid-25.0.0-bin.tar.gz
$ cd apache-druid-25.0.0/
$ ./bin/start-nano-quickstart
2. 데이터를 저장할 서버 혹은 k8s 클러스터에 clymene-gateway를 배포합니다
(본 포스팅에서는 k8s 클러스터로 예시를 듭니다)
$ pwd
/GIT_CLONE_PATH/Clymene
$ kubectl create -f ./k8s/clymene-metrics/druid/3.clymene_gateway.yaml
clymene-agent로 수집한 시계열 데이터를 druid에 옳바르게 적재하기 위해서는 평탄화(flatten) 작업이 필요합니다(참고: druid FlattenSpec) clymene는 평탄화 작업을 해주는 옵션을 통해 kafka에 적재하기 전에 포맷팅을 진행합니다. 평탄화 옵션은 아래와 같습니다.
- name: gateway
image: bourbonkk/clymene-gateway:latest
imagePullPolicy: Always
ports:
- containerPort: 15694
args:
- --kafka.producer.brokers=kafka.kafka:9092
- --kafka.producer.encoding=json
- --kafka.producer.flatten-for-druid
- --log-level=info
env:
- name: STORAGE_TYPE
value: kafka
json encoding 설정( — kafka.producer.encoding=json)과 함께 평탄화 설정( — — kafka.producer.flatten-for-druid)을 gateway의 args로 넣어줍니다. 만약 clymene-agent에서 kafka로 바로 적재할 때도 동일하게 옵션을 넣어주면 정상적으로 동작합니다.
3. 시계열 데이터를 수집할 관제 대상 k8s 클러스터에 ClusterRole과 clymene-agent를 배포합니다.
$ pwd
/GIT_CLONE_PATH/Clymene
$ kubectl create -f ./k8s/clymene-metrics/1.clymene_rbac.yaml
$ kubectl create -f ./k8s/clymene-metrics/druid/2.clymene_agent.yaml
4. druid 설정을 통해 kafka streaming을 설정합니다.
kafka boker 주소를 넣어주고, topic명은 별도로 옵션을 통해 수정하지 않았기 때문에 기본값이 clymene를 넣어줍니다.
평탄화 작업이 되어있기 때문에, 별도의 설정없이 옳바르게 파싱된 것을 확인할 수 있습니다.
Next 버튼을 눌러 Configure schema 차례가 되면, 쿼리에 사용할 dimension을 추가로 넣어줍니다. k8s 환경의 경우 pod, namespace, container와 같은 dimension을 추가로 넣어주고 사용할 metric에 따라 fstype, mountpoint 등의 dimension을 추가합니다.
본 포스팅에서는 아래와 같이 dimension을 추가하였습니다.
"dimensionsSpec": {
"dimensions": [
"__name__",
"cluster", "instance", "job",
"quantile",
{
"type": "double",
"name": "value"
},"version","device","block_group_type",
"mode","uuid","label","name","cpu",
"mountpoint","fstype","operstate",
"namespace","pod","metrics_path","nodename",
"resource","verb","unit","reason","container"]
publish 버튼을 누르게되면 ingestion 메뉴에서 정상적으로 동작하는지 확인할 수 있습니다.
5. druid에서 제공하는 SQL을 통해 Node의 메모리 사용량 시계열 데이터를 조회하여 정상적으로 데이터가 적재되는지 확인합니다.
쿼리 예시) https://github.com/Clymene-project/Clymene/blob/develop/docker-compose/apache-druid/example.sql
6. grafana와 연동을 위해, grafana의 druid plugin을 설치하고 설정해줍니다. Basic Auth을 설정한 경우에도 With basic authentication 토글을 클릭해 설정할 수 있습니다.
7. grafana 대시보드를 선택한 후 query 타입을 SQL로 선택하고 5.에서 테스트한 쿼리를 입력해줍니다.
정상적으로 Druid에서 Memory Utilization 차트가 표현되는 것을 확인할 수 잇습니다.
이어서, etcd-minikube pod의 CPU time을 조회해보겠습니다.
위의 node memory utilization, container cputime 차트 작성 방법을 참고하여 k8s 모니터링 시스템을 구축해보세요. scalable하고 flexible한 clymene의 백엔드를 이용하고 빠른 쿼리 성능을 자랑하는 druid를 이용하여 대규모 모니터링 시스템을 구축할 수 있습니다.
이상으로 시계열 데이터와 로그 수집 오픈소스인 Clymene와 druid를 이용한 k8s 클러스터 모니터링 시스템 구축 방안에 대해 알아봤습니다.
오픈소스 Clymene에 많은 관심 부탁드립니다.
Reference
- https://github.com/Clymene-project/Clymene
- https://medium.com/@clymeneallen/best-practice-k8s-node-pod-resource-usage-and-log-monitoring-system-for-multi-k8s-cluster-3f2e5c2c401a
- https://medium.com/@clymeneallen/best-practices-monitoring-system-for-multi-k8s-cluster-environments-using-open-source-d85544052f37
- https://soniacomp.medium.com/%EB%93%9C%EB%A3%A8%EC%9D%B4%EB%93%9C-druid-f8eb2d737c66
- https://druid.apache.org/
'개발 이야기 > 오픈소스' 카테고리의 다른 글
GraphQL: REST를 넘어서는 데이터 쿼리 언어 (3) | 2024.12.05 |
---|---|
오픈소스를 이용한 다중 k8s 클러스터 환경의 Node/POD 리소스 사용량과 로그 모니터링 (1) | 2022.08.17 |
# 오픈소스를 이용한 다중 k8s 클러스터 환경의 모니터링 시스템 구축 (0) | 2022.08.03 |
# 오픈소스 OpenTracing - Zipkin (0) | 2022.03.20 |
#[Clymene] Efficient time series data collection and management plan in a distributed environment (0) | 2022.01.12 |