OpenSearch 고가용성 배포¶
개요¶
OpenSearch는 Elasticsearch OSS 7.10.2에서 파생된 오픈 소스 분산 검색 및 분석 제품군입니다. 대화형 로그 분석, 실시간 애플리케이션 성능 모니터링(APM), 데이터 분석 등의 기본 기능을 손쉽게 제공합니다.
| 노드 유형 | 설명 | 프로덕션 모범 사례 |
|---|---|---|
| Cluster manager | 클러스터의 전체 작업을 관리하고 클러스터 상태를 추적합니다. 인덱스 생성 및 삭제, 클러스터에 조인하거나 떠나는 노드 추적, 각 노드의 상태 확인(ping 요청 실행), 노드에 샤드 할당 등을 수행합니다. | 거의 모든 프로덕션 사용 사례에서 세 개의 서로 다른 영역에 세 개의 전용 클러스터 관리자 노드를 두는 것이 올바른 방법입니다. 이 구성은 클러스터가 쿼럼을 절대 잃지 않도록 보장합니다. 두 노드는 대부분의 시간 동안 유휴 상태이며, 한 노드에 장애가 발생하거나 유지보수가 필요할 때만 사용됩니다. |
| Cluster manager eligible | 투표 과정을 통해 그 중 하나의 노드가 클러스터 관리자 노드로 선출됩니다. | 프로덕션 클러스터의 경우 전용 클러스터 관리자 노드를 확보하세요. 전용 노드 유형을 구현하는 방법은 다른 모든 노드 유형을 false로 표시하는 것입니다. 이 경우 다른 모든 노드는 클러스터 관리자 자격이 없는 노드로 표시되어야 합니다. |
| Data | 데이터를 저장하고 검색합니다. 로컬 샤드에서 모든 데이터 관련 작업(인덱싱, 검색, 집계)을 수행합니다. 이 노드는 클러스터의 작업 노드이며 다른 노드 유형보다 더 많은 디스크 공간이 필요합니다. | 데이터 노드를 추가할 때 영역 간에 균형을 유지하세요. 예를 들어 세 개의 영역이 있는 경우 데이터 노드를 세 개의 배수로 추가하여 각 영역에 하나씩 배치합니다. 스토리지와 RAM이 큰 노드를 사용하는 것이 좋습니다. |
| Ingest | 클러스터에 데이터를 저장하기 전에 전처리합니다. 인제스트 파이프라인을 실행하여 데이터를 인덱스에 추가하기 전에 변환합니다. | 대량의 데이터를 수신하고 복잡한 인제스트 파이프라인을 실행할 계획이라면 전용 인제스트 노드를 사용하는 것이 좋습니다. 또한 데이터 노드에서 인덱싱을 오프로드하여 데이터 노드가 검색 및 집계에 전념하도록 선택할 수도 있습니다. |
| Coordinating | 클라이언트 요청을 데이터 노드의 샤드에 위임하고, 결과를 수집 및 집계하여 최종 결과로 만든 후 클라이언트에 반환합니다. | 한 쌍의 전용 조정 전용 노드는 검색량이 많은 워크로드에서 병목 현상을 방지할 수 있습니다. 가능한 한 많은 코어를 가진 CPU를 사용하는 것이 좋습니다. |
| Dynamic | 머신러닝(ML) 작업과 같은 사용자 지정 작업에 특정 노드를 위임하여 데이터 노드의 리소스 소비를 방지하므로 OpenSearch 기능에 영향을 미치지 않습니다. |
전제 조건¶
- Kubernetes 클러스터가 배포되어 있어야 합니다.
- 스토리지 컴포넌트 확인 (상황에 따라 선택)
- 퍼블릭 클라우드 스토리지 블록 컴포넌트 (퍼블릭 클라우드)
- OpenEBS 스토리지 플러그인
리소스 목록¶
| 호스트명 | IP 주소 | 역할 | K8s 구성 | 데이터 스토리지 |
|---|---|---|---|---|
| k8s-master | 192.168.100.101 | k8s,master | 4 CPU, 16G MEM, 100G DISK | |
| K8s-node01 | 192.168.100.102 | k8s,node01 | 4 CPU, 16G MEM, 100G DISK | |
| K8s-node02 | 192.168.100.103 | k8s,node02 | 4 CPU, 16G MEM, 100G DISK | |
| K8s-node03 | 192.168.100.104 | k8s,node03 | 4 CPU, 16G MEM, 100G DISK | |
| K8s-node04 | 192.168.100.105 | openes, master, client | 4 CPU, 16G MEM, 100G DISK | /data:200G |
| K8s-node05 | 192.168.100.106 | openes, master, client | 4 CPU, 16G MEM, 100G DISK | /data:200G |
| K8s-node06 | 192.168.100.107 | openes, master, client | 4 CPU, 16G MEM, 100G DISK | /data:200G |
| K8s-node07 | 192.168.100.108 | openes, data | 8CPU, 32G MEM, 100G DISK | /data:1T |
| K8s-node08 | 192.168.100.109 | openes, data | 8CPU, 32G MEM, 100G DISK | /data:1T |
| K8s-node09 | 192.168.100.110 | openes, data | 8CPU, 32G MEM, 100G DISK | /data:1T |
기본 구성¶
| OpenSearch url | opensearch-cluster-client.middleware |
|---|---|
| OpenSearch 포트 | 9200 |
| OpenSearch 계정 | openes/kJMerxk3PwqQ |
| master JVM 크기 | 2G |
| client JVM 크기 | 4G |
| data JVM 크기 | 20G |
배포 아키텍처 다이어그램¶
설치 준비¶
OpenSearch는 리소스를 많이 사용하므로 클러스터 리소스를 독점해야 합니다. 사전에 클러스터 스케줄링을 구성해야 합니다.
클러스터 레이블 설정¶
다음 명령을 실행하여 클러스터에 레이블을 지정합니다.
kubectl label node 192.168.100.105 192.168.100.106 192.168.100.107 openes=master-client
kubectl label node 192.168.100.108 192.168.100.109 192.168.100.110 openes=data
레이블 확인:
클러스터 테인트 설정¶
다음 명령을 실행하여 클러스터 테인트를 설정합니다.
kubectl taint node 192.168.100.105 192.168.100.106 192.168.100.107 192.168.100.108 192.168.100.109 192.168.100.110 app=openes:NoExecute
OpenEBS StorageClass 설정¶
퍼블릭 클라우드를 사용하는 경우 퍼블릭 클라우드 스토리지 블록 컴포넌트를 참조하세요.
다음 yaml 구성을 배포합니다.
apiVersion: storage.k8s.io/v1
allowVolumeExpansion: true
kind: StorageClass
metadata:
annotations:
cas.openebs.io/config: |
- name: StorageType
value: "hostpath"
- name: BasePath
value: "/data/opensearch"
name: openebs-opensearch
provisioner: openebs.io/local
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
/data디렉터리의 디스크 용량이 충분한지 확인하세요.
설치¶
구성 수정¶
인프라 관련 차트는 /etc/kubeasz/guance/infrastructure/charts 디렉터리에 있습니다. 이 디렉터리로 이동하여 작업을 수행합니다.
$ cd /etc/kubeasz/guance/infrastructure/charts
$ ls
localpv-provisioner-3.3.0.tgz opensearch-cluster-0.0.1.tgz tdengine-0.4.0.tgz
차트의 기본 구성을 추출하여 사용자 지정 구성을 만듭니다.
opensearch-cluster디렉터리 아래의values.yaml을 수정합니다. 각 노드 유형의opensearchJavaOpts,nodeSelector,tolerations,storageClass매개변수에 주의하세요.resources와opensearchJavaOpts는 실제 상황에 따라 설정하며, Kubernetes가 할당하는 메모리는 JVM 힙 메모리보다 낮지 않아야 합니다.replicas는 홀수가 좋으며, 클러스터 스플릿 브레인을 방지할 수 있습니다.
opensearch-master:
...
replicas: 3
# init 컨테이너를 사용하여 커널 매개변수 설정
# sysctlInit:
# enabled: true
opensearchJavaOpts: "-Xmx2g -Xms2g"
nodeSelector:
openes: master-client # client와 master는 동일한 유형의 머신에 스케줄링됨
tolerations:
- effect: NoExecute
key: app
operator: Equal
value: openes
persistence:
...
storageClass: openebs-opensearch
opensearch-client:
...
replicas: 3
# sysctlInit:
# enabled: true
opensearchJavaOpts: "-Xmx2g -Xms2g"
nodeSelector:
openes: master-client # client와 master는 동일한 유형의 머신에 스케줄링됨
tolerations:
- effect: NoExecute
key: app
operator: Equal
value: openes
persistence:
...
storageClass: openebs-opensearch
opensearch-data:
...
replicas: 3
# sysctlInit:
# enabled: true
opensearchJavaOpts: "-Xmx20g -Xms20g"
nodeSelector:
openes: data
tolerations:
- effect: NoExecute
key: app
operator: Equal
value: openes
persistence:
...
storageClass: openebs-opensearch
호스트에서 커널 매개변수 vm.max_map_count를 수동으로 설정하지 않으려면 sysctlInit 구성을 활성화하여 init 컨테이너가 이 작업을 수행하도록 할 수 있습니다.
init 컨테이너를 통해 이 매개변수를 설정하면, 머신이 재부팅되거나 sysctl -p로 구성을 새로 고치지 않는 한, 커널 매개변수는 컨테이너 수명 주기와 별개로 일정 시간 유지됩니다.
vm.max_map_count는 네임스페이스로 격리되지 않는 커널 매개변수이므로, 영향 범위를 줄이기 위해 OpenSearch를 전용 머신에 격리하여 배포하는 것이 좋습니다.
설치 실행¶
/etc/kubeasz/guance/infrastructure/charts 디렉터리에서 다음 명령을 실행합니다.
$ helm install opensearch-cluster -n middleware --create-namespace -f opensearch-cluster/values.yaml opensearch-cluster-0.0.1.tgz
출력 결과:
Release "opensearch-cluster" has been isntalld. Happy Helming!
NAME: opensearch-cluster
LAST DEPLOYED: Wed Nov 2 20:26:16 2022
NAMESPACE: middleware
STATUS: deployed
REVISION: 1
TEST SUITE: None
배포 및 구성 확인¶
컨테이너 상태 확인¶
출력 결과:
NAMESPACE NAME READY STATUS RESTARTS AGE
middleware opensearch-cluster-client-0 1/1 Running 0 63m
middleware opensearch-cluster-client-1 1/1 Running 0 4m52s
middleware opensearch-cluster-client-2 1/1 Running 0 4m47s
middleware opensearch-cluster-data-0 1/1 Running 0 63m
middleware opensearch-cluster-data-1 1/1 Running 0 63m
middleware opensearch-cluster-data-2 1/1 Running 0 63m
middleware opensearch-cluster-master-0 1/1 Running 0 63m
middleware opensearch-cluster-master-1 1/1 Running 0 63m
middleware opensearch-cluster-master-2 1/1 Running 0 4m31s
Running 상태는 배포 성공을 의미합니다.
계정 구성¶
사용자 생성¶
kJMerxk3PwqQ는 설정된 비밀번호입니다. 필요에 따라 변경할 수 있습니다.
kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client \
-- curl -X PUT -u admin:admin http://127.0.0.1:9200/_plugins/_security/api/internalusers/openes \
-H 'Content-Type: application/json' \
-d '{"password": "kJMerxk3PwqQ","opendistro_security_roles": ["all_access"]}'
출력 결과:
사용자 확인¶
사용자 생성 시 문서 기본 비밀번호를 변경한 경우 명령어를 수정하세요.
다음 명령을 실행합니다.
kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client -- curl -u openes:kJMerxk3PwqQ http://127.0.0.1:9200/_cat/indices
출력 결과:
