Kubernetes – Elasticsearch 설치하기

By | 2022년 12월 24일
Table of Contents

Kubernetes – Elasticsearch 설치하기

참조

참조

k8s 에 Elasticsearch 를 설치하는 방법을 설명합니다.

우선은 하나의 노드만 생성하고,
그 노드에서 마스터/데이타 노드 역할을 모두 수행하도록 합니다.

다음으로 3개의 마스터 노드를 생성하고,
N개의 데이타 노드를 생성하는 방법을 설명합니다.

namespace 생성

vi elasticsearch-namespace.yaml
---------------------------
apiVersion: v1
kind: Namespace
metadata:
  name: elasticsearch
---------------------------

configmap 생성

vi elasticsearch-configmap.yaml
---------------------------
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: elasticsearch
  name: elasticsearch-config
  labels:
    app: elasticsearch
    # role: data
data:
  elasticsearch.yml: |-
    cluster.name: ${CLUSTER_NAME}    # 클러스터 이름
    # node.name: ${NODE_NAME}        # 노드 이름
    # discovery.seed_hosts: ${NODE_LIST}               # 노드 리스트
    # cluster.initial_master_nodes: ${MASTER_NODES}    # 마스터 노드
    network.host: 0.0.0.0            # 외부 접근
    # node:                          # 노드 정보 옵션
    #   master: false
    #   data: true
    #   ingest: false
    # xpack.security.enabled: true   # X pack 의 경우 보안설정
    # xpack.monitoring.collection.enabled: true
---------------------------

persistentvolume 생성

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

statefulset 생성

vi elasticsearch-statefulset.yaml
---------------------------
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: elasticsearch
  name: elasticsearch-node
  labels:
    app: elasticsearch
    #role: data
spec:
  serviceName: "elasticsearch"
  selector:
    matchLabels:
      app: elasticsearch
  replicas: 1
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
        - name: elasticsearch
          image: docker.elastic.co/elasticsearch/elasticsearch:7.17.8
          # image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.8.23
          imagePullPolicy: IfNotPresent
          env:
            - name: CLUSTER_NAME
              value: elasticsearch-cluster
            #- name: discovery.seed_hosts
            #  value: "elasticsearch"
            - name: discovery.type
              value: single-node
            - name: "ES_JAVA_OPTS"
              value: "-Xms300m -Xmx300m"
          ports:
            - name: rest
              containerPort: 9200
            - name: transport
              containerPort: 9300
          volumeMounts:
            - name: config
              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
              readOnly: true
              subPath: elasticsearch.yml
            - name: elasticsearch-persistent-storage
              mountPath: /usr/share/elasticsearch/data
            - name: tz-seoul
              mountPath: /etc/localtime
      initContainers:
        - name: fix-permissions
          image: busybox
          command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: elasticsearch-persistent-storage
              mountPath: /usr/share/elasticsearch/data
      volumes:
        - name: config
          configMap:
            name: elasticsearch-config
        - name: tz-seoul
          hostPath:
            path: /usr/share/zoneinfo/Asia/Seoul
  volumeClaimTemplates:
    - metadata:
        name: elasticsearch-persistent-storage
        annotations:
          volume.beta.kubernetes.io/storage-class: "gp2"
      spec:
        accessModes: [ "ReadWriteOnce" ]
        storageClassName: standard
        resources:
          requests:
            storage: 1Gi
---------------------------

service 생성

vi elasticsearch-service.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  namespace: elasticsearch
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  type: ClusterIP
  ports:
    - name: rest
      port: 9200
    - name: transport
      port: 9300
  selector:
    app: elasticsearch
---
kind: Service
apiVersion: v1
metadata:
  namespace: elasticsearch
  name: elasticsearch-nodeport
  labels:
    app: elasticsearch
spec:
  type: NodePort
  ports:
    - nodePort: 30920
      port: 9200
      targetPort: 9200
      protocol: TCP
  selector:
    app: elasticsearch
---------------------------

설치 및 확인하기

kubectl apply -f elasticsearch-namespace.yaml
kubectl apply -f elasticsearch-configmap.yaml
kubectl apply -f elasticsearch-persistentvolume.yaml
kubectl apply -f elasticsearch-statefulset.yaml
kubectl apply -f elasticsearch-service.yaml
kubectl get svc -n elasticsearch
NAME                     TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
elasticsearch            ClusterIP   None            <none>        9200/TCP,9300/TCP   8m52s
elasticsearch-nodeport   NodePort    10.107.47.146   <none>        9200:30920/TCP      11s
curl http://10.107.47.146:9200/
{
  "name" : "elasticsearch-node-0",
  "cluster_name" : "elasticsearch-cluster",
  "cluster_uuid" : "NU-vCCGBTaaEvFpGgtDcMA",
  "version" : {
    "number" : "7.17.8",
    "build_flavor" : "default",
    "build_type" : "docker",
    "build_hash" : "120eabe1c8a0cb2ae87cffc109a5b65d213e9df1",
    "build_date" : "2022-12-02T17:33:09.727072865Z",
    "build_snapshot" : false,
    "lucene_version" : "8.11.1",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

답글 남기기