Kubernetes – Elasticsearch 클러스터 구성하기

By | 2022년 12월 24일
Table of Contents

Kubernetes – Elasticsearch 클러스터 구성하기

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

namespace 생성

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

service 생성

vi elasticsearch-service-discovery.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  namespace: elasticsearch
  name: elasticsearch-discovery
  labels:
    component: elasticsearch
    role: master
spec:
  selector:
    component: elasticsearch
    role: master
  ports:
    - name: transport
      port: 9300
      protocol: TCP
  clusterIP: None
---------------------------
vi elasticsearch-service-ingest.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  namespace: elasticsearch
  name: elasticsearch-ingest
  labels:
    component: elasticsearch
    role: ingest
spec:
  selector:
    component: elasticsearch
    role: ingest
  ports:
    - name: http
      port: 9200
#type: LoadBalancer
---------------------------
vi elasticsearch-service-data.yaml
---------------------------
apiVersion: v1
kind: Service
metadata:
  namespace: elasticsearch
  name: elasticsearch
  labels:
    component: elasticsearch
    role: data
spec:
  selector:
    component: elasticsearch
    role: data
  ports:
    - name: http
      port: 9200
#type: LoadBalancer
---------------------------

master configmap 생성

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

master 생성

vi elasticsearch-master.yaml
---------------------------
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: elasticsearch
  name: elasticsearch-master
  labels:
    component: elasticsearch
    role: master
spec:
  serviceName: "elasticsearch-master"
  selector:
    matchLabels:
      component: elasticsearch
      role: master
  replicas: 3
  template:
    metadata:
      labels:
        component: elasticsearch
        role: master
    spec:
      initContainers:
        - name: fix-permissions
          image: busybox
          command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: storage
              mountPath: /usr/share/elasticsearch/data
        - name: init-sysctl
          image: busybox
          command: ["sh", "-c", "sysctl -w vm.max_map_count=262144"]
          securityContext:
            privileged: true
      containers:
        - name: elasticsearch-master
          image: docker.elastic.co/elasticsearch/elasticsearch:7.17.8
          env:
            - name: CLUSTER_NAME
              value: elasticsearch-cluster
            - name: NODE_LIST
              value: "elasticsearch-discovery"
            - name: "ES_JAVA_OPTS"
              value: "-Xms300m -Xmx300m"
            - name: NODE_MASTER
              value: "true"
            - name: NODE_INGEST
              value: "false"
            - name: NODE_DATA
              value: "false"
          ports:
            - name: http
              containerPort: 9200
            - name: transport
              containerPort: 9300
          livenessProbe:
            tcpSocket:
              port: transport
            initialDelaySeconds: 20
            periodSeconds: 10
          volumeMounts:
            - name: config
              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
              readOnly: true
              subPath: elasticsearch.yml
            - name: storage
              mountPath: /usr/share/elasticsearch/data
            - name: tz-seoul
              mountPath: /etc/localtime
      volumes:
        - name: config
          configMap:
            name: elasticsearch-master-config
        - name: storage
          emptyDir:
            medium: ""
        - name: tz-seoul
          hostPath:
            path: /usr/share/zoneinfo/Asia/Seoul

---------------------------

ingest configmap 생성

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

ingest 생성

vi elasticsearch-ingest.yaml
---------------------------
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: elasticsearch
  name: elasticsearch-ingest
  labels:
    component: elasticsearch
    role: ingest
spec:
  serviceName: "elasticsearch-ingest"
  selector:
    matchLabels:
      component: elasticsearch
      role: ingest
  replicas: 2
  template:
    metadata:
      labels:
        component: elasticsearch
        role: ingest
    spec:
      initContainers:
        - name: fix-permissions
          image: busybox
          command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: storage
              mountPath: /usr/share/elasticsearch/data
        - name: init-sysctl
          image: busybox
          command: ["sh", "-c", "sysctl -w vm.max_map_count=262144"]
          securityContext:
            privileged: true
      containers:
        - name: elasticsearch-ingest
          image: docker.elastic.co/elasticsearch/elasticsearch:7.17.8
          env:
            - name: CLUSTER_NAME
              value: elasticsearch-cluster
            - name: NODE_LIST
              value: "elasticsearch-discovery"
            - name: "ES_JAVA_OPTS"
              value: "-Xms300m -Xmx300m"
            - name: NODE_MASTER
              value: "false"
            - name: NODE_INGEST
              value: "true"
            - name: NODE_DATA
              value: "false"
          ports:
            - name: http
              containerPort: 9200
            - name: transport
              containerPort: 9300
          livenessProbe:
            tcpSocket:
              port: transport
            initialDelaySeconds: 20
            periodSeconds: 10
          volumeMounts:
            - name: config
              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
              readOnly: true
              subPath: elasticsearch.yml
            - name: storage
              mountPath: /usr/share/elasticsearch/data
            - name: tz-seoul
              mountPath: /etc/localtime
      volumes:
        - name: config
          configMap:
            name: elasticsearch-master-config
        - name: storage
          emptyDir:
            medium: ""
        - name: tz-seoul
          hostPath:
            path: /usr/share/zoneinfo/Asia/Seoul
---------------------------

data configmap 생성

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

data 생성

vi elasticsearch-data.yaml
---------------------------
apiVersion: apps/v1
kind: StatefulSet
metadata:
  namespace: elasticsearch
  name: elasticsearch-data
  labels:
    component: elasticsearch
    role: data
spec:
  serviceName: "elasticsearch-data"
  selector:
    matchLabels:
      component: elasticsearch
      role: data
  replicas: 3
  template:
    metadata:
      labels:
        component: elasticsearch
        role: data
    spec:
      initContainers:
        - name: fix-permissions
          image: busybox
          command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
          securityContext:
            privileged: true
          volumeMounts:
            - name: storage
              mountPath: /usr/share/elasticsearch/data
        - name: init-sysctl
          image: busybox
          command: ["sh", "-c", "sysctl -w vm.max_map_count=262144"]
          securityContext:
            privileged: true
      containers:
        - name: elasticsearch-data
          image: docker.elastic.co/elasticsearch/elasticsearch:7.17.8
          env:
            - name: CLUSTER_NAME
              value: elasticsearch-cluster
            - name: NODE_LIST
              value: "elasticsearch-discovery"
            - name: "ES_JAVA_OPTS"
              value: "-Xms300m -Xmx300m"
            - name: NODE_MASTER
              value: "false"
            - name: NODE_INGEST
              value: "false"
            - name: NODE_DATA
              value: "true"
          ports:
            - name: http
              containerPort: 9200
            - name: transport
              containerPort: 9300
          livenessProbe:
            tcpSocket:
              port: transport
            initialDelaySeconds: 20
            periodSeconds: 10
          volumeMounts:
            - name: config
              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
              readOnly: true
              subPath: elasticsearch.yml
            - name: storage
              mountPath: /usr/share/elasticsearch/data
            - name: tz-seoul
              mountPath: /etc/localtime
      volumes:
        - name: config
          configMap:
            name: elasticsearch-data-config
        - name: storage
          emptyDir:
            medium: ""
        - name: tz-seoul
          hostPath:
            path: /usr/share/zoneinfo/Asia/Seoul
---------------------------

설치 및 확인하기

kubectl apply -f elasticsearch-namespace.yaml
kubectl apply -f elasticsearch-service-discovery.yaml
kubectl apply -f elasticsearch-service-ingest.yaml
kubectl apply -f elasticsearch-service-data.yaml
kubectl apply -f elasticsearch-master-config.yaml
kubectl apply -f elasticsearch-master.yaml
kubectl apply -f elasticsearch-ingest-config.yaml
kubectl apply -f elasticsearch-ingest.yaml
kubectl apply -f elasticsearch-data-config.yaml
kubectl apply -f elasticsearch-data.yaml
kubectl get pods -n elasticsearch -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES
elasticsearch-data-0     1/1     Running   0          35m   10.32.0.31   notebook   <none>           <none>
elasticsearch-data-1     1/1     Running   0          33m   10.32.0.32   notebook   <none>           <none>
elasticsearch-data-2     1/1     Running   0          32m   10.32.0.33   notebook   <none>           <none>
elasticsearch-ingest-0   1/1     Running   0          30m   10.32.0.28   notebook   <none>           <none>
elasticsearch-ingest-1   1/1     Running   0          32m   10.32.0.29   notebook   <none>           <none>
elasticsearch-master-0   1/1     Running   0          70m   10.32.0.25   notebook   <none>           <none>
elasticsearch-master-1   1/1     Running   0          72m   10.32.0.26   notebook   <none>           <none>
elasticsearch-master-2   1/1     Running   0          16m   10.32.0.27   notebook   <none>           <none>

kubectl get svc -n elasticsearch -o wide
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE   SELECTOR
elasticsearch             ClusterIP   10.101.44.9     <none>        9200/TCP   15h   component=elasticsearch,role=data
elasticsearch-discovery   ClusterIP   None            <none>        9300/TCP   15h   component=elasticsearch,role=master
elasticsearch-ingest      ClusterIP   10.107.197.61   <none>        9200/TCP   15h   component=elasticsearch,role=ingest
curl http://10.101.44.9:9200/_cluster/health?pretty
{
  "cluster_name" : "elasticsearch-cluster",
  "status" : "green",
  "timed_out" : false,
  "number_of_nodes" : 8,
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 3,
  "active_shards" : 6,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0,
  "task_max_waiting_in_queue_millis" : 0,
  "active_shards_percent_as_number" : 100.0
}

답글 남기기