본문 바로가기
개발인생/Kubernetes

Install) EFK(1) - ElasticSearch 설치

by DevOps_901126 2023. 5. 4.
반응형

ElasticSearch

 

| EFK architecture

  • Kubernetes 클러스터에서 여러 서비스 및 애플리케이션을 실행할 때 중앙 집중식 클러스터 수준 로깅 스택을 사용하면 Pod에서 생성된 많은 양의 로그 데이터를 빠르게 정렬하고 분석할 수 있습니다. 널리 사용되는 중앙 집중식 로깅 솔루션 중 하나는 E lasticsearch, F luentd 및 K ibana(EFK) 스택입니다.

 

ElasticSearch란

  • 전체 텍스트 및 구조화된 검색과 분석을 허용하는 확장 가능한 실시간 분산 검색 엔진.
  • 일반적으로 대용량 로그 데이터를 인덱싱하고 검색하는 데 사용되지만(EFK에서의 역할) 다양한 종류의 문서를 검색하는 데에도 사용할 수 있습니다.

 

ElasticSearch Index

  • 서로 연관되어 있는 문서들의 모음.
  • JSON 문서로 데이터를 저장한다.
  • 각 문서는 일련의 키(필드나 속성의 이름)와 그에 해당하는 값(문자열, 숫자, 날짜, 배열, 기타 데이터 유형)을 서로 연결한다.
  • ElasticSearch는 역 인덱스라고 하는 데이터 구조를 사용하는데, 아주 빠른 풀 텍스트 검색을 할 수 있게 설계된 것이며 역 인덱스는 문서에 나타나는 모든 고유한 단어의 목록을 만들고, 각 단어가 발생하는 모든 문서를 식별한다.

 

ElasticSearch 설치

  • 하나의 노드만 생성하고, 그 노드에서 마스터/데이타 노드 역할을 모두 수행
  • 다음으로 3개의 마스터 노드를 생성하고, N개의 데이타 노드를 생성하는 방법 설명

 

1) Namespace 생성

$ vi elasticsearch-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: efk

 

2) Secrets 생성

Kubernetes의 Secrets는 암호, 클라우드 액세스 키 또는 인증 토큰과 같은 중요한 데이터를 저장하고 관리하기 위한 기본 소스입니다. 이 정보를 Kubernetes 클러스터 전체에 배포하는 동시에 보호해야 합니다

여기에서는 Kibana 로깅을 보호하기 위해 Elasticsearch 암호에 대한 Secrets 을 생성해 보겠습니다

$ vi elasticsearch-secrets.yaml

apiVersion: v1
kind: Secret
metadata:
  name: kibana-password
  namespace: efk
type: Opaque
data:
  password: cGFzc3dvcmQ=

 

3) persistentvolume 생성

$ vi elasticsearch-persistentvolume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  namespace: efk
  name: elasticsearch-pv
  labels:
    name: elasticsearch
spec:
  storageClassName: standard
  capacity:
    storage: 1Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  claimRef:
    namespace: efk
    name: elasticsearch-persistent-storage-elasticsearch-node-0
  persistentVolumeReclaimPolicy: Delete
  hostPath:
    path: /nas/share-data/test/data/es
    type: DirectoryOrCreate

 

4) Statefulset 생성

: Elasticsearch를 StatefulSets로 배포하면  Pod는 특정 순서로 생성 및 삭제되므로 데이터가 손실되지 않습니다. 이는 배포 및 확장 이벤트 중에 데이터가 손실되지 않도록 하는 데 도움이 되므로 Elasticsearch에 특히 유용합니다.

((참고로 PVC(Persistent Volume Claim) 템플릿을 사용하여 StatefulSet를 생성할 때 사용자 지정 스토리지 클래스가 지정되지 않은 경우 기본 스토리지 클래스가 사용됩니다. StatefulSet에서 생성된 PVC에 대해 사용자 정의 스토리지 클래스를 사용하려면 StatefulSet 정의의 volumeClaimTemplates 섹션에서 스토리지 클래스를 지정할 수 있습니다.))

 

$ vi elasticsearch-statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: es-cluster
  namespace: kube-logging
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      – name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
        resources:
            limits:
              cpu: 1000m
              memory: 2Gi
            requests:
              cpu: 500m
              memory: 1Gi
        ports:
        – containerPort: 9200
          name: rest
          protocol: TCP
        – containerPort: 9300
          name: inter-node
          protocol: TCP
        volumeMounts:
        – name: data
          mountPath: /usr/share/elasticsearch/data
        env:
          – name: cluster.name
            value: k8s-logs
          – name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          – name: discovery.seed_hosts
            value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
          – name: cluster.initial_master_nodes
            value: "es-cluster-0,es-cluster-1,es-cluster-2"
          – name: network.host
            value: "0.0.0.0"
          – name: xpack.security.enabled
            value: "true"
          – name: xpack.monitoring.collection.enabled
            value: "true"   
          – name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"   
          – name: ELASTIC_PASSWORD
            valueFrom:
              secretKeyRef:
                name: kibana-password
                key: password     
      initContainers:
      – name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
        securityContext:
          privileged: true
        volumeMounts:
        – name: data
          mountPath: /usr/share/elasticsearch/data
      – name: increase-vm-max-map
        image: busybox
        command: ["sysctl", "-w", "vm.max_map_count=262144"]
        securityContext:
          privileged: true
      – name: increase-fd-ulimit
        image: busybox
        command: ["sh", "-c", "ulimit -n 65536"]
        securityContext:
          privileged: true
  volumeClaimTemplates:
  – metadata:
      name: elasticsearch-persistent-storage
      annotaion: 
      	volume.beta.kubernetes.io/storage-class: "gp2"
      labels:
        app: elasticsearch
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName:  standard
      resources:
        requests:
          storage: 10Gi

 

5) Service 생성

ElasticSearch Pod 의 DNS 도메인을 정의하는 Kubernetes 헤드리스 서비스인 Elasticsearch를 설정해 보겠습니다. 헤드리스 서비스에는 로드 밸런싱이 없고 정적 IP 주소가 없습니다.

Elasticsearch용 헤드리스 서비스를 만들어 보겠습니다.

 

$ vi elasticsearch-service.yaml

kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: kube-logging
  labels:
    app: elasticsearch
spec:
  selector:
    app: elasticsearch
  clusterIP: None
  ports:
    – port: 9200
      name: rest
    – port: 9300
      name: inter-node

 

6) 설치 및 확인

$ kubectl apply -f elasticsearch-namespace.yaml

$ kubectl apply -f elasticsearch-secrets.yaml

$ kubectl apply -f elasticsearch-persistentvolume.yaml

$ kubectl apply -f elasticsearch-statefulset.yaml

$ kubectl apply -f elasticsearch-service.yaml

 

$ kubectl get all -n efk

$ curl http://{host IP}:30920/

 

참고자료

반응형