티스토리 뷰
엘라스틱서치를 세 대의 인스턴스에 각각 세개의 노드로 구축한 방법
1. 자체 인증서 만들기
instances.yml 작성
인증서를 만드는데 필요한 정보
각 노드마다 만들어도 됨
instances:
- name: master1 // 노드 이름
dns:
- 도메인 // 도메인이 없으면 ip로 작성
ip:
- 1번 서버 ip
- name: master2
dns:
- 도메인
ip:
- 2번 서버 ip
- name: master3
dns:
- 도메인
ip:
- 3번 서버 ip
create-certs.yml 작성
내장된 elasticsearch-certutil 명령어를 이용해서 인증서를 만드는 방법
위에서 작성한 instances.yml 이용
/home/centos/elasticsearch/certs 경로에 인증서가 생성됨
${VERSION} : 같은 경로의 .env 파일에서 읽음
version: '3'
services:
create_certs:
image: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
container_name: create_certs
command: >
bash -c '
yum install -y -q -e 0 unzip;
if [[ ! -f /certs/elastic-certificates.p12 ]]; then
bin/elasticsearch-certutil cert --silent --pem --in config/certificates/instances.yml -out /certs/bundle.zip;
unzip /certs/bundle.zip -d /certs;
fi;
chown -R 1000:0 /certs
'
working_dir: /usr/share/elasticsearch
volumes:
- /home/centos/elasticsearch/certs:/certs
- .:/usr/share/elasticsearch/config/certificates
networks:
- elastic
networks:
elastic:
driver: bridge
create-certs.yml 실행
인증서만 만들기 위해 한번만 실행하면 됨
docker-compose -f create-certs.yml run --rm create_certs
2. Elasticsearch 실행
elastic-docker-tls.yml 작성
elasticsearch는 인스턴스 하나당 하나의 노드를 권장
서버의 성능이 좋다면 여러개의 노드를 올려서 사용가능 (jvm의 가비지 컬렉션의 성능이 64gb 전후로 다르다고 하니 나눌 필요가 을까 싶다..)
각 서버의 파일 마다 container name 과 node name 은 적절히 변경 동일하면 안됨
- container_name: data12
- node.name= data12
클러스터 이름은 동일 해야함
- cluster.name=es-docker-cluster
network host 설정으로 공인 ip 설정을 해주지 않으면 사설 ip로만 통신해서 노드끼리 클러스터를 못 역는 상황이 있었음
- network.host=_site_
- network.bind_host=_site_
- network.publish_host=공인IP
공식 문서처럼 하나의 서버에서 내부 네트워크를 사용한다면 자동으로 포트가 매핑되지만 다른 서버와 통신하기 위해서 명시적으로 적어 주었음
- http.port=9202
- transport.tcp.port=9302
노드에 할당 할 메모리 크기 설정, 파일 시스템에서도 사용할 메모리가 있어야 함으로 절반 이상 설정하지 말것
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
기본으로 서버의 프로세스의 수를 읽어서 사용하지만 하나의 서버에 여러개의 노드를 올릴 경우 각 노드마다 서버의 프로세스 수로 할당될 수 있으니 설정
- node.processors=2
elasticsearch를 재시작 할 필요가 있을 때, 실수로 컨테이너를 삭제하는 때 데이터 유실을 방지하기 위해서 데이터 폴더를 빼놓자
- /usr/share/elasticsearch/data
version: '3'
services:
master1:
image: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
container_name: master1
environment:
- node.name=master1
- node.data=false
- node.processors=2
- network.host=_site_
- network.bind_host=_site_
- network.publish_host=각 인스턴스 공인IP
- cluster.name=es-docker-cluster
- discovery.seed_hosts=서버1공인IP:9300,서버2공인IP:9300,서버3공인IP:9300
- cluster.initial_master_nodes=master1,master2,master3
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- xpack.license.self_generated.type=basic
- xpack.security.enabled=true
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/master1/master1.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/master1/master1.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /home/centos/elasticsearch/data/data01:/usr/share/elasticsearch/data
- /home/centos/elasticsearch/logs/logs01:/usr/share/elasticsearch/logs
- /home/centos/elasticsearch/certs:$CERTS_DIR
ports:
- 9200:9200
- 9300:9300
data11:
image: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
container_name: data11
environment:
- node.name=data11
- node.master=false
- node.processors=3
- network.host=_site_
- network.bind_host=_site_
- network.publish_host=각 인스턴스 공인IP
- http.port=9201
- transport.tcp.port=9301
- transport.tcp.compress=true
- cluster.name=es-docker-cluster
- discovery.seed_hosts=서버1공인IP:9300,서버2공인IP:9300,서버3공인IP:9300
- cluster.initial_master_nodes=master1,master2,master3
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms3g -Xmx3g"
- xpack.license.self_generated.type=basic
- xpack.security.enabled=true
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/master1/master1.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/master1/master1.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /home/centos/elasticsearch/data/data02:/usr/share/elasticsearch/data
- /home/centos/elasticsearch/logs/logs02:/usr/share/elasticsearch/logs
- /home/centos/elasticsearch/certs:$CERTS_DIR
ports:
- 9201:9201
- 9301:9301
data12:
image: docker.elastic.co/elasticsearch/elasticsearch:${VERSION}
container_name: data12
environment:
- node.name=data12
- node.master=false
- node.processors=3
- network.host=_site_
- network.bind_host=_site_
- network.publish_host=각 인스턴스 공인IP
- http.port=9202
- transport.tcp.port=9302
- transport.tcp.compress=true
- cluster.name=es-docker-cluster
- discovery.seed_hosts=서버1공인IP:9300,서버2공인IP:9300,서버3공인IP:9300
- cluster.initial_master_nodes=master1,master2,master3
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms3g -Xmx3g"
- xpack.license.self_generated.type=basic
- xpack.security.enabled=true
- xpack.security.transport.ssl.enabled=true
- xpack.security.transport.ssl.verification_mode=certificate
- xpack.security.transport.ssl.certificate_authorities=$CERTS_DIR/ca/ca.crt
- xpack.security.transport.ssl.certificate=$CERTS_DIR/master1/master1.crt
- xpack.security.transport.ssl.key=$CERTS_DIR/master1/master1.key
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- /home/centos/elasticsearch/data/data03:/usr/share/elasticsearch/data
- /home/centos/elasticsearch/logs/logs03:/usr/share/elasticsearch/logs
- /home/centos/elasticsearch/certs:$CERTS_DIR
ports:
- 9202:9202
- 9302:9302
elastic-docker-tls.yml 실행
인증서를 각 서버로 복붙
docker-compose -f elastic-docker-tls.yml up
비밀번호 설정
공식 문서에 나온 방식으로 에러가 발생함 (docker exec es01 /bin/bash -c "bin/elasticsearch-setup-passwords \ auto --batch --url https://es01:9200")
실행된 컨테이너 내부로 진입해서 명령어를 실행해서 수동으로 설정
./bin/elasticsearch-setup-passwords interactive
후기
내부 서비스로 사용하고 있어서 아직 큰 문제 없이 사용하지만 장기 운영시 어떤 문제가 있을지 모르겠다.
단순 데이터 조회는 문제가 없지만 70gb 정도의 인덱스를 aggregation 하면서 cpu 사용량이 높다.
참고
www.elastic.co/kr/blog/getting-started-with-elasticsearch-security
'Elastic Stack' 카테고리의 다른 글
Index 란? (0) | 2021.01.13 |
---|---|
Logstash 로그 수집(1) (0) | 2021.01.12 |