ElasticSearch를 K8s 위에 설치한 경우, plugin을 추가로 설치하고 서비스를 재시작하면, pod이 종료되면서 설치 당시의 컨테이너 이미지가 pod으로 재실행되므로 plugin을 설치한 효과가 즉시 사라지게 된다.
단순히 컨테이너 이미지를 docker 명령이나 docker compose 또는 K8s에 직접 배포해서 사용하는 경우라면 비교적 간단한 해결 방법이 있다. Dockerfile을 생성하고 ElasticSearch 이미지를 기본으로 사용하고 plugin을 설치한 후에 내가 신규로 빌드한 이미지를 사용하면 해결이 된다.
FROM docker.elastic.co/elasticsearch/elasticsearch:7.17.3
RUN bin/elasticsearch-plugin install analysis-nori
docker build -t myregistry/elasticsearch-nori:7.17.3
그러나 helm chart를 이용해서 설치한 경우에는 공개된 저장소를 준비하고 그 저장소에 배포를 해서 공개해야 하므로 복잡해진다. 로컬에서만 plugin을 추가로 설치하는 방법이 있다.
helm chart 설치 명령이 다음과 같다면,
helm install my-es-release elastic/elasticsearch
values.yaml을 이용해서 설치하거나 업그레이드할 때 설정을 변경할 수 있다.
현재 설치된 helm chart의 설정값을 확인하려면, helm get values 명령을 이용한다.
helm get values my-es-release
이 내용을 기반으로 다음과 같이 values.yml을 작성하면 된다. 아래 예제 중에서 elasticsearch-plugins.yml 설정 파일을 선언한 부분에 analysis-nori plugin에 대한 원격 경로가 지정되어 있음을 확인할 수 있다.
---
esConfig:
elasticsearch.yml: |
중략
elasticsearch-plugins.yml: |
plugins:
- id: analysis-nori
location: https://artifacts.elastic.co/downloads/elasticsearch-plugins/analysis-nori/analysis-nori-7.17.3.zip
values.yml을 작성하고 다음과 같이 설치할 수 있다.
helm install my-es-release elastic/elasticsearch -f values.yml
또는
helm upgrade my-es-release elastic/elasticsearch -f values.yml
elasticsearch는 statefulset으로 배포되는데 statefulset을 다시 rollout하더라도 nori plugin이 설치된 상태로 재배포된다.