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
}