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

Preview:

DESCRIPTION

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

Citation preview

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

@nacyot

0

naycot

Leevi Inc.

http://leevi.co.kr/

목차메트릭스 & 로그 수집

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

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

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

어플리케이션기획

구현(프로그래밍)운영

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

메트릭스 수집로그 수집

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

모니터링 & 로그 수집

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

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

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

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

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

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

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

어플리케이션마다 독자적인 포맷 사용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 …

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

시스템Syslog

어플리케이션FluentdLogStash

로그 저장소

ElasticSearchMongoDBDatadogPaperTrail

메트릭스시간 + 수치 정보

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

메트릭스 수집

시스템DiamondSensuMuninFluentd(?)

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

시계열 데이터베이스

RRDtoolMuninGrowthForecast

GraphiteInfluxDBHosted Graphite

시스템 구성 예제(1)

시스템 구성 예제(2)

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

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

DockerAn open platform for distributed applications for developers

and sysadmins.

경량 가상화

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

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

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

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

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

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

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

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

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

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

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

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

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

The Twelve Factor App - Log (1)

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

The Twelve Factor App - Log (2)

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

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

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

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

docker logs 명령어json으로 저장

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

progrium/logspout

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

progrium/logspout 구조도

progrium/logspout 장단점

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

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

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

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

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

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

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

컨테이너 모니터링

cgroup

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

sys/fs/cgroup 에서 수집 가능

Network & Exit Time …Gathering LXC and Docker containers metrics

sys/fs/cgroup

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

cgroup 데이터 수집기

Diamond collectorCpuAcctCgroupCollectorMemoryCgroupCollector

SensuCgroup Metrics Plugin

docker-metricsd

Diamond 예제

[[MemoryCgroupCollector]]enabled = True

[[CpuAcctCgroupCollector]]enabled = True

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,

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

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

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

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

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

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

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

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

Configuration ManagementDocker Base Image

SyslogDiamonddocker-metricsdDocker

Logspout

DemoMetrics Server

ElasticSearch & KibanaGraphite & Grafana

App Serverdiamond

systemcgroup

syslog-nglogspout

Demo - Metrics-ServerDigital OceanImage

Docker 1.1.1Ubuntu 14.04

Fig 설치

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

ElasticSearch & Grafana Setup

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

ElasticSearch Dashboard - Kibana

Graphite Dashboard - Grafana

Demo - App-ServerDigital OceanImage

Docker 1.1.1Ubuntu 14.04

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

Diamond 설정

Graphite Handler 설정

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

수집 간격 설정

[collectors]interval = 5

Grafana & Diamond

Diamond - cgroup 설정

[collectors][[MemoryCgroupCollector]]enabled = True

[[CpuAcctCgroupCollector]]enabled = True

Grafana & Diamond(Cgroup)

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

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); };

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

syslog-ng & Kibana

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

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

logspout & Kibana

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

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

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

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

구상도

Just DockerDocker Base Image

DockerLogspoutSyslog-ngDiamonddocker-metricsd

비교

Host + Docker DockerDocker Base Image

SyslogDiamonddocker-metricsdDocker

Logspout

Docker Base ImageDocker

LogspoutSyslog-ngDiamonddocker-metricsd

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

컨테이너 교체

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

해결법

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

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

Q/A

Recommended