elasticsearch (w. docker)

이우철·2025년 5월 11일
  1. 환경 준비
    먼저 Docker와 Docker Compose가 설치되어 있어야 합니다. 아래 명령어로 설치 여부를 확인하세요.
docker --version
docker-compose --version

설치가 필요하다면 Docker 공식 문서에서 설치 가이드를 참고하세요.

  1. Docker Compose 파일 작성
    Elasticsearch는 클러스터를 구성할 수 있도록 여러 개의 노드를 실행해야 합니다. docker-compose.yml 파일을 작성하여 클러스터를 구성할 수 있습니다.

아래 docker-compose.yml 예제는 3개의 Elasticsearch 노드와 1개의 Kibana를 포함합니다.

version: '3'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=elasticsearch-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata01:/usr/share/elasticsearch/data
    ports:
      - "9200:9200"
    networks:
      - elastic
  
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=elasticsearch-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata02:/usr/share/elasticsearch/data
    networks:
      - elastic
  
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.11.0
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=elasticsearch-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata03:/usr/share/elasticsearch/data
    networks:
      - elastic
  
  kibana:
    image: docker.elastic.co/kibana/kibana:8.11.0
    container_name: kibana
    environment:
      - ELASTICSEARCH_HOSTS=http://es01:9200
    ports:
      - "5601:5601"
    networks:
      - elastic

volumes:
  esdata01:
    driver: local
  esdata02:
    driver: local
  esdata03:
    driver: local

networks:
  elastic:
    driver: bridge
  1. 클러스터 실행
    위의 docker-compose.yml 파일을 저장한 후, 아래 명령어를 실행하면 Elasticsearch 클러스터가 시작됩니다.
docker-compose up -d

모든 컨테이너가 정상적으로 실행되었는지 확인하려면 아래 명령어를 사용하세요.

docker ps
  1. Elasticsearch 확인
    Elasticsearch가 정상적으로 동작하는지 확인하려면 브라우저에서 http://localhost:9200로 접속하거나 아래 명령어를 실행하세요.

bash
curl -X GET "http://localhost:9200/_cluster/health?pretty"
클러스터 상태가 "status": "green" 또는 "status": "yellow"라면 정상적으로 실행된 것입니다.

  1. Kibana 접근
    Kibana는 Elasticsearch 데이터 시각화를 위한 도구입니다. 브라우저에서 http://localhost:5601에 접속하여 Kibana UI를 확인하세요.

  2. 운영 및 관리
    Elasticsearch 클러스터를 유지하려면 docker-compose restart 명령어로 재시작할 수 있습니다.

데이터를 백업하려면 volumes를 관리해야 합니다.

노드를 추가하거나 설정을 변경하려면 docker-compose.yml을 수정하고 다시 실행하세요.

&& 추가 보안 설정 등

  1. 인증서 설정
    Elasticsearch 8.x 버전부터 기본적으로 xpack.security.enabled 옵션이 활성화되어 있으며, HTTPS를 통해 인증서 기반으로 통신해야 합니다. 이를 위해 다음과 같은 과정이 필요합니다.

Elasticsearch 컨테이너에서 자동 생성된 인증서를 확인하고 사용할 수 있습니다.

인증서를 직접 생성하여 컨테이너에 배포할 수도 있습니다.

http_ca.crt 인증서를 로컬 머신으로 복사한 후, 이를 사용하여 보안 연결을 설정할 수 있습니다.

예제:

bash
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200

  • 조금더 상세 설명
  1. 자동 생성된 인증서 확인
    Elasticsearch 8.x 버전부터 기본적으로 xpack.security.enabled 옵션이 활성화되어 있으며, 컨테이너가 시작될 때 자동으로 인증서가 생성됩니다. 이를 확인하려면 컨테이너 내부에서 인증서 파일을 조회할 수 있습니다.
docker exec -it es01 ls /usr/share/elasticsearch/config/certs

이 명령어를 실행하면 http_ca.crt, http.p12 등의 인증서 파일이 생성된 것을 확인할 수 있습니다.

  1. 인증서 파일을 로컬로 복사
    컨테이너 내부에서 인증서를 직접 사용할 수도 있지만, 로컬 머신에서 활용하려면 인증서를 복사해야 합니다.
docker cp es01:/usr/share/elasticsearch/config/certs/http_ca.crt .

이제 http_ca.crt 파일이 로컬에 복사되었으며, 이를 사용하여 보안 연결을 설정할 수 있습니다.

  1. 인증서를 사용하여 보안 연결 설정
    Elasticsearch에 보안 연결을 설정하려면 curl 명령어를 사용할 수 있습니다.
curl --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200

이 명령어를 실행하면 인증서를 사용하여 보안 연결을 통해 Elasticsearch에 접근할 수 있습니다.

  1. Kibana에서 인증서 적용
    Kibana를 실행할 때도 Elasticsearch의 인증서를 적용해야 합니다. kibana.yml 파일을 수정하여 인증서를 설정할 수 있습니다.
elasticsearch.ssl.certificateAuthorities: [ "/usr/share/kibana/config/certs/http_ca.crt" ]

이후 Kibana를 재시작하면 인증서를 적용한 상태에서 Elasticsearch와 연결됩니다.

  1. 인증서 갱신 및 관리
    자동 생성된 인증서는 일정 기간 후 만료될 수 있습니다. 인증서를 갱신하려면 새로운 인증서를 생성하고 기존 인증서를 교체해야 합니다. Elasticsearch에서는 TLS 인증서 API를 통해 인증서 만료 여부를 확인할 수 있습니다.
curl -X GET "https://localhost:9200/_security/certificates?pretty" --cacert http_ca.crt -u elastic:$ELASTIC_PASSWORD

이 명령어를 실행하면 현재 사용 중인 인증서의 만료 날짜를 확인할 수 있습니다.

  • 결론
    Elasticsearch 컨테이너에서 자동 생성된 인증서는 기본적으로 /usr/share/elasticsearch/config/certs 경로에 저장되며, 이를 로컬로 복사하여 보안 연결을 설정할 수 있습니다. Kibana에서도 인증서를 적용하여 보안 강화를 할 수 있으며, 인증서 만료 여부를 주기적으로 확인하는 것이 중요합니다
  1. 방화벽 설정
    Docker 환경에서는 컨테이너 간 네트워크가 자동으로 설정되지만, 외부 접근을 제한하려면 방화벽 규칙을 설정해야 합니다.

Docker 네트워크 설정: docker network create elastic 명령어를 사용하여 내부 네트워크를 구성하면 컨테이너 간 통신을 보호할 수 있습니다.

방화벽 규칙 적용: iptables 또는 클라우드 방화벽 설정을 통해 Elasticsearch와 Kibana의 포트(9200, 5601 등)에 대한 접근을 제한할 수 있습니다.

예제:

bash
sudo ufw allow 9200/tcp
sudo ufw allow 5601/tcp
3. 환경 변수 및 보안 설정
Docker 환경에서는 환경 변수를 활용하여 보안 설정을 적용할 수 있습니다.

ELASTIC_PASSWORD를 환경 변수로 설정하여 보안 강화를 할 수 있습니다.

network.host: 0.0.0.0 설정을 통해 외부 접근을 허용할 수도 있지만, 보안상 주의해야 합니다.

예제:

yaml
environment:

  • ELASTIC_PASSWORD=your_secure_password
profile
개발 정리 공간 - 업무일때도 있고, 공부일때도 있고...

0개의 댓글