도커(docker) 메트릭스 & 로그 수집

70
도커(Docker) 메트릭스 & 로그 수집 @nacyot 0

Upload: daekwon-kim

Post on 29-Jun-2015

3.176 views

Category:

Technology


5 download

DESCRIPTION

도커 코리아 두번째 모임(2014년 8월 2일) 도커(Docker) 메트릭스 & 로그 수집 @nacyot

TRANSCRIPT

Page 1: 도커(Docker) 메트릭스 & 로그 수집

도커(Docker) 메트릭스 & 로그 수집

@nacyot

0

Page 2: 도커(Docker) 메트릭스 & 로그 수집

naycot

Leevi Inc.

http://leevi.co.kr/

Page 3: 도커(Docker) 메트릭스 & 로그 수집

목차메트릭스 & 로그 수집

로그메트릭스수집 시스템 구성

도커 메트릭스 & 로그 수집도커 호스트 시스템 로그도커 호스트 시스템 메트릭스컨테이너 어플리케이션 로그컨테이너 어플리케이션 메트릭스컨테이너 모니터링최종 구상도

메트릭스 & 로그 수집의 미래Just Docker

Page 4: 도커(Docker) 메트릭스 & 로그 수집

어플리케이션기획

구현(프로그래밍)운영

Page 5: 도커(Docker) 메트릭스 & 로그 수집

운영서비스 환경 구축서버에서 어플리케이션 가동서버 운영

메트릭스 수집로그 수집

피드백장애 대응어플리케이션 개선스케일 아웃 & 인

Page 6: 도커(Docker) 메트릭스 & 로그 수집

모니터링 & 로그 수집

메트릭스 로그수치 정보리소스 모니터링

Munin, Diamond, Sensu, …CPU, Load Avarage,Memory, …쿼리수, 접속자수, 부하, …

어플리케이션 모니터링대개 직접 구현접속자수, 에러수, …임의 수치

행으로 구분되는 데이터셋비정형 데이터시스템 로그

사용자 정보, 로그인 정보각종 시스템 서비스 로그

어플리케이션 로그대개 직접 구현

Page 7: 도커(Docker) 메트릭스 & 로그 수집

로그행으로 구분되는 데이터셋비정형 데이터

어플리케이션마다 독자적인 포맷 사용CSV, XML, JSON, …완전한 독자적 형식

어플리케이션마다 독자적인 출력 사용파일표준 출력

아파치 로그 예제195.140.144.83 - - [16/Aug/2011:00:49:33 +0900] "GET …195.140.144.83 - - [16/Aug/2011:00:49:37 +0900] "GET …121.3.24.52 - - [17/Aug/2011:03:23:12 +0900] "GET …

Page 8: 도커(Docker) 메트릭스 & 로그 수집

로그 수집기(어플리케이션, 시스템)

시스템Syslog

어플리케이션FluentdLogStash

Page 9: 도커(Docker) 메트릭스 & 로그 수집

로그 저장소

ElasticSearchMongoDBDatadogPaperTrail

Page 10: 도커(Docker) 메트릭스 & 로그 수집

메트릭스시간 + 수치 정보

[Timestamp, Namespace, ][1406886733, us-west1.node1.cpu.usage, 83][1406886734, us-west1.node1.cpu.usage, 50][1406886735, us-west1.node1.cpu.usage, 3]

Page 11: 도커(Docker) 메트릭스 & 로그 수집

메트릭스 수집

시스템DiamondSensuMuninFluentd(?)

어플리케이션어플리케이션에서 자체 구현

Page 12: 도커(Docker) 메트릭스 & 로그 수집

시계열 데이터베이스

RRDtoolMuninGrowthForecast

GraphiteInfluxDBHosted Graphite

Page 13: 도커(Docker) 메트릭스 & 로그 수집

시스템 구성 예제(1)

Page 14: 도커(Docker) 메트릭스 & 로그 수집

시스템 구성 예제(2)

Page 15: 도커(Docker) 메트릭스 & 로그 수집

결론2 (시스템, 어플리케이션) by 2 (로그, 메트릭스)

1. 시스템 로그2. 시스템 메트릭스3. 어플리케이션 로그4. 어플리케이션 메트릭스

Page 16: 도커(Docker) 메트릭스 & 로그 수집

DockerAn open platform for distributed applications for developers

and sysadmins.

Page 17: 도커(Docker) 메트릭스 & 로그 수집

경량 가상화

Page 18: 도커(Docker) 메트릭스 & 로그 수집

로그 & 모니터링2 (시스템, 어플리케이션) by 2 (로그, 메트릭스)

1. 시스템 로그2. 시스템 메트릭스3. 어플리케이션 로그4. 어플리케이션 메트릭스

Page 19: 도커(Docker) 메트릭스 & 로그 수집

도커 로그 & 모니터링 구조도 (1)

Page 20: 도커(Docker) 메트릭스 & 로그 수집

도커 로그 & 모니터링 구조도 (2)

Page 21: 도커(Docker) 메트릭스 & 로그 수집

도커 로그 & 모니터링1. 도커 호스트 시스템 로그2. 도커 호스트 시스템 메트릭스3. 컨테이너 어플리케이션 로그4. 컨테이너 어플리케이션 메트릭스5. 컨테이너 메트릭스

Page 22: 도커(Docker) 메트릭스 & 로그 수집

도커 호스트 시스템 로그기존 방식과 다르지 않음뒤에서 다시

Page 23: 도커(Docker) 메트릭스 & 로그 수집

도커 호스트 시스템 메트릭스기존 방식과 다르지 않음뒤에서 다시

Page 24: 도커(Docker) 메트릭스 & 로그 수집

컨테이너 어플리케이션 로그생각해볼 수 있는 방법

컨테이너 안에서 수집어플리케이션 컨테이너에서 수집기 운용

컨테이너 외부에서 수집Docker 로그 파일 직접 사용

Page 25: 도커(Docker) 메트릭스 & 로그 수집

서비스(컨테이너)적인 사고법

로그는 서비스의 일부분이 아님컨테이너에는 데이터가 저장되어서는 안 됨The Twelve Factor App

http://the-twelve-factor-app.herokuapp.com/

Page 26: 도커(Docker) 메트릭스 & 로그 수집

The Twelve Factor App - Log (1)

로그는 모든 실행중인 프로세스와 백엔드 서비스의 누적되며시간순으로 수집되고 정렬되는 이벤트 스트림이다. 일반적으로 어플리케이션이 직접 생성하는 로그는 한 줄에 하나의 이벤트를 텍스트 포맷으로 기록한다(예외를 추적하는 로그는여러줄로 쓰여지기도 한다). 로그는 고정된 시작과 끝이 없으면 어플리케이션이 실행되는 한 계속된다.Twelve Factor App은 어플리케이션의 출력 스트림의 목적지나 어디에 저장되는 지 일체 간섭하지 않는다. 어플리케이션은 로그를 작성하거나 로그 파일을 관리하려고 해서는 안된다. 로그 파일을 관리하는 대신 각각의 실행중인 프로세스는자신의 이벤트 스트림을 버퍼없이 stdout에 출력한다.

Page 27: 도커(Docker) 메트릭스 & 로그 수집

The Twelve Factor App - Log (2)

로그는 시간순으로 수집되고 정렬되는 이벤트 스트림이다.-> 표준 출력에 출력!

출력 스트림의 목적지나 어디에 저장되는 지 일체 간섭하지않는다.

-> 어플리케이션에는 로그에 대한 설정/로직이 없어야함!

Page 28: 도커(Docker) 메트릭스 & 로그 수집

도커 로그(로그 파일을 통한 수집)

docker logs 명령어json으로 저장

docker inspect로 위치 파악/var/lib/docker/containers 디렉터리의 {containerid}-json.log접근시 root 권한 필요

Page 29: 도커(Docker) 메트릭스 & 로그 수집

progrium/logspout

Docker Log Router컨테이너로 실행syslog 지원HTTP API 지원

Page 30: 도커(Docker) 메트릭스 & 로그 수집

progrium/logspout 구조도

Page 31: 도커(Docker) 메트릭스 & 로그 수집

progrium/logspout 장단점

장점logspout 컨테이너 하나면 됨매우 일관적인 로그 수집 시스템(표준 출력)

12 Factor App에서 환경변수로 설정을 관리하는 것과 비슷

단점컨테이너에 문제가 생기면 로그 수집 정지(?!)약간의 딜레이stdout과 stderr만 수집 가능

어플리케이션 설계시 고려가 필요

Page 32: 도커(Docker) 메트릭스 & 로그 수집

컨테이너 어플리케이션 메트릭스기존과 크게 다르지 않음메트릭스는 대개 실시간 데이터

어플리케이션에서 라이브러리로 직접 보냄

필요한 경우 파일이나 다른 수집기 사용

Page 33: 도커(Docker) 메트릭스 & 로그 수집

컨테이너 모니터링

Page 34: 도커(Docker) 메트릭스 & 로그 수집

cgroup

가상화된 컨테이너별 데이터 수집Resouce 메트릭스

sys/fs/cgroup 에서 수집 가능

Network & Exit Time …Gathering LXC and Docker containers metrics

Page 35: 도커(Docker) 메트릭스 & 로그 수집

sys/fs/cgroup

/sys/fs/cgroup/├── cpu│ ├── docker│ │ ├── 0660f4e1d4054d4ebb6a3212a35b8ba1593dee7e26a6cc96999f796465bce9f7│ │ ├── 09ecfbb7a3cffbd0860a7ae163bfa6bbf5ad73c730932df621275311ef16d04d│ │ ├── 2ab6917f2711586438b8ade5b55b55a15e94ae6209831f8fc4dd47e4b288cafe│ │ ├── 42e782ffcceafbdb6e939abbf6a4f71b9089ccd06dae3349b3429ad651bf5814│ │ ├── 61a8ffc27ad4f2d4c81b4b70d1f575b5593df8433c7edf47231efb47fd3607a7│ │ ├── afb4bfe3db0ddf38db9ac4b2b08150885ddf090696722e066a079235b4ce964d│ │ └── b6b689622627c477b298a1da6d9020ce517ef5ca9f45ca392e51e297c962d469│ └── user│ └── 1000.user│ └── c1.session...

Page 36: 도커(Docker) 메트릭스 & 로그 수집

cgroup 데이터 수집기

Diamond collectorCpuAcctCgroupCollectorMemoryCgroupCollector

SensuCgroup Metrics Plugin

docker-metricsd

Page 37: 도커(Docker) 메트릭스 & 로그 수집

Diamond 예제

[[MemoryCgroupCollector]]enabled = True

[[CpuAcctCgroupCollector]]enabled = True

Page 38: 도커(Docker) 메트릭스 & 로그 수집

docker-metricsd + fluentd

$ curl http://host.example.com:12375/containers/f9093f3df8d8/json | jq.{ "ID":"f9093f3df8d84db914f544139d828e3c7ba7f5a353f83220c0580536b61ec5c3", ... "Metrics": { "memory": { "failcnt": 0, "stats": { "unevictable": 0, "total_unevictable": 0, "total_swap": 0, "total_rss": 380928, "total_pgpgout": 681084,

Page 39: 도커(Docker) 메트릭스 & 로그 수집

도커 메트릭스 & 로그 수집 최종 구조도

Page 40: 도커(Docker) 메트릭스 & 로그 수집

도커 메트릭스 & 로그 수집 최종 구조도(2)

Page 41: 도커(Docker) 메트릭스 & 로그 수집

도커 로그 & 모니터링 결론1. 도커 호스트 시스템 로그

기존과 같음(ex - host에서 syslog-ng 사용)

2. 도커 호스트 시스템 메트릭스기존과 같음(ex - host에서 diamond 사용)

3. 컨테이너 어플리케이션 로그표준 출력으로 로그 기록json 파일 / logspout으로 수집

4. 컨테이너 어플리케이션 메트릭스기존과 비슷함(ex - 어플리케이션에서 직접 데이터 저장소로)

5. 컨테이너 메트릭스Diamond or docker-metricsd(Cgroup 메트릭스 데이터 수집)

Page 42: 도커(Docker) 메트릭스 & 로그 수집

Configuration ManagementDocker Base Image

SyslogDiamonddocker-metricsdDocker

Logspout

Page 43: 도커(Docker) 메트릭스 & 로그 수집

DemoMetrics Server

ElasticSearch & KibanaGraphite & Grafana

App Serverdiamond

systemcgroup

syslog-nglogspout

Page 44: 도커(Docker) 메트릭스 & 로그 수집

Demo - Metrics-ServerDigital OceanImage

Docker 1.1.1Ubuntu 14.04

Page 45: 도커(Docker) 메트릭스 & 로그 수집

Fig 설치

$ curl -L https://github.com/orchardup/fig/releases/download/0.5.2/linux > /usr/local/bin/fig$ chmod +x /usr/local/bin/fig

Page 46: 도커(Docker) 메트릭스 & 로그 수집

ElasticSearch & Grafana Setup

$ git clone https://gist.github.com/f0dc7d9e05238ffd0f2f.git ~/monitoring$ cd monitoring$ fig up

Page 47: 도커(Docker) 메트릭스 & 로그 수집

ElasticSearch Dashboard - Kibana

Page 48: 도커(Docker) 메트릭스 & 로그 수집

Graphite Dashboard - Grafana

Page 49: 도커(Docker) 메트릭스 & 로그 수집

Demo - App-ServerDigital OceanImage

Docker 1.1.1Ubuntu 14.04

Page 50: 도커(Docker) 메트릭스 & 로그 수집

Diamond 설치

$ apt-get update$ apt-get install make pbuilder python-mock python-configobj python-support cdbs$ git clone https://github.com/BrightcoveOS/Diamond.git$ cd Diamond/$ make builddeb$ dpkg -i build/diamond_3.4.573_all.deb$ git clone https://gist.github.com/d0f9c491f8aa8ff42f16 /etc/diamond/gist$ cp /etc/diamond/gist/diamond.conf /etc/diamond/diamond.conf$ service diamond start

Page 51: 도커(Docker) 메트릭스 & 로그 수집

Diamond 설정

Graphite Handler 설정

[[GraphiteHandler]]host = 0.0.0.0port = 2003timeout = 15batch = 1

수집 간격 설정

[collectors]interval = 5

Page 52: 도커(Docker) 메트릭스 & 로그 수집

Grafana & Diamond

Page 53: 도커(Docker) 메트릭스 & 로그 수집

Diamond - cgroup 설정

[collectors][[MemoryCgroupCollector]]enabled = True

[[CpuAcctCgroupCollector]]enabled = True

Page 54: 도커(Docker) 메트릭스 & 로그 수집

Grafana & Diamond(Cgroup)

Page 55: 도커(Docker) 메트릭스 & 로그 수집

syslog-ng

$ apt-get install -y syslog-ng-core syslog-ng$ git clone https://gist.github.com/87d0d902663390b11ff6 /etc/syslog-ng/gist$ cp /etc/syslog-ng/gist/syslog-ng.conf /etc/syslog-ng/syslog-ng.conf

Page 56: 도커(Docker) 메트릭스 & 로그 수집

syslog-ng.conf

@version: 3.5@include "scl.conf"options { time_reap(30); mark_freq(10); keep_hostname(yes);};

source src { unix-stream("/dev/log"); internal(); system(); };

destination d_network { udp( "0.0.0.0" port(5140) ); };

log { source(src); destination(d_network); };

Page 57: 도커(Docker) 메트릭스 & 로그 수집

agent-td:syslog_to_elasticsearch

$ docker run -d -p 5140:5140/udp \ -e SYSLOG_TAG=syslog.system -e SYSLOG_FORMAT= -e SYSLOG_TIME_FORMAT= \ -e ES_HOST=<ES_HOST> -e ES_TAG=syslog.** nacyot/syslog_to_elasticsearch

Page 58: 도커(Docker) 메트릭스 & 로그 수집

syslog-ng & Kibana

Page 59: 도커(Docker) 메트릭스 & 로그 수집

logspout

테스트 컨테이너 실행

$ docker run -d busybox /bin/sh -c "while true; do echo Container 1; sleep 1; done"$ docker run -d busybox /bin/sh -c "while true; do echo Container 2; sleep 5; done"

logspout 실행

$ docker run -d --name log -p 9500:8000 -v=/var/run/docker.sock:/tmp/docker.sock progrium/logspout$ curl $(docker port log 9500)/logs

Syslog로 보내기

$ docker run -v=/var/run/docker.sock:/tmp/docker.sock progrium/logspout \ syslog://0.0.0.0:5141

Page 60: 도커(Docker) 메트릭스 & 로그 수집

agent-td:syslogtoelasticsearch

$ docker run -d -p 5141:5140/udp \ -e SYSLOG_TAG=docker.log -e ES_TYPE=docker \ -e ES_HOST=<ES_HOST> -e ES_TAG=docker.** nacyot/syslog_to_elasticsearch

Page 61: 도커(Docker) 메트릭스 & 로그 수집

logspout & Kibana

Page 62: 도커(Docker) 메트릭스 & 로그 수집

메트릭스 & 로그 수집의 미래도커다운 해결책

로그 수집기의 컨테이너화메트릭스 수집기의 컨테이너화

Page 63: 도커(Docker) 메트릭스 & 로그 수집

앞서 미뤄둔 이야기호스트에서 돌려야하는 수집기

도커 호스트 시스템 로그도커 호스트 시스템 메트릭스(컨테이너 메트릭스)

Page 64: 도커(Docker) 메트릭스 & 로그 수집

구상도

Page 65: 도커(Docker) 메트릭스 & 로그 수집

Just DockerDocker Base Image

DockerLogspoutSyslog-ngDiamonddocker-metricsd

Page 66: 도커(Docker) 메트릭스 & 로그 수집

비교

Host + Docker DockerDocker Base Image

SyslogDiamonddocker-metricsdDocker

Logspout

Docker Base ImageDocker

LogspoutSyslog-ngDiamonddocker-metricsd

Page 67: 도커(Docker) 메트릭스 & 로그 수집

장점Stateless한 수집 시스템컨테이너로 로그 수집 시스템 추상화컨테이너로 수집기 논리적 분리사용하고 싶은 수집기로 쉽게 변경 가능

컨테이너 교체

Page 68: 도커(Docker) 메트릭스 & 로그 수집

단점 / 문제점컨테이너에 문제가 생겼을 때 대응필요한 건 컨테이너의 정보가 아닌 호스트의 정보호스트의 정보를 어떻게 가져올 수 있을까?호스트의 정보를 가져올 수 있을까?

Page 69: 도커(Docker) 메트릭스 & 로그 수집

해결법

$ docker run -d -v /proc:/host_proc:ro -link nuxeoServer:nuxeo -name collector nuxeo/diamond

-v /proc:/hostproc:ro로그 수집 모듈의 로직을 일일히 다 바꿔줘야함아직은 비현실적인 해결책

Page 70: 도커(Docker) 메트릭스 & 로그 수집

Q/A