오픈소스를 이용한 다중 k8s 클러스터 환경의 Node/POD 리소스 사용량과 로그 모니터링

2022. 8. 17. 22:40 개발 이야기/오픈소스

k8s(쿠버네티스) 클러스터를 운영하다보면 Observability(관측 가능성)를 제외하고는 사실상 정상적인 운영이 어렵습니다. 그만큼 쿠버네티스는 배포의 복잡성, 고가용성, 안정성 등 컨테이너 오케스트레이션 측면에서의 강력한 장점이 있지만, 운영의 측면에서는 러닝 커브가 높고 가시적이지 않다는 단점이 있습니다. 이러한 문제를 대변하듯, 쿠버네티스의 모니터링 분야는 빠르게 발전하고 있는 것을 볼 수 있는데요. 오늘은 오픈소스를 이용해 다중 k8s 클러스터 환경에서 Node와 POD를 모니터링할 수 있는 모니터링 시스템을 구성해보겠습니다.

https://github.com/Clymene-project/Clymene

 Clymene-project(https://github.com/Clymene-project/Clymene)

Clymene 프로젝트는 Metric과 Log를 수집하는 agent와 확장 가능한 형태의 백엔드 컴포넌트로 구성된 오픈소스 입니다. 관측 대상이 많아서 많은 트래픽의 데이터를 저장해야하는 경우는 kafka를 이용한 아키텍처 구성이 가능하며, 간단하게 구성하고자 한다면 agent가 데이터베이스에 직접적으로 저장할 수도 있습니다. 또한 데이터베이스는 사용자에게 익숙한 데이터베이스를 사용할 수 있도록 elasticsearch, prometheus, opentsdb 등 다양한 데이터베이스에 저장 가능합니다. 이번 포스트에서는 고부하 환경의 아키텍처로 kafka가 배포되어있다는 가정하에 kafka를 이용한 구성을 해보도록 하겠습니다.

1. Metrics 수집 백엔드 구성

  • clymene-gateway 배포
// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-metrics/3.clymene_gateway.yaml
$ kubectl create -f 3.clymene_gateway.yaml

//      containers:
//        - name: gateway
//          image: bourbonkk/clymene-gateway:latest
//          imagePullPolicy: Always
//          ports:
//            - containerPort: 15694
//          args:
//            - --kafka.producer.brokers=kafka.kafka:9092  // kafka setting
  • clymene-ingester 배포(prometheus와 elasticsearch에 동시 저장)
// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-metrics/4.clymene_ingester.yaml
$ kubectl create -f 4.clymene_ingester.yaml

//          args:
//            - --prometheus.remote.url=http://prometheus-server-http.prometheus:9090/api/v1/write
//            - --kafka.consumer.brokers=kafka.kafka:9092
//            - --es.server-urls=http://elasticsearch.es:9200
//          env:
//            - name: STORAGE_TYPE
//              value: prometheus,elasticsearch   // use prometheus, elasticsearch
  • clymene-agent 배포
// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-metrics/1.clymene_rbac.yaml
$ kubectl create -f 1.clymene_rbac.yaml

// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-metrics/2.clymene_agent.yaml
$ kubectl create -f 2.clymene_agent.yaml

// Example of using service discovery function
//      - job_name: 'kubernetes-pods'
//        kubernetes_sd_configs:
//          - role: pod
//        relabel_configs:
//          - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
//            action: keep
//            regex: true

 

2. Log 수집 백엔드 구성

  • clymene : promtail-gateway 배포
// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-logs/2.clymene-promtail_gateway.yaml
$ kubectl create -f 2.clymene-promtail_gateway.yaml
  • clymene : promtail-ingester 배포(loki와 elasticsearch에 동시 저장)
// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-logs/3.clymene-promtail_ingester.yaml
$ 3.clymene-promtail_ingester.yaml

//          args:
//            - --kafka.consumer.brokers=kafka.kafka:9092
//            - --loki.client.url=http://loki.loki:3100/loki/api/v1/push
//            - --es.server-urls=http://elasticsearch.es:9200
//            - --log-level=info
//          env:
//            - name: STORAGE_TYPE
//              value: loki,elasticsearch
  • clymene : promtail-agent 배포
// https://github.com/Clymene-project/Clymene/blob/master/k8s/clymene-logs/1.clymene-promtail_agent.yaml
$ kubectl create -f 1.clymene-promtail_agent.yaml


// configmap - Example of using service discovery function
//    - job_name: kubernetes-pods
//      pipeline_stages:
//        - cri: {}
//      kubernetes_sd_configs:
//        - role: pod
//      relabel_configs:
//        - source_labels:
//           - __meta_kubernetes_pod_controller_name
//          regex: ([0-9a-z-.]+?)(-[0-9a-f]{8,10})?
// ....

 

이제 Clymene의 백엔드 구성은 완료되었습니다. 만약 관측 대상 k8s 클러스터가 존재한다면 promtail-agent와 clymene-agent의 cluster label을 변경한뒤 배포해주시면 데이터 수집이 가능해집니다.

// configmap - clymene-agent-config, promtail-config
....
            target_label: kubernetes_name
          - action: replace
            target_label: cluster
            replacement: target-cluster  // here
.....

 

다음으로, Grafana 예제를 import하고 k8s의 Node / POD 데이터를 시각화해보겠습니다.

https://github.com/Clymene-project/Clymene/blob/master/grafana/1.clymene-node-monitoring.json
https://github.com/Clymene-project/Clymene/blob/master/grafana/2.clymene-pod-monitoring.json

Node - 시각화

수집되고 있는 node-exporter의 데이터를 통해 node의 리소스 사용량을 확인할 수 있고, cluster를 선택해 원하는 클러스터의 Node 정보만 선택할 수 있습니다.

node의 모든 리소스 정보를 시각화하여 디테일한 리소스 모니터링이 가능합니다.

 

해당 노드에서 실행되고 있는 모든 POD들의 로그를 확인할 수 있습니다. 또한 간단하게 쿼리를 수정해서 원하는 로그만 확인이 가능합니다. 기본적으로는 15분간 해당 노드에서 실행되고 있는 POD들의 로그를 보여줍니다.

 

POD - 시각화

문제가 있는 POD를 찾기 위해 디테일한 확인이 필요할 수 있습니다. 또한 성능적인 문제, 병목현상을 해결하기위해서는 다양한 리소스 사용량을 확인해야합니다.

POD의 다양한 정보를 확인할 수 있고 더해서 POD에 로그를 함께 확인할 수 있습니다. 리소스 소모량과 로그를 함께 확인할 수 있다면 문제의 원인을 보다 빠르게 파악할 수 있습니다.

 

이상으로 Metric과 Log 수집 오픈소스인 Clymene를 이용해서 다중 k8s 클러스터 환경의 모니터링 방안을 알아봤습니다. 오픈소스 Clymene에 많은 관심 부탁드립니다.

https://github.com/Clymene-project/Clymene

 

GitHub - Clymene-project/Clymene: the Clymene is time-series data and Logs collection platform for distributed systems.

the Clymene is time-series data and Logs collection platform for distributed systems. - GitHub - Clymene-project/Clymene: the Clymene is time-series data and Logs collection platform for distribute...

github.com

 

참고 

  • https://grafana.com/grafana/dashboards/13770-1-kubernetes-all-in-one-cluster-monitoring-kr/