로그(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 가 대신하는 것이라고 생각하면 쉽다.