Telegraf & Chronograf 을 이용한 influxdb 모니터링 대시보드

2020, May 18    

Telegraf & Chronograf 을 이용한 influxdb 모니터링 대시보드

Kubernetes에서 사용중인 Influxdb 모니터링을 위해 대시보드를 구성해보았습니다. 대시보드 구성을 위한 에이전트와 데이터 시각화 응용프로그램은 Influxdata에서 개발한 오픈소스 Telegraf와 chronograf를 사용하였습니다.

Telegraf

Telegraf는 메트릭을 수집, 처리, 집계 및 작성하는 에이전트입니다. 디자인 목표는 플러그인 시스템으로 최소한의 메모리 사용 공간을 확보하여 커뮤니티의 개발자가 메트릭 수집 지원을 쉽게 추가 할 수 있도록하는 것입니다. Telegraf는 플러그인 중심이며 4 가지 고유 한 플러그인 유형 개념이 있습니다.

입력 플러그인 은 시스템, 서비스 또는 타사 API에서 메트릭을 수집합니다. 프로세서 플러그인 은 메트릭을 변환, 장식 및 / 또는 필터링합니다. 집계 플러그인은 집계 메트릭 (예 : 평균, 최소, 최대, Quantile 등)을 만듭니다. 출력 플러그인 은 다양한 대상에 메트릭을 작성합니다. 새로운 플러그인은 쉽게 기여할 수 있도록 설계되었으며, 풀 요청을 환영하며 가능한 많은 풀 요청을 통합하기 위해 노력하고 있습니다.

https://github.com/influxdata/telegraf

구성방법

Influxdb 연결정보가 있는 Secret, Telegraf 설정을 위한 Configmap 그리고 Deployments, service yaml을 작성하여 실행시킵니다. telegraf 설정 파일은 /etc/telegraf/telegraf.conf 에 위치합니다. telegraf가 실행된다고 해서 필요한 수집요소가 쌓이는것은 아닙니다. inputs.system, inputs,cpu와 같이 필요한 수집요소를 명시해야합니다.

apiVersion: v1
kind: Secret
metadata:
  name: telegraf-secrets
  namespace: kube-system
type: Opaque
stringData:
  INFLUXDB_DB: telegraf
  INFLUXDB_URL: http://10.96.1.11:8086
  INFLUXDB_USER: root
  INFLUXDB_USER_PASSWORD: root
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: telegraf-config
  namespace: kube-system
data:
  telegraf.conf: |+
    [[outputs.influxdb]]
      urls = ["$INFLUXDB_URL"]
      database = "$INFLUXDB_DB"
      username = "$INFLUXDB_USER"
      password = "$INFLUXDB_USER_PASSWORD"
    [[inputs.influxdb]]
      urls = [
        "http://10.96.1.11:8086/debug/vars"
      ]
      timeout = "5s"
    [[inputs.statsd]]
      max_tcp_connections = 250
      tcp_keep_alive = false
      service_address = ":8125"
      delete_gauges = true
      delete_counters = true
      delete_sets = true
      delete_timings = true
      metric_separator = "."
      allowed_pending_messages = 10000
      percentile_limit = 1000
      parse_data_dog_tags = true 
      read_buffer_size = 65535
    [agent]
      hostname = "monitoring-influxdb"
      flush_interval = "15s"
      interval = "15s"
    [[inputs.system]]
    [[inputs.cpu]]
      name_suffix = "_total"
      percpu = false
      totalcpu = true
    [[inputs.mem]]
    [[inputs.net]]
    [[inputs.disk]]
      tagexclude = ["fstype"]
---
apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kube-system
  name: telegraf
spec:
  selector:
    matchLabels:
      app: telegraf
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: telegraf
    spec:
      containers:
        - image: telegraf:latest
          name: telegraf
          envFrom:
            - secretRef:
                name: telegraf-secrets
          volumeMounts:
            - name: telegraf-config-volume
              mountPath: /etc/telegraf/telegraf.conf
              subPath: telegraf.conf
              readOnly: true
            - mountPath: /etc/localtime
              name: timezone
      volumes:
        - name: telegraf-config-volume
          configMap:
            name: telegraf-config
        - hostPath:
            path: /etc/localtime
            type: ''
          name: timezone
---
apiVersion: v1
kind: Service
metadata:
  name: telegraf
  namespace: kube-system
spec:
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32285
    port: 8125
    protocol: UDP
    targetPort: 8125
  selector:
    app: telegraf
  sessionAffinity: None
  type: NodePort

Chronograf

Chronograf는 Go 및 React.js로 작성된 오픈 소스 웹 응용 프로그램으로 모니터링 데이터를 시각화하고 경고 및 자동화 규칙을 쉽게 만들 수있는 도구를 제공합니다.

Chronograf는 다양한 대시보드 템플릿을 제공하고 있어 초기구성시 시간 절약에 도움이 됩니다. Apache, Docker, InfluxDB, Kubernetes,Memcached, MongoDB등등 지원합니다.

https://github.com/influxdata/chronograf

구성방법

Deployment, service로 구성하며 외부 접속을 위해 NodePort로 설정하였습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: kube-system
  name: chronograf
spec:
  selector:
    matchLabels:
      app: chronograf
  minReadySeconds: 5
  template:
    metadata:
      labels:
        app: chronograf
    spec:
      containers:
        - image: chronograf:latest
          name: chronograf
---
apiVersion: v1
kind: Service
metadata:
  name: chronograf
  namespace: kube-system
spec:
  externalTrafficPolicy: Cluster
  ports:
  - nodePort: 32286
    port: 8888
    protocol: TCP
    targetPort: 8888
  selector:
    app: chronograf
  sessionAffinity: None
  type: NodePort