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"
}