콘텐츠로 이동

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 get nodes --show-labels  | grep 'openes'

클러스터 테인트 설정

다음 명령을 실행하여 클러스터 테인트를 설정합니다.

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

차트의 기본 구성을 추출하여 사용자 지정 구성을 만듭니다.

$ tar -zxvf opensearch-cluster-0.0.1.tgz opensearch-cluster/values.yaml

opensearch-cluster 디렉터리 아래의 values.yaml을 수정합니다. 각 노드 유형의 opensearchJavaOpts, nodeSelector, tolerations, storageClass 매개변수에 주의하세요. resourcesopensearchJavaOpts는 실제 상황에 따라 설정하며, 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

배포 및 구성 확인

컨테이너 상태 확인

kubectl get pods -A -l     app.kubernetes.io/instance=opensearch-cluster

출력 결과:

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"]}'

출력 결과:

{"status":"CREATED","message":"'openes' created."}

사용자 확인

사용자 생성 시 문서 기본 비밀번호를 변경한 경우 명령어를 수정하세요.

다음 명령을 실행합니다.

kubectl exec -ti -n middleware opensearch-cluster-client-0 -c opensearch-client -- curl -u openes:kJMerxk3PwqQ  http://127.0.0.1:9200/_cat/indices

출력 결과:

green open security-auditlog-2022.11.02 bwpC6JXiTzeqcC9YT8vksg 1 1  3 0  87.7kb 43.8kb
green open .kibana_1                    D_GsZGbKT0aIGEGkhnTajg 1 1  0 0    416b   208b
green open .opendistro_security         _723x9PCQZO8BosxrG_2cg 1 2 10 0 182.1kb 78.7kb

문서 평가

이 페이지가 도움이 되었나요?