36.5.2. Elasticsearch
Elasticsearch(ES) 는 모든 로그가 저장되는 오브젝트 저장소입니다.
Elasticsearch는 각각 인덱스 라고 하는 데이터 저장소로 로그 데이터를 구성합니다. Elasticsearch는 각 인덱스를 shards 라는 여러 조각으로 세분화하여 클러스터의 Elasticsearch 노드 세트에 분산됩니다. replicas 라는 shard의 복사본을 만들도록 Elasticsearch를 구성할 수 있습니다. Elasticsearch는 또한 Elactisearch 노드에 복제본을 분배합니다. shard와 복제본의 조합은 장애에 대한 중복성과 복원력을 제공하기 위한 것입니다. 예를 들어 하나의 복제본을 사용하여 인덱스에 대해 세 개의 shard를 구성하는 경우 Elasticsearch는 해당 인덱스에 대해 총 6개의 shard(기본 샤드 3개와 복제본 3개를 백업으로 생성합니다.
OpenShift Container Platform 로깅 설치 프로그램은 각 Elasticsearch 노드가 자체 스토리지 볼륨이 포함된 고유한 배포 구성을 사용하여 배포되도록 합니다. 로깅 시스템에 추가하는 각 Elasticsearch 노드에 대한 추가 배포 구성을 생성할 수 있습니다. 설치하는 동안 openshift_logging_es_cluster_size
Ansible 변수를 사용하여 Elasticsearch 노드 수를 지정할 수 있습니다.
또는 인벤토리 파일의 openshift_logging_es_cluster_size
를 수정하고 로깅 플레이북을 다시 실행하여 기존 클러스터를 확장할 수 있습니다. 추가 클러스터링 매개 변수는 수정할 수 있으며 로깅 Ansible 변수 지정 에서 설명합니다.
아래 지침에 따라 스토리지 및 네트워크 위치 선택과 관련된 고려 사항은 Elastic 문서를 참조하십시오.
고가용성 Elasticsearch 환경에 는 각각 다른 호스트에 있는 3개 이상의 Elasticsearch 노드가 필요하며, 복제본을 생성하려면 openshift_logging_es_number_of_replicas
Ansible 변수를 1
개 이상의 값으로 설정해야 합니다.
모든 Elasticsearch 배포 보기
현재 Elasticsearch 배포를 모두 보려면 다음을 수행합니다.
$ oc get dc --selector logging-infra=elasticsearch
고가용성을 위한 Elasticsearch 구성
고가용성 Elasticsearch 환경에는 각각 다른 호스트에 있는 3개 이상의 Elasticsearch 노드가 필요하며, 복제본을 생성하려면 openshift_logging_es_number_of_replicas
Ansible 변수를 1
개 이상의 값으로 설정해야 합니다.
다음 시나리오를 3개의 Elasticsearch 노드가 있는 OpenShift Container Platform 클러스터의 가이드로 사용합니다.
-
openshift_logging_es_number_of_replicas
를1
로 설정하면 두 노드에 클러스터에 있는 모든 Elasticsearch 데이터의 복사본이 있습니다. 이렇게 하면 Elasticsearch 데이터가 있는 노드가 중단되면 다른 노드에 클러스터의 모든 Elasticsearch 데이터 복사본이 있습니다. openshift_logging_es_number_of_replicas
를3
으로 설정하면 4개의 노드에 클러스터에 있는 모든 Elasticsearch 데이터의 복사본이 있습니다. 이렇게 하면 Elasticsearch 데이터가 있는 노드 3개가 다운되면 한 노드에 클러스터의 모든 Elasticsearch 데이터 복사본이 있습니다.이 시나리오에서는 여러 Elasticsearch 노드가 중단되면 Elasticsearch 상태가 RED가 되고 새로운 Elasticsearch shard가 할당되지 않았습니다. 그러나 고가용성으로 인해 Elasticsearch 데이터가 손실되지 않습니다.
고가용성과 성능에는 장단점이 있습니다. 예를 들어 openshift_logging_es_number_of_replicas=2
및 openshift_logging_es_number_of_shards=3
을 보유하려면 Elasticsearch에서 클러스터의 노드 간에 shard 데이터를 복제하는 중요한 리소스를 사용해야 합니다. 또한 복제본을 더 많이 사용하려면 각 노드에서 데이터 스토리지 요구 사항을 두 배 늘리거나 이동해야 하므로 Elasticsearch에 영구 스토리지를 계획할 때 고려해야 합니다.
공유 수 구성 시 고려 사항
openshift_logging_es_number_of_shards 매개변수의
경우 다음을 고려하십시오.
-
더 높은 성능을 위해 shard 수를 늘립니다. 예를 들어 3개의 노드 클러스터에서
openshift_logging_es_number_of_shards=3을
설정합니다. 이렇게 하면 각 인덱스가 3개의 파트(스하드)로 분할되고 인덱스를 처리하기 위한 로드가 3개의 노드 전체에 분산됩니다. - 다수의 프로젝트가 있는 경우 클러스터에 몇 만 개 이상의 shard가 있는 경우 성능 저하가 표시될 수 있습니다. shard 수를 줄이거나 큐레이션 시간을 줄입니다.
-
매우 큰 인덱스가 적은 경우
openshift_logging_es_number_of_shards=3
이상을 구성할 수 있습니다. Elasticsearch는 50GB 미만의 최대 shard 크기를 사용하는 것이 좋습니다.
노드 선택기
Elasticsearch는 많은 리소스를 사용할 수 있기 때문에 클러스터의 모든 구성원은 서로 짧은 대기 시간 네트워크 연결이 있어야 하며 원격 스토리지에 대한 연결이 짧아야 합니다. 노드 선택기 를 사용하여 전용 노드 또는 클러스터 내 전용 리전에 인스턴스를 지시하여 확인합니다.
노드 선택기를 구성하려면 인벤토리 파일에서 openshift_logging_es_nodeselector
구성 옵션을 지정합니다. 이는 모든 Elasticsearch 배포에 적용됩니다. 노드 선택기를 개별화해야 하는 경우 배포 후 각 배포 구성을 수동으로 편집해야 합니다. 노드 선택기는 python 호환 dict로 지정됩니다. 예를 들면 {"node-type":"infra", "region":"east"}
입니다.
36.5.2.1. 영구 Elasticsearch 스토리지
기본적으로 openshift_logging
Ansible 역할은 Pod를 다시 시작할 때 Pod의 모든 데이터가 손실되는 임시 배포를 생성합니다.
프로덕션 환경의 경우 각 Elasticsearch 배포 구성에 영구 스토리지 볼륨이 필요합니다. 기존 영구 볼륨 클레임 을 지정하거나 OpenShift Container Platform에서 이를 생성할 수 있습니다.
기존 PVC 사용. 배포에 대해 고유한 PVC를 생성하는 경우 OpenShift Container Platform은 이러한 PVC를 사용합니다.
openshift_logging_es_pvc_prefix
설정과 일치하도록 PVC의 이름을 지정합니다. 기본값은logging-es
입니다. 각 PVC에 이름을 추가한 시퀀스 번호(logging-es-0, logging
-es-1, logging
-es-2
등)를 할당합니다.OpenShift Container Platform에서 PVC를 생성할 수 있습니다. Elsaticsearch의 PVC가 없는 경우 OpenShift Container Platform은 Ansible 인벤토리 파일의 매개 변수를 기반으로 PVC를 생성합니다.
매개변수 설명 openshift_logging_es_pvc_size
PVC 요청 크기를 지정합니다.
openshift_logging_elasticsearch_storage_type
스토리지 유형을
pvc
로 지정합니다.참고선택적 매개변수입니다.
openshift_logging_es_pvc_size
매개변수를 0보다 큰 값으로 설정하면 로깅 설치 프로그램에서 이 매개변수를 기본적으로 자동으로pvc
로 설정합니다.openshift_logging_es_pvc_prefix
선택적으로 PVC에 대한 사용자 지정 접두사를 지정합니다.
예를 들면 다음과 같습니다.
openshift_logging_elasticsearch_storage_type=pvc openshift_logging_es_pvc_size=104802308Ki openshift_logging_es_pvc_prefix=es-logging
동적으로 프로비저닝된 PV 를 사용하는 경우 OpenShift Container Platform 로깅 설치 프로그램은 기본 스토리지 클래스 또는 openshift_logging_elasticsearch_pvc_storage_class_name
매개변수로 지정된 PVC를 사용하는 PVC를 생성합니다.
NFS 스토리지를 사용하는 경우 OpenShift Container Platform 설치 프로그램은 openshift_logging_storage_*
매개 변수를 기반으로 영구 볼륨을 생성하고 OpenShift Container Platform 로깅 설치 프로그램은 openshift_logging_es_pvc_*
매개변수를 사용하여 PVC를 생성합니다. EFK에서 영구 볼륨을 사용하려면 올바른 매개변수를 지정해야 합니다. 또한 로깅 설치 프로그램에서 코어 인프라를 사용하여 NFS 설치를 차단하므로 Ansible 인벤토리 파일에서 openshift_enable_unsupported_configurations=true
매개 변수를 설정합니다.
Lucene은 NFS가 제공하지 않는 파일 시스템 동작을 사용하므로 NFS 스토리지를 볼륨 또는 영구 볼륨으로 사용하거나 Gluster와 같은 NAS를 사용하는 것은 Elasticsearch 스토리지에서 지원되지 않습니다. 데이터 손상 및 기타 문제가 발생할 수 있습니다.
환경에 NFS 스토리지가 필요한 경우 다음 방법 중 하나를 사용합니다.
36.5.2.1.1. NFS를 영구 볼륨으로 사용
자동으로 프로비저닝된 영구 볼륨 또는 사전 정의된 NFS 볼륨을 사용하여 NFS를 배포할 수 있습니다.
자세한 내용은 두 개의 개별 컨테이너에서 사용하기 위해 공유 스토리지를 활용하기 위해 두 개의 영구 볼륨 클레임에서 NFS 마운트 공유를 참조하십시오.
자동 프로비저닝된 NFS 사용
NFS를 자동으로 프로비저닝하는 영구 볼륨으로 NFS를 사용하려면 다음을 수행합니다.
다음 줄을 Ansible 인벤토리 파일에 추가하여 NFS 자동 프로비저닝 스토리지 클래스를 생성하고 백업 스토리지를 동적으로 프로비저닝합니다.
openshift_logging_es_pvc_storage_class_name=$nfsclass openshift_logging_es_pvc_dynamic=true
다음 명령을 사용하여 로깅 플레이북을 사용하여 NFS 볼륨을 배포합니다.
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-logging/config.yml
다음 단계를 사용하여 PVC를 생성합니다.
Ansible 인벤토리 파일을 편집하여 PVC 크기를 설정합니다.
openshift_logging_es_pvc_size=50Gi
참고로깅 플레이북은 크기를 기반으로 볼륨을 선택하고 다른 영구 볼륨의 크기가 동일한 경우 예기치 않은 볼륨을 사용할 수 있습니다.
다음 명령을 사용하여 Ansible deploy_cluster.yml 플레이북을 다시 실행합니다.
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
설치 프로그램 플레이북은
openshift_logging_storage
변수를 기반으로 NFS 볼륨을 생성합니다.
사전 정의된 NFS 볼륨 사용
기존 NFS 볼륨을 사용하여 OpenShift Container Platform 클러스터와 함께 로깅을 배포하려면 다음을 수행합니다.
Ansible 인벤토리 파일을 편집하여 NFS 볼륨을 구성하고 PVC 크기를 설정합니다.
openshift_logging_storage_kind=nfs openshift_logging_storage_access_modes=['ReadWriteOnce'] openshift_logging_storage_nfs_directory=/share 1 openshift_logging_storage_nfs_options='*(rw,root_squash)' 2 openshift_logging_storage_labels={'storage': 'logging'} openshift_logging_elasticsearch_storage_type=pvc openshift_logging_es_pvc_size=10Gi openshift_logging_es_pvc_storage_class_name='' openshift_logging_es_pvc_dynamic=true openshift_logging_es_pvc_prefix=logging
다음 명령을 사용하여 EFK 스택을 재배포합니다.
ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/deploy_cluster.yml
36.5.2.1.2. NFS를 로컬 스토리지로 사용
NFS 서버에서 대규모 파일을 할당하고 파일을 노드에 마운트할 수 있습니다. 그런 다음 파일을 호스트 경로 장치로 사용할 수 있습니다.
$ mount -F nfs nfserver:/nfs/storage/elasticsearch-1 /usr/local/es-storage $ chown 1000:1000 /usr/local/es-storage
그런 다음 아래 설명된 대로 /usr/local/es-storage 를 호스트 마운트로 사용합니다. 다른 백업 파일을 Elasticsearch 노드의 스토리지로 사용합니다.
이 루프백은 노드의 OpenShift Container Platform 외부에서 수동으로 유지 관리해야 합니다. 컨테이너 내부에서 유지 관리해서는 안 됩니다.
각 노드 호스트에서 로컬 디스크 볼륨(사용 가능한 경우)을 Elasticsearch 복제본의 스토리지로 사용할 수 있습니다. 이 작업을 수행하려면 다음과 같이 몇 가지 준비가 필요합니다.
관련 서비스 계정에 로컬 볼륨을 마운트하고 편집할 수 있는 권한이 있어야 합니다.
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-logging:aggregated-logging-elasticsearch
참고이전 버전의 OpenShift Container Platform에서 업그레이드한 경우 로깅
프로젝트에
클러스터 로깅이 설치되었을 수 있습니다. 그에 따라 서비스 계정을 조정해야 합니다.예를 들면 다음과 같은 권한을 클레임하려면 각 Elasticsearch 노드 정의를 패치해야 합니다.
$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc scale $dc --replicas=0 oc patch $dc \ -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged": true}}]}}}}' done
- 로컬 스토리지를 사용하려면 Elasticsearch 복제본이 올바른 노드에 있어야 하며 해당 노드가 일정 기간 동안 중단되어도 이동하지 않아야 합니다. 이를 위해서는 각 Elasticsearch 복제본에 관리자가 스토리지를 할당한 노드에 고유한 노드 선택기를 제공해야 합니다. 노드 선택기를 구성하려면 각 Elasticsearch 배포 구성을 편집하여 nodeSelector 섹션을 추가하거나 편집하여 원하는 각 노드에 적용한 고유한 라벨을 지정합니다.
apiVersion: v1
kind: DeploymentConfig
spec:
template:
spec:
nodeSelector:
logging-es-node: "1" 1
- 1
- 이 레이블은 해당 레이블이 있는 단일 노드(이 경우
logging-es-node=1
)를 통해 복제본을 고유하게 식별해야 합니다.- 각 필수 노드에 대한 노드 선택기를 생성합니다.
-
oc label
명령을 사용하여 필요한 수의 노드에 레이블을 적용합니다.
예를 들어 배포에 세 개의 인프라 노드가 있는 경우 다음과 같이 해당 노드의 레이블을 추가할 수 있습니다.
$ oc label node <nodename1> logging-es-node=0 $ oc label node <nodename2> logging-es-node=1 $ oc label node <nodename3> logging-es-node=2
노드에 라벨을 추가하는 방법에 대한 자세한 내용은 노드의 라벨 업데이트를 참조하십시오.
노드 선택기를 자동으로 적용하려면 oc patch
명령을 대신 사용할 수 있습니다.
$ oc patch dc/logging-es-<suffix> \ -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"0"}}}}}'
이러한 단계를 완료하고 나면 각 복제본에 로컬 호스트 마운트를 적용할 수 있습니다. 다음 예제에서는 스토리지가 각 노드의 동일한 경로에 마운트되었다고 가정합니다.
$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc set volume $dc \ --add --overwrite --name=elasticsearch-storage \ --type=hostPath --path=/usr/local/es-storage oc rollout latest $dc oc scale $dc --replicas=1 done
36.5.2.1.3. Elasticsearch의 hostPath 스토리지 구성
Elasticsearch의 hostPath 스토리지를 사용하여 OpenShift Container Platform 클러스터를 프로비저닝할 수 있습니다.
각 노드 호스트에서 로컬 디스크 볼륨을 Elasticsearch 복제본의 스토리지로 사용하려면 다음을 수행합니다.
로컬 Elasticsearch 스토리지의 각 인프라 노드에 로컬 마운트 지점을 생성합니다.
$ mkdir /usr/local/es-storage
Elasticsearch 볼륨에서 파일 시스템을 생성합니다.
$ mkfs.ext4 /dev/xxx
elasticsearch 볼륨을 마운트합니다.
$ mount /dev/xxx /usr/local/es-storage
/etc/fstab
에 다음 행을 추가합니다.$ /dev/xxx /usr/local/es-storage ext4
마운트 지점의 소유권을 변경합니다.
$ chown 1000:1000 /usr/local/es-storage
관련 서비스 계정에 로컬 볼륨을 마운트하고 편집할 권한을 부여합니다.
$ oc adm policy add-scc-to-user privileged \ system:serviceaccount:openshift-logging:aggregated-logging-elasticsearch
참고이전 버전의 OpenShift Container Platform에서 업그레이드한 경우 로깅
프로젝트에
클러스터 로깅이 설치되었을 수 있습니다. 그에 따라 서비스 계정을 조정해야 합니다.권한을 요청하려면 예제에 표시된 대로 Ops 클러스터에
--selector 구성 요소=es-ops
를 지정하는 각 Elasticsearch 복제본 정의를 패치합니다.$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc scale $dc --replicas=0 oc patch $dc \ -p '{"spec":{"template":{"spec":{"containers":[{"name":"elasticsearch","securityContext":{"privileged": true}}]}}}}' done
올바른 노드에서 Elasticsearch 복제본을 찾아 로컬 스토리지를 사용하고 해당 노드가 일정 시간 동안 중단되는 경우에도 해당 복제본을 이동하지 않습니다. 노드 위치를 지정하려면 각 Elasticsearch 복제본에 관리자가 스토리지를 할당한 노드에 고유한 노드 선택기를 지정합니다.
노드 선택기를 구성하려면 각 Elasticsearch 배포 구성을 편집하거나
nodeSelector
섹션을 추가하거나 편집하여 원하는 각 노드에 적용한 고유한 라벨을 지정합니다.apiVersion: v1 kind: DeploymentConfig spec: template: spec: nodeSelector: logging-es-node: "1"
레이블은 해당 레이블이 있는 단일 노드(이 경우
logging-es-node=1
)를 통해 복제본을 고유하게 식별해야 합니다.각 필수 노드에 대한 노드 선택기를 생성합니다.
oc label
명령을 사용하여 필요한 수의 노드에 레이블을 적용합니다.예를 들어 배포에 세 개의 인프라 노드가 있는 경우 다음과 같이 해당 노드의 레이블을 추가할 수 있습니다.
$ oc label node <nodename1> logging-es-node=0 $ oc label node <nodename2> logging-es-node=1 $ oc label node <nodename3> logging-es-node=2
노드 선택기의 애플리케이션을 자동화하려면 다음과 같이
oc
명령을 사용합니다.label 명령 대신 oc
patch$ oc patch dc/logging-es-<suffix> \ -p '{"spec":{"template":{"spec":{"nodeSelector":{"logging-es-node":"1"}}}}}'
이러한 단계를 완료하고 나면 각 복제본에 로컬 호스트 마운트를 적용할 수 있습니다. 다음 예제에서는 스토리지가 각 노드의 동일한 경로에 마운트된 것으로 가정하고 Ops 클러스터에 대해
--selector component=es-ops
를 지정합니다.$ for dc in $(oc get deploymentconfig --selector component=es -o name); do oc set volume $dc \ --add --overwrite --name=elasticsearch-storage \ --type=hostPath --path=/usr/local/es-storage oc rollout latest $dc oc scale $dc --replicas=1 done
36.5.2.1.4. Elasticsearch의 규모 변경
클러스터에서 Elasticsearch 노드 수를 확장해야 하는 경우 추가할 각 Elasticsearch 노드에 대한 배포 구성을 생성할 수 있습니다.
영구 볼륨의 특성과 Elasticsearch가 해당 데이터를 저장하고 클러스터를 복구하도록 구성된 방식 때문에 Elasticsearch 배포 구성에서 노드를 간단하게 늘릴 수 없습니다.
Elasticsearch의 규모를 변경하는 가장 간단한 방법은 인벤토리 호스트 파일을 수정하고 이전에 설명한 대로 로깅 플레이북을 다시 실행하는 것입니다. 배포를 위해 영구 스토리지를 제공한 경우 이 작업을 중단해서는 안 됩니다.
로깅 플레이북을 사용하여 Elasticsearch 클러스터의 크기를 조정하는 것은 새로운 openshift_logging_es_cluster_size
값이 클러스터의 현재 Elasticsearch 노드 수(확장됨)보다 큰 경우에만 가능합니다.
36.5.2.1.5. Elasticsearch 복제본 수 변경
인벤토리 호스트 파일에서 openshift_logging_es_number_of_replicas
값을 편집하고 이전에 설명한 대로 로깅 플레이북을 다시 실행하여 Elasticsearch 복제본의 수를 변경할 수 있습니다.
변경 사항은 새 인덱스에만 적용됩니다. 기존 인덱스는 이전 복제본 수를 계속 사용합니다. 예를 들어 인덱스 수를 3에서 2로 변경하는 경우 클러스터는 새 인덱스에 대해 2개의 복제본과 기존 인덱스의 경우 복제본 3개를 사용합니다.
다음 명령을 실행하여 기존 인덱스의 복제본 수를 수정할 수 있습니다.
$ oc exec -c elasticsearch $pod -- es_util --query=project.* -d '{"index":{"number_of_replicas":"2"}}' 1
- 1
- 기존 인덱스에 사용할 복제본 수를 지정합니다.
36.5.2.1.6. Elasticsearch를 경로로 노출
기본적으로 OpenShift 집계 로깅과 함께 배포된 Elasticsearch는 로깅 클러스터 외부에서 액세스할 수 없습니다. 데이터에 액세스하려는 도구에 대해 Elasticsearch에 대한 외부 액세스에 대한 경로를 활성화할 수 있습니다.
OpenShift 토큰을 사용하여 Elasticsearch에 액세스할 수 있으며 서버 인증서를 생성할 때 외부 Elasticsearch 및 Elasticsearch Ops 호스트 이름을 제공할 수 있습니다( Kibana와 비슷함).
Elasticsearch를 재암호화 경로로 액세스하려면 다음 변수를 정의합니다.
openshift_logging_es_allow_external=True openshift_logging_es_hostname=elasticsearch.example.com
플레이북 디렉터리로 변경하고 다음 Ansible 플레이북을 실행합니다.
$ cd /usr/share/ansible/openshift-ansible $ ansible-playbook [-i </path/to/inventory>] \ playbooks/openshift-logging/config.yml
Elasticsearch에 원격으로 로그인하려면 요청에 세 개의 HTTP 헤더가 포함되어야 합니다.
Authorization: Bearer $token X-Proxy-Remote-User: $username X-Forwarded-For: $ip_address
로그에 액세스하려면 프로젝트에 액세스할 수 있어야 합니다. 예를 들면 다음과 같습니다.
$ oc login <user1> $ oc new-project <user1project> $ oc new-app <httpd-example>
요청에 사용할 이 ServiceAccount의 토큰을 가져와야 합니다.
$ token=$(oc whoami -t)
이전에 구성된 토큰을 사용하여 노출된 경로를 통해 Elasticsearch에 액세스할 수 있어야 합니다.
$ curl -k -H "Authorization: Bearer $token" -H "X-Proxy-Remote-User: $(oc whoami)" -H "X-Forwarded-For: 127.0.0.1" https://es.example.test/project.my-project.*/_search?q=level:err | python -mjson.tool