ElasticSearch
| EFK architecture
- Kubernetes 클러스터에서 여러 서비스 및 애플리케이션을 실행할 때 중앙 집중식 클러스터 수준 로깅 스택을 사용하면 Pod에서 생성된 많은 양의 로그 데이터를 빠르게 정렬하고 분석할 수 있습니다. 널리 사용되는 중앙 집중식 로깅 솔루션 중 하나는 E lasticsearch, F luentd 및 K ibana(EFK) 스택입니다.
ElasticSearch란
- 전체 텍스트 및 구조화된 검색과 분석을 허용하는 확장 가능한 실시간 분산 검색 엔진.
- 일반적으로 대용량 로그 데이터를 인덱싱하고 검색하는 데 사용되지만(EFK에서의 역할) 다양한 종류의 문서를 검색하는 데에도 사용할 수 있습니다.
ElasticSearch Index
- 서로 연관되어 있는 문서들의 모음.
- JSON 문서로 데이터를 저장한다.
- 각 문서는 일련의 키(필드나 속성의 이름)와 그에 해당하는 값(문자열, 숫자, 날짜, 배열, 기타 데이터 유형)을 서로 연결한다.
- ElasticSearch는 역 인덱스라고 하는 데이터 구조를 사용하는데, 아주 빠른 풀 텍스트 검색을 할 수 있게 설계된 것이며 역 인덱스는 문서에 나타나는 모든 고유한 단어의 목록을 만들고, 각 단어가 발생하는 모든 문서를 식별한다.
ElasticSearch 설치
- 하나의 노드만 생성하고, 그 노드에서 마스터/데이타 노드 역할을 모두 수행
- 다음으로 3개의 마스터 노드를 생성하고, N개의 데이타 노드를 생성하는 방법 설명
1) Namespace 생성
$ vi elasticsearch-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: efk
2) Secrets 생성
Kubernetes의 Secrets는 암호, 클라우드 액세스 키 또는 인증 토큰과 같은 중요한 데이터를 저장하고 관리하기 위한 기본 소스입니다. 이 정보를 Kubernetes 클러스터 전체에 배포하는 동시에 보호해야 합니다
여기에서는 Kibana 로깅을 보호하기 위해 Elasticsearch 암호에 대한 Secrets 을 생성해 보겠습니다
$ vi elasticsearch-secrets.yaml
apiVersion: v1
kind: Secret
metadata:
name: kibana-password
namespace: efk
type: Opaque
data:
password: cGFzc3dvcmQ=
3) persistentvolume 생성
$ vi elasticsearch-persistentvolume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
namespace: efk
name: elasticsearch-pv
labels:
name: elasticsearch
spec:
storageClassName: standard
capacity:
storage: 1Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
claimRef:
namespace: efk
name: elasticsearch-persistent-storage-elasticsearch-node-0
persistentVolumeReclaimPolicy: Delete
hostPath:
path: /nas/share-data/test/data/es
type: DirectoryOrCreate
4) Statefulset 생성
: Elasticsearch를 StatefulSets로 배포하면 Pod는 특정 순서로 생성 및 삭제되므로 데이터가 손실되지 않습니다. 이는 배포 및 확장 이벤트 중에 데이터가 손실되지 않도록 하는 데 도움이 되므로 Elasticsearch에 특히 유용합니다.
((참고로 PVC(Persistent Volume Claim) 템플릿을 사용하여 StatefulSet를 생성할 때 사용자 지정 스토리지 클래스가 지정되지 않은 경우 기본 스토리지 클래스가 사용됩니다. StatefulSet에서 생성된 PVC에 대해 사용자 정의 스토리지 클래스를 사용하려면 StatefulSet 정의의 volumeClaimTemplates 섹션에서 스토리지 클래스를 지정할 수 있습니다.))
$ vi elasticsearch-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: es-cluster
namespace: kube-logging
spec:
serviceName: elasticsearch
replicas: 3
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
– name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.2.0
resources:
limits:
cpu: 1000m
memory: 2Gi
requests:
cpu: 500m
memory: 1Gi
ports:
– containerPort: 9200
name: rest
protocol: TCP
– containerPort: 9300
name: inter-node
protocol: TCP
volumeMounts:
– name: data
mountPath: /usr/share/elasticsearch/data
env:
– name: cluster.name
value: k8s-logs
– name: node.name
valueFrom:
fieldRef:
fieldPath: metadata.name
– name: discovery.seed_hosts
value: "es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch"
– name: cluster.initial_master_nodes
value: "es-cluster-0,es-cluster-1,es-cluster-2"
– name: network.host
value: "0.0.0.0"
– name: xpack.security.enabled
value: "true"
– name: xpack.monitoring.collection.enabled
value: "true"
– name: ES_JAVA_OPTS
value: "-Xms512m -Xmx512m"
– name: ELASTIC_PASSWORD
valueFrom:
secretKeyRef:
name: kibana-password
key: password
initContainers:
– name: fix-permissions
image: busybox
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"]
securityContext:
privileged: true
volumeMounts:
– name: data
mountPath: /usr/share/elasticsearch/data
– name: increase-vm-max-map
image: busybox
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true
– name: increase-fd-ulimit
image: busybox
command: ["sh", "-c", "ulimit -n 65536"]
securityContext:
privileged: true
volumeClaimTemplates:
– metadata:
name: elasticsearch-persistent-storage
annotaion:
volume.beta.kubernetes.io/storage-class: "gp2"
labels:
app: elasticsearch
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: standard
resources:
requests:
storage: 10Gi
5) Service 생성
ElasticSearch Pod 의 DNS 도메인을 정의하는 Kubernetes 헤드리스 서비스인 Elasticsearch를 설정해 보겠습니다. 헤드리스 서비스에는 로드 밸런싱이 없고 정적 IP 주소가 없습니다.
Elasticsearch용 헤드리스 서비스를 만들어 보겠습니다.
$ vi elasticsearch-service.yaml
kind: Service
apiVersion: v1
metadata:
name: elasticsearch
namespace: kube-logging
labels:
app: elasticsearch
spec:
selector:
app: elasticsearch
clusterIP: None
ports:
– port: 9200
name: rest
– port: 9300
name: inter-node
6) 설치 및 확인
$ kubectl apply -f elasticsearch-namespace.yaml
$ kubectl apply -f elasticsearch-secrets.yaml
$ kubectl apply -f elasticsearch-persistentvolume.yaml
$ kubectl apply -f elasticsearch-statefulset.yaml
$ kubectl apply -f elasticsearch-service.yaml
$ kubectl get all -n efk
$ curl http://{host IP}:30920/
참고자료
'개발인생 > Kubernetes' 카테고리의 다른 글
Install) EFK(3) - fluent-bit 설치 (0) | 2023.05.08 |
---|---|
Install) EFK(2) - Kibana 설치 (0) | 2023.05.08 |
install) kubernetes + Harbor (Helm으로 설치) (0) | 2023.02.27 |
install) kubernetes + sonarqube (yaml 파일로 배포하기) (0) | 2023.02.09 |
install) kubernetes + jenkins (yaml 파일로 배포하기) (0) | 2023.02.09 |