Monitoring

[ELK Stack] 1. ELK 구축 및 실행

Joon0464 2021. 7. 30. 23:25

1. 테스트용 EC2 두 대 생성

ELK-WEB은 t4g.micro를 사용하였으며 ELK-Master는 t4g.large를 사용

 

ELK-WEB 에는 Filebeat와 Metricbeat를 설치하여 Apache log 및 시스템 metric data를 수집하도록 구성

ELK-Master에는 ELK(Elasticsearch, Logstash, Kibana)를 구성하여 web 서버의 data를 집계 및 시각화

 

2. java 설치

Elasticsearch 와 Logstash를 실행하기 위해서 반드시 자바 1.8 이상의 버전이 필요하다.

$ sudo yum -y install java-1.8.0-openjdk-devel.aarch64

$ java -version
openjdk version "1.8.0_282"
OpenJDK Runtime Environment (build 1.8.0_282-b08)
OpenJDK 64-Bit Server VM (build 25.282-b08, mixed mode)

$ readlink -f /usr/bin/java
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.amzn2.0.1.aarch64/jre/bin/java

 

3. java 환경변수 설정

$ sudo vi /etc/profile
# setting java
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.amzn2.0.1.aarch64
PATH=$PATH:$JAVA_HOME/bin
CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export JAVA_HOME PATH CLASSPATH

$ source /etc/profile

$ echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.282.b08-1.amzn2.0.1.aarch64/

JAVA_HOME 환경변수를 설정한다.

source /etc/profile을 입력하여 새로 추가한 환경변수를 적용시킨다.

echo $JAVA_HOME으로 등록한 환경변수를 호출해본다.

 

4. Elasticsearch/logstash/kibana 설치

 

4.1 Public signing key 설치

$ sudo rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

4.2 Repository 추가

$ sudo vi /etc/yum.repos.d/Elastic.repo

[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

4.3 설치

$ sudo yum -y install elasticsearch logstash kibana

 

5. EBS 마운트

수집할 로그를 새로운 볼륨에 따로 저장하고 관리하기 위해서 EBS 볼륨을 마운트한다.

위의 이미지 순서대로 EBS 볼륨을 생성하고 ELK-Master 인스턴스에 해당 볼륨을 연결한다.

$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0   8G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0  10M  0 part /boot/efi
nvme1n1       259:3    0  24G  0 disk

EBS 볼륨이 연결되었는지 확인한다.

$ sudo mkfs.ext4 /dev/sdf
$ sudo mkdir /ELK
$ sudo mount /dev/sdf /ELK
$ df -Th
Filesystem       Type      Size  Used Avail Use% Mounted on
devtmpfs         devtmpfs  437M     0  437M   0% /dev
tmpfs            tmpfs     478M     0  478M   0% /dev/shm
tmpfs            tmpfs     478M  412K  478M   1% /run
tmpfs            tmpfs     478M     0  478M   0% /sys/fs/cgroup
/dev/nvme0n1p1   xfs       8.0G  4.1G  4.0G  51% /
/dev/nvme0n1p128 vfat       10M  3.8M  6.3M  38% /boot/efi
tmpfs            tmpfs      96M     0   96M   0% /run/user/1000
/dev/nvme1n1     ext4       24G   45M   23G   1% /ELK

EBS 볼륨을 ext4로 파일시스템을 지정하고 /ELK 디렉터리를 생성한 뒤 ELK 디렉터리에 EBS 볼륨을 마운트한다.

sudo mkdir /ELK/elasticsearch
sudo mkdir -p /ELK/log/elasticsearch
sudo chown -R elasticsearch. /ELK

Elasticsearch의 로그를 저장하기 위한 디렉터리 생성

$ sudo mkdir /ELK/logstash
$ sudo mkdir /ELK/log/logstash
$ sudo chown logstash. /ELK/logstash /ELK/log/logstash

Logstash의 로그를 저장하기 위한 디렉터리 생성

6. Elasticsearch 설정

Elasticsearch의 실행 환경 설정은 대부분 YAML 형식으로 작성된 elasticsearch.yml 파일에서 설정된다.

sudo vi /etc/elasticsearch/elasticsearch.yml

# ---------------------------------- Cluster -----------------------------------
cluster.name: joon
# ------------------------------------ Node ------------------------------------
node.name: joon.elktest.com
# ----------------------------------- Paths ------------------------------------
path.data: /ELK/elasticsearch
path.logs: /ELK/log/elasticsearch
# ---------------------------------- Network -----------------------------------
network.host: 0.0.0.0	# any로 설정
http.port: 9200
# --------------------------------- Discovery ----------------------------------
discovery.seed_hosts: ["10.0.0.30", "127.0.0.1"]
cluster.initial_master_nodes: ["joon.elktest.com"]

node.master: true

- 각 설정에 대한 설명 '더보기' 클릭

더보기

cluster.name: "<클러스터명>"

클러스터명을 설정할 수 있습니다. Elasticsearch의 노드들은 클러스터명이 같으면 같은 클러스터로 묶이고 클러스터명이 다르면 동일한 물리적 장비나 바인딩이 가능한 네트워크상에 있더라도 서로 다른 클러스터로 바인딩이 됩니다. 디폴트 클러스터명은 "elasticsearch" 이며 충돌을 방지하기 위해 클러스터명은 반드시 고유한 이름으로 설정하도록 합니다.

 

node.name: "<노드명>"

실행중인 각각의 elasticsearch 노드들을 구분할 수 있는 노드의 이름을 설정할 수 있습니다. 설정하지 않으면 노드명은 7.0 버전 부터는 호스트명, 6.x 이하 버전에서는 프로세스 UUID의 첫 7글자가 노드명으로 설정됩니다.

 

node.attr.<key>: "<value>"

노드별로 속성을 부여하기 위한 일종의 네임스페이스를 지정합니다. 이 설정을 이용하면 hot / warm 아키텍쳐를 구성하거나 물리 장비 구성에 따라 샤드 배치를 임의적으로 조절하는 등의 설정이 가능합니다.

 

path.data: [ "<경로>" ]

색인된 데이터를 저장하는 경로를 지정합니다. 디폴트는 Elastcisearch가 설치된 홈 경로 아래의 data 디렉토리 입니다. 배열 형태로 여러개의 경로값의 입력이 가능하기 때문에 한 서버에서 디스크 여러개를 사용할 수 있습니다.

 

path.logs: "<경로>"

Elasticsearch 실행 로그를 저장하는 경로를 지정합니다. 디폴트는 Elastcisearch가 설치된 홈 경로 아래의 logs 디렉토리 입니다. 실행중인 시스템 로그는 <클러스터명>.log 형티의 파일로 저장되며 날짜가 변경되면 이전 로그 파일은 뒤에 날짜가 붙은 파일로 변경됩니다.

 

bootstrap.memory_lock: true

Elasticsearch가 사용중인 힙메모리 영역을 다른 자바 프로그램이 간섭 못하도록 미리 점유하는 설정입니다 항상 true 로 놓고 사용하는것을 권장합니다.

 

network.host: <ip 주소>

Elasticsearch가 실행되는 서버의 ip 주소입니다. 디폴트는 루프백(127.0.0.1) 입니다. 주석 처리 되어 있거나 루프백인 경우에는 Elasticsearch 노드가 개발 모드로 실행이 됩니다. 만약에 이 설정을 실제 IP 주소로 변경하게 되면 그 때부터는 운영 모드로 실행이 되며 노드를 시작할 때 부트스트랩 체크를 하게 됩니다. network.host는 서버의 내/외부 주소를 모두 지정하는데 만약 내부망에서 사용하는 주소와 외부망에서 접근하는 주소를 다르게 설정하고자 하면 아래의 값 들을 이용해서 구분이 가능합니다.

  • network.bind_host : 내부망
  • network.publish_host : 외부망

그리고 network.host 설정에 사용되는 특별한 변수값이 있는데 다음과 같습니다.

  • _local_ : 루프백 주소 127.0.0.1 과 같습니다. 디폴트로 설정되어 있습니다.
  • _site_ : 로컬 네트워크 주소로 설정됩니다. 실제로 클러스터링 구성 시 주로 설정하는 값입니다.
  • _global_ : 네트워크 외부에서 바라보는 주소로 설정합니다.

실제로 클러스터를 구성할 때 설정을 network.host: _site_ 로 해 놓으면 서버의 네트워크 주소가 바뀌어도 설정 파일은 변경하지 않아도 되기 때문에 편리합니다.

http.port: <포트 번호>

Elasticsearch가 클라이언트와 통신하기 위한 http 포트를 설정합니다. 디폴트는 9200 이며, 포트가 이미 사용중인 경우 9200 ~ 9299 사이 값을 차례대로 사용합니다.

 

transport.port: <포트 번호>

Elasticsearch 노드들 끼리 서로 통신하기 위한 tcp 포트를 설정합니다. 디폴트는 9300 이며, 포트가 이미 사용중인 경우 9300 ~ 9399 사이의 값을 차례대로 사용합니다.

 

discovery.seed_hosts: [ "<호스트-1>", "<호스트-2>", ... ]

클러스터 구성을 위해 바인딩 할 원격 노드의 IP 또는 도메인 주소를 배열 형태로 입력합니다. 주소만 적는 경우 디폴트로 9300~9305 사이의 포트값을 검색하며, tcp 포트가 이 범위 밖에 설정 된 경우 포트번호 까지 같이 적어주어야 합니다. 이렇게 원격에 있는 노드들을 찾아 바인딩 하는 과정을 디스커버리 라고 합니다. 

 

discovery.seed_hosts 옵션은 7.0 부터 추가된 기능입니다. 6.x 이전 버전에서는 대신에 젠 디스커버리를 사용했습니다. 사용 방법은 아래와 같습니다.

 

discovery.zen.ping.unicast.hosts: [ "<호스트-1>", "<호스트-2>", ... ]

cluster.initial_master_nodes: [ "<노드-1>", "<노드-2>" ]

클러스터가 최초 실행 될 때 명시된 노드들을 대상으로 마스터 노드를 선출합니다.

 

cluster.initial_master_nodes 옵션 역시 7.0 부터 추가된 기능입니다. 6.x 이전 버전에서는 최소 마스터 후보 노드를 지정하기 위해 다음 옵션을 사용했습니다. 7.0 버전 부터는 최소 마스터 후보 노드의 크기가 능동적으로 변경됩니다.

discovery.zen.minimum_master_nodes: 2

노드 실행시 지정된 환경변수를 elasticsearch.yml 에서 ${환경변수명} 형식으로 사용이 가능합니다.

 

출처: https://esbook.kimjmin.net/02-install/2.3-elasticsearch/2.3.2-elasticsearch.yml

 

7. Logstash 설정

Logstash 설정 또한 logstash.yml 파일로 설정한다.

$ vi /etc/logstash/logstash.yml
# -------------------- Data path --------------------
#path.data: /var/lib/logstash
path.data: /ELK/logstash
# -------------------- Data path --------------------
#path.logs: /var/log/logstash
path.logs: /ELK/log/logstash
  • pipeline.batch.size : 개별 worker 스레드가 input에서 수집할 최대 이벤트 개수 설정. 일반적으로 배치크기가 클수록 효율적이지만 메모리 오버해드가 증가함. (default : 125)
  • pipeline.batch.delay : 크기가 작은 배치를 pipeline worker에게 발송하기 전 각 이벤트를 기다리는 시간 (default : 50ms)

 

8. Kibana 설정

kibana도 kibana.yml 파일을 통해 설정한다.

$ sudo vi /etc/kibana/kibana.yml
#server.port: 5601
server.port: 5601
#server.host: "localhost"
server.host: "0.0.0.0"
#server.name: "your-hostname"
server.name: "joon.kibana.com""
#elasticsearch.hosts: ["http://localhost:9200"]
elasticsearch.hosts: ["http://localhost:9200"]
  • server.port : kibana가 통신할 포트 설정 (Default : 5601)
  • server.host : 백엔드 서버의 host IP 지정 (Default는 "localhost"이며, 원격 사용자의 연결을 허용하려면 kibana 서버의 IP주소 또는 DNS 이름으로 설정
  • server.name : kibana 인스턴스 명 설정
  • elasticsearch.hosts : 모든 쿼리에 사용할 Elasticsearch 인스턴스의 url 설정 (설정된 모든 노드는 동일한 클러스터에 있어야 함)

9. ELK실행 및 실행 확인

9.1 Elasticsearch 실행

$ sudo /bin/systemctl daemon-reload
$ sudo systemctl enable elasticsearch.service
$ sudo systemctl start elasticsearch.service

 

9.2 logstash 실행

$ sudo /usr/share/logstash/bin/system-install /etc/logstash/startup.options systemd
$ sudo systemctl enable logstash
$ sudo systemctl start logstash

 

9.3 kibana 실행

$ sudo systemctl enable kibana
$ sudo systemctl start kibana

 

9.4 ELK 실행 확인

----------------elasticsearch-----------------------
$ systemctl status elasticsearch
$ ps -ef | grep elasticsearch

-------------------logstash-------------------------
$ systemctl status logstash
$ ps -ef | grep logstash

-------------------kibana---------------------------
$ systemctl status kibana
$ ps -ef | grep kibana

 

9.5 포트 확인

$ netstat -nlp | grep 9200
$ netstat -nlp | grep 5601

 

10. 인바운드 규칙 편집

5044번 포트는 TCP와 UDP 모두 열어주고 ELK-WEB의 IP주소에 대해서만 포트를 개방한다.

5601, 9200번 포트는 TCP에 대해 본인의 IP주소만 포트를 개방한다.

 

11. 접속 테스트

11.1 Elasticsearch 테스트

ELK-Master의 공인 IP주소와 9200포트로 접속하여 Elasticsearch가 정상 작동중인지 테스트한다.

 

11.2 Kibana 테스트

 

 

 

ELK-Master의 공인 IP주소와 5601포트로 접속하여 Kibana가 정상 작동중인지 테스트한다.

 

 

Reference

https://esbook.kimjmin.net/02-install/2.3-elasticsearch/2.3.2-elasticsearch.yml

https://suyeon96.tistory.com/39