티스토리 뷰

Elastic Stack

Elasticsearch + Docker + TLS

아나니리 2021. 1. 11. 22:19

엘라스틱서치를 세 대의 인스턴스에 각각 세개의 노드로 구축한 방법

 

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/guide/en/elastic-stack-get-started/current/get-started-docker.html#get-started-docker-tls

 

Running the Elastic Stack on Docker | Getting Started [7.10] | Elastic

At this point, Kibana cannot connect to the Elasticsearch cluster. You must generate a password for the built-in kibana_system user, update the ELASTICSEARCH_PASSWORD in the compose file, and restart to enable Kibana to communicate with the secured cluster

www.elastic.co

www.elastic.co/kr/blog/getting-started-with-elasticsearch-security

 

TLS 암호화와 역할 기반 액세스 제어를 이용한 Elasticsearch 보안

Elasticsearch 클러스터 보안 -- Elastic Stack의 다른 구성 요소 -- 노드-투-노드 TLS와 역할 기반 액세스 제어(RBAC). 이러한 기능과 그 밖에 여러 가지가 이제 Elasticsearch와 Kibana의 기본 배포에서 무료 제공

www.elastic.co

'Elastic Stack' 카테고리의 다른 글

Index 란?  (0) 2021.01.13
Logstash 로그 수집(1)  (0) 2021.01.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함