본문 바로가기

Monitoring Tools/ELK Stack

[elasticsearch] cluster 구축하기(8.14.x, CentOS, xpack security)

반응형

구축하기 전에


관련글은 아래 링크를 참조 하도록 한다.

 

설치 환경은 아래와 같다.

  • OS : CentOS Stream release 8
  • Kernel : 4.18.0-553.6.1.el8.x86_64
  • elasticsearch : 8.14.3

최종 3개의 elasticsearch(이하 ES) node로 cluster를 구성하고 1개의 node로 logstash, kibana를 구성할 예정이다.

  • ES node :
    • test-ES01 : 172.16.10.111
      • node name : es-node01
    • test-ES02 : 172.16.10.112
      • node name : es-node02
    • test-ES03 : 172.16.10.113
      • node name : es-node03
  • kibana, logstash :
    • test-ES04 : 172.16.10.114
      • node name : es-kibana01, es-logstash01
test-ES01은 host의 hostname이며 es-node01은 ES 의 node name 이다

 

단일 node(test-ES02) 구축에 이어 test-ES01, test-ES03를 추가하는 방식으로 cluster를 구축하고자 한다.

단일 node 구축 관련 참조 : https://ploz.tistory.com/entry/elasticsearch-814x-%EC%84%A4%EC%B9%98CentOS

 

 

 

본격적인 구축


hosts 파일 등록

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

경로 : /etc/hosts

172.16.10.111   test-ES01
172.16.10.112   test-ES02
172.16.10.113   test-ES03
172.16.10.114   test-ES04

 

 

yum repository 추가

elasticsearch GPG KEY import

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

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

 

repogitory 추가

아래 경로에 설정을 추가한다.

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

경로 : /etc/yum.repos.d/elasticsearch.repo

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

 

 

ES 설치

yum(dnf)를 이용하여 패키지 설치로 진행한다.

이 작업은 test-ES01, test-ES03 모두에 동일하게 설치한다.

yum install elasticsearch-8.14.3

 

 

인증서 가져오기

test-ES02에서 생성했던 ca, node, http 인증서를 가져와 적용 할 수 있다.

이때 인증서 생성시 입력했던 패스워드를 잘 기억해두었다가 test-ES01, test-ES03의 키 저장소에 추가해주어야 한다.

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

 

기존인증서 삭제

rm -rf /etc/elasticsearch/certs/*

 

test-ES02 인증서 가져오기

# ca 인증서
scp -r test-ES02:/etc/elasticsearch/certs/elastic-stack-ca.p12 /etc/elasticsearch/certs/

# node 인증서
scp -r test-ES02:/etc/elasticsearch/certs/elastic-stack-ca.p12 /etc/elasticsearch/certs/

# http 인증서
scp -r test-ES02:/etc/elasticsearch/certs/http.p12 /etc/elasticsearch/certs/

 

 

키 저장소에 인증서 암호 추가하기

test-ES02에서 인증서 생성시 입력했던 암호를 동일하게 적용한다. 암호가 분실하였을 경우 test-ES02에서 새로운 인증서를 생성하고 다시 test-ES01, test-ES03에 배포하여야 한다.

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

 

node 인증서 키 저장소에 암호 추가

bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password

 

Setting xpack.security.transport.ssl.keystore.secure_password already exists. Overwrite? [y/N] [y 입력]
Enter value for xpack.security.transport.ssl.keystore.secure_password: [패스워드 입력]

 

bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

 

Setting xpack.security.transport.ssl.truststore.secure_password already exists. Overwrite? [y/N] [y 입력]
Enter value for xpack.security.transport.ssl.truststore.secure_password: [패스워드 입력]

 

 

http 인증서 키 저장소에 암호 추가

bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password

 

Setting xpack.security.http.ssl.keystore.secure_password already exists. Overwrite? [y/N] [y 입력]
Enter value for xpack.security.http.ssl.keystore.secure_password: [패스워드 입력]

 

bin/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password

 

Enter value for xpack.security.http.ssl.truststore.secure_password: [패스워드 입력]

 

 

ES configuration

node.name 을 제외하고 test-ES01, test-ES02, test-ES03 에서 동일하게 설정한다.

경로 : /etc/elasticsearch/elasticsearch.yml

cluster.name: test-es-cluster
# 각 node이름에 맞게 설정
node.name: [es-node01 or es-node02 or es-node03]
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: ["_local_","_site_"]
http.port: 9200
discovery.seed_hosts: ["test-ES01","test-ES02","test-ES03"]
cluster.initial_master_nodes: ["es-node01","es-node02","es-node03"]

xpack.security.enabled: true
xpack.security.enrollment.enabled: true
xpack.security.http.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/http.p12
  truststore.path: certs/http.p12
xpack.security.transport.ssl:
  enabled: true
  verification_mode: certificate
  keystore.path: certs/es-node02.p12
  truststore.path: certs/es-node02.p12
  
xpack.monitoring.collection.enabled: true

 

bootstrap.memory_lock: true 옵션을 위해 설정을 추가한다.

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

경로 : /usr/lib/systemd/system/elasticsearch.service

[Service]
LimitMEMLOCK=infinity

 

systemctl daemon-reload

 

경로 : /etc/security/limits.conf

elasticsearch soft memlock unlimited
elasticsearch hard memlock unlimited

host를 재부팅한다.

 

 

jvm 옵션 설정

이 작업은 test-ES01, test-ES03 모두에 동일하게 적용한다.

경로 : /etc/elasticsearch/jvm.options

-Xms8g
-Xmx8g

host의 물리메모리 절반의 값을 jvm 옵션으로 사용한다.

 

 

ES 서비스를 시작한다.

모든 node에서 서비스를 시작하거나 재시작한다.

systemctl start elasticsearch

 

 

ES 사용자 계정 설정

ES의 계정은 elastic 으로 패스워드는 ES 설치시에 발급하여 준다.

yum을 이용한 설치 시 아래와 같이 "+6i-Z*HtbDPpxP4MSSE_" 의 패스워드를 발급해 준다.

 ...
 Installing       : elasticsearch-8.14.3-1.x86_64                                                                                           1/1 
  Running scriptlet: elasticsearch-8.14.3-1.x86_64                                                                                           1/1 
--------------------------- Security autoconfiguration information ------------------------------

Authentication and authorization are enabled.
TLS for the transport and HTTP layers is enabled and configured.

The generated password for the elastic built-in superuser is : +6i-Z*HtbDPpxP4MSSE_
...

 

하지만 cluster의 경우 test-ES02에서 elasticsearch-setup-passwords를 통해 재설정한 패스워드가 모든 node에 사용되게 된다.

패스워드를 분실한 경우 아무 node에서 elasticsearch-setup-passwords를 통해 다시 패스워드를 발급받으면 된다.

 

 

Cluster 상태 확인


node 확인

curl -k -u elastic:[패스워드] -XGET 'https://127.0.0.1:9200/_cat/nodes?v'

생성한 ca 인증서가 public 하지 않으므로  curl에 -k 옵션을 사용한다.

ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
172.16.10.111            4          60   2    0.85    0.70     0.31 cdfhilmrstw -      es-node01
172.16.10.112            8          63   0    0.04    0.01     0.00 cdfhilmrstw *      es-node02
172.16.10.113           12          69   0    0.04    0.01     0.00 cdfhilmrstw -      es-node03

es-node02가 현재 master로 선정 되었다.

 

상태 정보 확인

curl -k -u elastic:[패스워드] -XGET 'https://127.0.0.1:9200/_cluster/health?pretty'

 

{
  "cluster_name" : "test-es-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 3,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 1,
  "active_shards" : 2,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

 

 

shard disk 할당 정보

curl -k -u elastic:[패스워드] -XGET 'https://127.0.0.1:9200/_cat/allocation?v'

 

shards shards.undesired write_load.forecast disk.indices.forecast disk.indices disk.used disk.avail disk.total disk.percent host          ip            node      node.role
     1                0                 0.0                 4.6kb        4.6kb     4.7gb     73.2gb     77.9gb            6 172.16.10.111 172.16.10.111 es-node01 cdfhilmrstw
     1                0                 0.0                 4.6kb        4.6kb     4.7gb     73.1gb     77.9gb            6 172.16.10.113 172.16.10.113 es-node03 cdfhilmrstw
     0                0                 0.0                    0b           0b     4.7gb     73.2gb     77.9gb            6 172.16.10.112 172.16.10.112 es-node02 cdfhilmrstw

 

 

 

warning log 


data가 쌓여 있는 (새로 설치하지 않은) host의 ES node를 cluster에 합류 시킬때 아래와 같은 로그로 cluster 조인이 되지 않는 경우가 있다.

[WARN ][o.e.c.c.Coordinator      ] [es-node03] This node is a fully-formed single-node cluster with cluster UUID [fuzWMNMGSni2ZpTYtNUzww], but it is configured as if to discover other nodes and form a multi-node cluster via the [discovery.seed_hosts=[test-ES02, test-ES03]] setting. Fully-formed clusters do not attempt to discover other nodes, and nodes with different cluster UUIDs cannot belong to the same cluster. The cluster UUID persists across restarts and can only be changed by deleting the contents of the node's data path(s). Remove the discovery configuration to suppress this message.

 

이때 path.data에 있는 경로의 data를 삭제후 ES를 재시작하면 정상적인 cluster 조인이 가능할 수 있다.

반응형