ElasticSearch on EKS
1. Installation
1.1 Install ElasticSearch on Kubernetes
먼저 다음의 코드로 사전 준비를 합니다.
# 먼저 custom resource definitions 을 설치 합니다.
$ kubectl create -f https://download.elastic.co/downloads/eck/2.1.0/crds.yaml
# RBAC rule을 포함하는 operator를 설치합니다.
$ kubectl apply -f https://download.elastic.co/downloads/eck/2.1.0/operator.yaml
# operator log를 확인합니다.
$ kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
ElasticSearch는 최소 메모리 2GiB가 필요로 하며, 이보다 적을 경우 pod은 pending 상태에서 멈추게 됩니다.
리소스 설정은 링크 를 참조 합니다.
cat <<EOF > elasticsearch.yaml
apiVersion: v1
kind: Namespace
metadata:
name: elasticsearch
---
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: elk
namespace: elasticsearch
spec:
version: 8.1.0
nodeSets:
- name: master
count: 1
config:
xpack.security.enrollment.enabled: true
node.store.allow_mmap: false
node.roles: ["master"]
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: gp2
- name: data
count: 2
config:
node.roles: ["data"]
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 512Gi
storageClassName: gp2
podTemplate:
spec:
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: -Xms8g -Xmx8g
resources:
requests:
memory: 8Gi
cpu: 3.5
limits:
memory: 15Gi
nodeSelector:
node_role: ml-elasticsearch
http:
tls:
selfSignedCertificate:
disabled: true # http service
---
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: elk
namespace: elasticsearch
spec:
version: 8.1.1
count: 1
elasticsearchRef:
name: elk
podTemplate:
spec:
containers:
- name: kibana
env:
- name: NODE_OPTIONS
value: "--max-old-space-size=2048"
resources:
requests:
memory: 2Gi
cpu: 1
limits:
memory: 3.5Gi
cpu: 2
http:
tls:
selfSignedCertificate:
disabled: true
EOF
설치후 확인 합니다.
$ kubectl apply -f elasticsearch.yaml
$ kubectl get elasticsearch -n elasticsearch
NAME HEALTH NODES VERSION PHASE AGE
ml-elasticsearch green 1 8.1.0 Ready 78m
1.2 Access Configuration
ES HTTP 서비스를 확인하고 port-forward를 걸어줍니다.
$ kubectl get service -n elasticsearch elk-es-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elk-es-http ClusterIP 172.20.177.28 <none> 9200/TCP 17m
# 포트 포워드 걸어주기
$ kubectl port-forward -n elasticsearch service/elk-es-http 9200:9200
이후 credentials을 얻고 access 요청을 보냅니다.
$ PASSWORD=$(kubectl get secret elk-es-elastic-user -n elasticsearch -o go-template='{{.data.elastic | base64decode}}')
$ curl -u "elastic:${PASSWORD}" -k "https://localhost:9200" | jq
{
"name" : "elk-es-master-0",
"cluster_name" : "elk",
"cluster_uuid" : "abcdefghijklmnop_UUQQ",
"version" : {
"number" : "8.1.0",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "1234567890abcdef01234567890abcd12345678a",
"build_date" : "2022-03-03T14:20:00.690422633Z",
"build_snapshot" : false,
"lucene_version" : "9.0.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
1.3 Kibana
먼저 Kibana Pod 을 검색합니다.
# 먼저 kibana 를 검색하고 해당 pod을 검색하기 위해서 selector를 검색합니다.
$ kubectl get kibana -n elasticsearch -o yaml | grep selector
selector: common.k8s.elastic.co/type=kibana,kibana.k8s.elastic.co/name=elk
# 해당 selector를 이용해서 kibana에 해당하는 pod 을 검색합니다.
$ kubectl get pod -n elasticsearch --selector='kibana.k8s.elastic.co/name=elk'
NAME READY STATUS RESTARTS AGE
elk-kb-7f984c6b77-xgkfd 1/1 Running 0 9m41s
pod 이 정상적으로 떠있는 것을 확인했으면, Password를 얻고, service로 연결해서 들어갑니다.
# Password 얻기
$ kubectl get secret elk-es-elastic-user -n elasticsearch -o=jsonpath='{.data.elastic}' | base64 --decode; echo
ABCDEFGHIJK12345678902K
# 연결
$ kubectl port-forward -n elasticsearch service/elk-kb-http 5601
http://localhost:5601/ 로 접속을 합니다
접속시 warning이 뜨는데 certificate authority 가 신뢰할수 없어서 그렇습니다.
문제를 해결하기 위해서는 링크 문서를 참조 합니다.
패스워드는 위에서 얻은 password를 사용하고 default username 은 elastic 입니9200 다
1.4 Elastic HQ
좋은 관리 툴 입니다.
# 먼저 port forward 실행
$ kubectl port-forward -n elasticsearch service/elk-es-http 9200:9200
# 다른 터미널에서 Elastic HQ 실행
$ PASSWORD=$(kubectl get secret elk-es-elastic-user -n elasticsearch -o go-template='{{.data.elastic | base64decode}}')
$ docker run -p 5000:5000 \
--name elastic-hq \
--net host \
--restart=always \
-e HQ_DEFAULT_URL="http://elastic:${PASSWORD}@localhost:9200" \
-d elastichq/elasticsearch-hq