# 2. EFK 스택구축 - Elasticsearch 배포

empty·2020년 12월 30일

EFK-STACK

목록 보기
3/6

Elasticsearch 배포 워크로드

모든 EFK가 배포될 네임스페이스(efk-stack)를 생성하고 상태유지를 위해 Statefulset으로 배포한다.

  • Namespace

    # efk-stack 네임스페이스에 efk 배포예정

  • Statefulset

  • PersistanceVolumeClaim

    # EKS에서 제공하는 블록 스토리지(gp2) 사용

Elasticsearch 배포 (Statefulset)

Elasticsearch는 Fluentd에서 수집된 로그를 여러 파드들이 공유받고 상태값을 유지해야 하기때문에 Deployment가 아닌 Statefulset을 사용하여 배포한다.

*Fluentd와 Kibana는 상태값 유지가 필요없으므로 Deployment로 배포할 예정

매니페스트 정의

> elasticsearch-ss.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: efk-stack
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: shin-es
  namespace: efk-stack
spec:
  serviceName: elasticsearch
  replicas: 3
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      terminationGracePeriodSeconds: 300
      initContainers:
      # Elasticsearch가 사용하는 볼륨에 대한 권한설정 부분.
      - name: fix-the-volume-permission
        image: busybox
        command:
        - sh
        - -c
        - chown -R 1000:1000 /usr/share/elasticsearch/data
        securityContext:
          privileged: true
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
      # 가상 메모리에 관한 설정. 
      # default 값은 '262144' 이다.
      - name: increase-the-vm-max-map-count
        image: busybox
        command:
        - sysctl
        - -w
        - vm.max_map_count=262144
        securityContext:
          privileged: true
      # File Descripto에 관한 설정
      - name: increase-the-ulimit
        image: busybox
        command:
        - sh
        - -c
        - ulimit -n 65536
        securityContext:
          privileged: true
      containers:
      - name: elasticsearch
        image: docker.elastic.co/elasticsearch/elasticsearch:7.10.1
        ports:
        - containerPort: 9200
          name: rest 
          protocol: TCP
        - containerPort: 9300
          name: inter-node
          protocol: TCP
        # 사용자의 인프라 리소스에 맞게 설정한다.
        resources:
          requests:
            cpu: 100m
          limits:
            cpu: 1000m
        env:
          # 사용자가 설정하고 싶은 클러스터 이름을 설정한다.
          - name: cluster.name
            value: k8s-logs
          - name: node.name
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: network.host
            value: "0.0.0.0"
          # Elasticsearch의 노드끼리 통신하기 위한 Discovery 설정
          - name: discovery.seed_hosts
            value: "shin-es-0.elasticsearch,shin-es-1.elasticsearch,shin-es-2.elasticsearch"
          # 명시된 노드들을 대상으로 마스터 노드를 선출한다.
          - name: cluster.initial_master_nodes
            value: "shin-es-0,shin-es-1,shin-es-2"
          # 메모리의 Heap 사이즈 설정
          - name: ES_JAVA_OPTS
            value: "-Xms512m -Xmx512m"
        volumeMounts:
        - name: data
          mountPath: /usr/share/elasticsearch/data
  volumeClaimTemplates:
  - metadata:
      name: data
      labels:
        app: elasticsearch
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: gp2
      # Elasticsearch가 보관가능한 최대 스토리지의 용량크기 설정.
      resources:
        requests:
          storage: 20Gi
---
kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: efk-stack
  labels:
    app: elasticsearch
spec:
  type: ClusterIP
  selector:
    app: elasticsearch
  ports:
    - name: rest
      port: 9200
    - name: inter-node
      port: 9300

배포확인

배포가 되었으면 모든 리소스가 배포되었는지 확인하자.

k get sts -n efk-stack
NAME            READY   AGE
elasticsearch   2/2     15m

> k get pod -n efk-stack
NAME              READY   STATUS    RESTARTS   AGE
elasticsearch-0   1/1     Running   0          14m
elasticsearch-1   1/1     Running   0          14m

> k get pvc -n efk-stack
NAME                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
data-elasticsearch-0   Bound    pvc-134756f9-04f4-400d-82ac-6fbf9f545308   20Gi       RWO            gp2            14m
data-elasticsearch-1   Bound    pvc-20c9a6a2-ace9-420d-8de8-e9d40a9fecc4   20Gi       RWO            gp2            13m

> k get svc -n efk-stack
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)             AGE
elasticsearch   ClusterIP   10.100.187.169   <none>        9200/TCP,9300/TCP   15m

AWS Volume 확인

  • 자동으로 동적 PVC가 할당된 모습이다.

Reference

0개의 댓글