skip to Main Content

아코디언에서 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 설정을 변경하여 애플리케이션 로그도 데이터 분석할 수 있습니다.

Back To Top