ELK 스택에서 로그를 프로세싱하고 저장소에 실시간으로 적재해주는 프로그램인 Logstash 에 대해서 살펴본다.
자바 프로그램
Logstash 는 자바 프로그램이다. 그래서 Java Runtime 이 필요하다. 그런데, Logstash 에는 Java Runtime 이 내장되어 있어서 별도로 설치하지 않아도 된다.
하지만 이 자바 때문에 프로그램이 무겁다.
Logstash 정의
다음과 같이 정의가 머리속에 담아 두기 좋다.
실시간 파이프라인(Pipeline) 기능을 가진 데이터 수집 엔진을 가진 오픈 소스 소프트웨어다.
파이프라인(Pipeline)
Logstash 는 파이프라인(Pipeline) 형식으로 데이터를 처리 한다.
INPUTS 은 데이터를 입력받는 부분에 대한 설정이다. OUTPUTS 은 어디로 데이터를 보낼 것인지 하는 부분인데, 대부분 데이터 저장소를 지정한다. FILTERS 부분은 입력받은 데이터를 가공처리하는 부분을 말하는데, Logstash 의 핵심부분이라고 할 수 있다.
logstash 플러그인
logstash 는 자체 플러그인을 가지고 있다. 이 플러그인을 활용하면 미리 설정된 FILTERS 에 맞게 로그를 처리하고 OUTPUT 을 해준다.
Bundler attempted toupdate logstash-mixin-ecs_compatibility_support but its version stayed the same
Bundler attempted toupdate logstash-mixin-deprecation_logger_support but its version stayed the same
Installing logstash-output-elasticsearch
Installation successful
logstash.yml
이 파일은 Logstash 실행을 제어하기 위한 것이다. 파이프라인 세팅, 설정 파일 위치 지정, 로깅 옵션등을 지정할 수 있다. 이 파일에 적은 옵션은 커맨드 라인으로 지정해도 된다.
주요한 설정은 다음과 같다.
logstash.yml 주요 설정
YAML
1
2
3
node.name: venus8.systemv.local
path.data: ${LOGSTASH_HOME}/data
path.logs: ${LOGSTASH_HOME}/logs
logstash.yml 파일에 pipeline 관련 설정도 있다. 이것 때문에 헷깔리는 사람들이 많은데, 여기서 pipeline 설정을 하지 않아도 된다. 각각의 pipeline 설정은 pipeline.yml 에서 설정하는데, 여기서 설정하지 않은 값은 logstash.yml 파일에서 읽어 들인다. 쉽게 말해서 Default 값을 지정하는 것이라고 보면 된다.
pipeline.yml
pipeline 에 대한 설정을 하는 것이다. 대략 다음과 같다.
pipeline.yml 주요 설정
YAML
1
2
3
4
5
6
7
-pipeline.id: main
path.config: ${LOGSTASH_HOME}/conf.d/*.conf
pipeline.workers: 1
pipeline.batch.size: 1
queue.type: persisted
config.reload.automatic: true
config.reload.interval: 3s
path.config 에서 디렉토리에 .conf 확장자 파일을 모두 읽어 들이도록 한다.
-f 옵션 없이 실행
보통 -f 옵션을 주고 실행하는 이유는 pipeline 설정파일을 지정하기 위해서다. 하지만 logstash.yml 과 pipeline.yml 파일을 작성했다면 -f 옵션 없이 실행할 수 있다.
로그(log) 는 각종 시스템과 소프트웨어 프로그램의 정보를 담고 있다. 한 사람이 하나의 시스템, 하나의 소프트웨어 프로그램을 다루거나 관리를 한다면 별 문제가 없겠지만 요즘 처럼 분산형 시스템과 소프트웨어를 사용하는 시대에 로그를 하나씩 다 들여다 본다는 건 불가능이다.
거기다 로그를 본다는 것도 여간 쉬운일이 아니다. 매우 지루하고 많은 시간을 허비해야 하는데, 수 많은 로그속에서 내가 필요로하는 정보를 찾기란 매우 어렵다.
그래서 이것을 손쉽게 처리할 수 있도록 도와주는 프로그램 그룹이 만들어졌는데, 다음과 같은 것이다.
Splunk
스플렁크(Splunk) 는 사용 소프트웨어다. 대량으로 로그를 저장하고 분석하도록 해주는 소프트웨어를 판매하는 회사다. 상용제품이다 보니까 이 제품을 익히는게 중요하다. Splunk Search Processing Language, 줄여서 SPL 을 이용해서 로그에서 필요한 정보를 뽑아 낼 수 있다.
ELK(Elasticsearch, Logstash, Kibana)
Elastic 제품군이다. 엘라스틱서치(Elasticsearch) 검색 소프트웨어로 유명한 Elastic 에서 만드는 것인데, 로그스태쉬(Logstash) 는 실시간으로 로그를 전달 받아서 처리하고 이것을 엘라스틱서치에 저장한다. 키바나(Kibana) 는 엘라스틱서치에 저장한 로그들을 특저한 쿼리를 이용해 시각화 해준다.
로그스태쉬(Logstasch) 대신 플로언트디(FluentD) 를 사용하기도 한다. 로그스태쉬로그스태쉬(Logstasch)보다 메모리를 덜 먹으면서도 가용성이 좋다.
로그 처리를 위한 ELK 를 스택(Stack) 이라고 명명하고 ELK Stack, EFK Stack 이라고 부른다.
ELK stack components
TICK(Telegraf, InfluxDB, Chronograf, Kapacitor)
InfluxDB 와 Telegraf 로 유명한 InfluxData 에서 만든 것이다. Kapacitor 는 ELK 에서 로그스태쉬에 해당한다. Chronograf 는 ELK 의 키바나에 해당된다.
개인적으로 Telegraf, InfluxDB, Grafana 를 이용한 시스템 모니터링은 여러번 사용해본 경험이 있다. InfluxDB 는 마치 RDBMS 처럼 SQL 문을 이용해서 데이터를 조회할 수 있다.
Kubernetes API 서버는 http 를 통해서 쿠버네티스에 대한 연산을 제공해 준다. kubectl 명령어로 실행되는 것들은 모두 API 서버를 거쳐서 이루어진다. 하지만 API 서버는 인증서를 기반으로 통신이 이루어지는데, 이 인증서에 기재된 도메인이나 IP가 아니면 통신이 이루어지지 않는다.
19mWarning listen tcp4:30754:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:status-port"(:30754/tcp4),skipping it
19mWarning listen tcp4:32315:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:https"(:32315/tcp4),skipping it
19mWarning listen tcp4:31159:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:tcp"(:31159/tcp4),skipping it
19mWarning listen tcp4:31078:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:http2"(:31078/tcp4),skipping it
19mWarning listen tcp4:31384:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istio-ingressgateway:tls"(:31384/tcp4),skipping it
8m58sWarning listen tcp4:30051:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:http-monitoring"(:30051/tcp4),skipping it
8m58sWarning listen tcp4:31601:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:https-dns"(:31601/tcp4),skipping it
8m58sWarning listen tcp4:30751:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:https-webhook"(:30751/tcp4),skipping it
8m58sWarning listen tcp4:30761:bind:address already inusenode/kworker3.systemv.localcan'topen port"nodePort for istio-system/istiod:grpc-xds"(:30761/tcp4),skipping it
Calico-kube-controllers 의 Pods 를 찾기 위해서 셀렉터 k8s-app: calico-kube-controllers 지정해 준다. 그리고 ServiceMonitor 에서 찾을 수 있도록 Labels 를 설정해 줬다.
Prometheus ServiceMonitor 생성
나는 프로메테우스를 Operator 로 설치했다. Prometheus-Operator 설치를 할 경우에 메트릭 수집은 ServiceMonitor 를 통해서 이루어진다. 이 ServiceMonitor 는 Prometheus 의 설정을 함께 적용하면서 동작한다. Prometheus 의 Scape 을 ServiceMonitor 가 대신하는 것이라고 생각하면 쉽다.