아코디언에서 ELK 구축하기
아코디언을 통해 손쉽게 ELK(Elasticsearch + Logstash + Kibana)를 구성하는 방법에 대해 알아보겠습니다.
ELK구성도

ELK 를 구성하기 위해서는 4가지 서비스가 필요합니다.
– Beats : 데이터를 수집하는 역할을 합니다.
– Logstash : beats 에서 수집한 데이터를 합치는 역할을 합니다.
– Elasticsearch : 수집한 데이터를 저장합니다.
– Kibana : 저장된 데이터를 시각화하여 분석합니다.
배포되는 4가지 서비스는 모두 같은 버전으로 배포해야합니다. 예제는 6.3.2 버전을 사용하였습니다. ELK 배포는 아코디언 사용자 템플릿 기능을 사용해야합니다. 사용자 템플릿 기능에 대한 자세한 내용은 아코디언 메뉴얼을 통해 확인할 수 있습니다. ELK 구성 순서는 DB인 Elasticsearch를 먼저 배포한 뒤 Beats, Logstash를 차례로 배포하고 마지막으로 Kibana를 배포합니다.
Elasticsearch
[메뉴] -> [사용자 템플릿]에서 Elasticsearch를 등록합니다. 배포 이미지 이름과 컨테이너에서 사용하는 포트를 변경합니다.

– Type : Statefulsets
– Docker image : docker.elastic.co/elasticsearch/elasticsearch-oss:6.3.2
– Port : 9200,9300
– initContainer : vm.max_map_count값을 조정하는 컨테이너 추가가 필요합니다.

initContainers:
- image: alpine:3.6
command: ["/sbin/sysctl", "-w", "vm.max_map_count=262144"]
name: elasticsearch-logging-init
securityContext:
privileged: true
데이터 볼륨 생성
[메뉴] -> [볼륨] 에서 Elasticsearch 데이터를 저장할 볼륨을 생성합니다.

앱생성
[메뉴] -> [앱] 에서 Elasticsearch를 선택하여 앱을 생성합니다.

추가옵션
Volumes 입력란에 [볼륨]에서 생성했던 볼륨명과 Elasticsearch data 경로를 마운트합니다.

볼륨마운트경로
/data
로그 확인
앱 상세화면에서 로그를 확인하여 정상적으로 started 되었는지 확인합니다.

Logstash
[메뉴] -> [사용자 템플릿]에서 Logstash를 등록합니다. 배포 이미지 이름과 컨테이너에서 사용하는 포트를 변경합니다.

– Type : Deployments
– Docker image : docker.elastic.co/logstash/logstash:6.3.2
– Port : 5044
사용자 정의 변수
[메뉴] – [사용자 정의변수] 기능을 통해 logstash 설정값을 입력합니다

Hosts와 xpack.monitoring.elasticsearch.url 에는 아코디언에 배포한 Elasticsearch 앱 이름을 입력합니다.
– KEY : logstash.conf
– VALUE
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => " elasticsearch:9200"
index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
document_type => "%{[@metadata][type]}"
}
}
– 사용자 정의 변수 KEY : logstash.yml
– 사용자 정의 변수 VALUE
http.host: "0.0.0.0"
path.config: /usr/share/logstash/pipeline
xpack.monitoring.enabled: false
xpack.monitoring.elasticsearch.url: http:// elasticsearch:9200
앱 생성
[메뉴] -> [앱생성]에서 logstash를 선택하여 생성합니다.

추가옵션
[추가옵션] – [사용자 정의변수]에 사용자 정의변수를 마운트합니다.

– KEY : logstash.yml
– 마운트 경로 : /usr/share/logstash/config/logstash.yml
– KEY : logstash.conf
– 마운트 경로 :/usr/share/logstash/pipeline/logstash.conf
로그 확인
로그 내용 중 아코디언에 배포된 elasticsearch 와 성공적으로 연결되었는지 확인합니다.
[2019-01-14T09:11:27,659][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs
updated {:changes=>{:removed=>[], :added=>[http://elastic:9200/]}}
Filebeat
ClusterRole 생성
ClusterRoleBinding, ClusterRole, ServiceAccount을 생성합니다. <namespace> 배포할 앱의 namespace를 입력합니다.
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: filebeat
subjects:
- kind: ServiceAccount
name: filebeat
namespace: <namespace>
roleRef:
kind: ClusterRole
name: filebeat
apiGroup: rbac.authorization.k8s.io
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: filebeat
labels:
k8s-app: filebeat
rules:
- apiGroups: [""] # "" indicates the core API group
resources:
- namespaces
- pods
verbs:
- get
- watch
- list
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: filebeat
namespace: <namespace>
labels:
k8s-app: filebeat
사용자 템플릿
메뉴 -> 사용자 템플릿에서 Filebeat를 등록합니다.

– Type : Deployments
– Docker image : docker.elastic.co/beats/filebeats:6.3.2
runAsUser

uid(0) root 으로 실행될 수 있도록 템플릿에 추가합니다.
spec:
containers:
… (생략)
securityContext:
runAsUser: 0
ServiceAccount
위에서 생성했던 ServiceAccout를 지정합니다.
spec:
containers:
… (생략)
serviceAccount: filebeat
serviceAccountName: filebeat
사용자 정의변수
Filebeats 설정을 하기 위해 메뉴 -> 사용자 정의 변수 를 클릭합니다.

– KEY : kubernetes.yml
– VALUE
- type: docker
containers.ids:
- "*"
processors:
- add_kubernetes_metadata:
in_cluster: true

– KEY : filebeat.yml
– VALUE
filebeat.config:
inputs:
# Mounted `filebeat-inputs` configmap:
path: ${path.config}/inputs.d/*.yml
# Reload inputs configs as they change:
reload.enabled: false
modules:
path: ${path.config}/modules.d/*.yml
# Reload module configs as they change:
reload.enabled: false
output.elasticsearch:
hosts: ['elasticsearch:9200']
username: elastic
password: changeme
데이터 볼륨 설정
메뉴 -> 볼륨 에 filebeats데이터 볼륨을 지정합니다.

수집할 로그 디렉토리를 hostpath 타입으로 설정합니다. 예제에서는 host의 container log를 설정하였습니다.

– 경로 : /var/lib/docker/containers
앱 생성
[메뉴] -> [앱] 에서 Filebeat를 선택하여 생성합니다.
Arguments
Arguments 입력란에 다음과 같이 입력합니다.

args: [
"-c", "/etc/filebeat.yml",
"-e",
]
추가옵션
추가옵션 에서 Volumes과 사용자 정의변수를 입력합니다.

Volumes
– filebeat 설정파일 경로 : /usr/share/filebeat/data
– 모니터링 로그 경로 : /var/lib/docker/containers
사용자 정의변수
– KEY : filebeat.yml
– 마운트경로 : /etc/filebeat.yml
– KEY : 지정하지 않음
– 사용자 정의변수 마운트경로 : /usr/share/filebeat/inputs.d
Kibana
[메뉴] -> [사용자 템플릿]에서 Kibana를 등록합니다.

– Type : Deployments
– Docker image : docker.elastic.co/kibana/kibana-oss:6.3.2
– Port : 5601
사용자 정의 변수
Kibana 설정을 하기 위해 [메뉴] -> [사용자 정의 변수] 를 클릭합니다.

– 사용자 정의 변수 KEY : kibana.yml
– 사용자 정의 변수 VALUE
server.name: kibana
server.host: "0"
elasticsearch.url: http://elasticsearch:9200
elasticsearch.url 에는 아코디언에 배포한 Elasticsearch 앱 이름을 입력합니다.
앱 생성
[메뉴] -> [앱] 에서 kibana를 선택하여 생성합니다.

추가옵션
추가옵션 – Port 에서 외부 서비스를 위해 NodePort를 생성합니다.

사용자 정의 변수를 추가합니다.

– KEY : kibana.yml
– 마운트경로 : /usr/share/kibana/config/kibana.yml
앱 확인
http://Accordon_IP:NodePort 로 접속하여 kibana가 정상적으로 작동하는지 확인합니다.

ELK 연동 확인
Kibana에 접속하게되면 Index pattern을 정의하는 페이지가 나오게 됩니다. 항목에 * 를 입력하면 모든 Index pattern을 찾게 됩니다.

Index pattern을 지정하였으면 Discover 메뉴로 이동합니다. 정상적으로 ELK가 연동되었다면 다음과 같이 그래프와 로그가 보이게 됩니다.

여기까지 아코디언에서 ELK를 구성하는 방법에 대해 알아보았습니다. 예제는 호스트 서버의 도커 컨테이너 로그를 사용하였지만 Filebeat 설정을 변경하여 애플리케이션 로그도 데이터 분석할 수 있습니다.
