k8s 1.30이상에서 Elasticsearch과 Kibana 8.x 설치
k8s 1.30으로 업그레이드 되면서 elastic에서 제공하는 helm chart도 많은 변화가 있습니다.
이 가이드에서는 최신 버전(2024.10월 현재 8.15.3)의 Elasticsearch와 Kibana를
bitnami helm chart를 이용하여 k8s 1.30 클러스터에 설치하는 방법을 다룹니다.
엘라스틱 서치 헬름 저장소 추가
아래와 같이 Bitnami 헬름 차트 저장소를 추가 하고 차트 리스트를 업데이트 합니다.
[root@osboxes ~]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories
[root@osboxes ~]# helm repo update
엘라스틱 서치의 헬름 차트명과 버전을 찾습니다.
ubuntu@bastion:~$ helm search repo elasticsearch
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/elasticsearch 21.3.20 8.15.2 Elasticsearch is a distributed search and analy...
설치 Config파일 작성
작업 디렉토리를 만들고 이동 합니다.
[root@osboxes ~]# mkdir -p ~/install/efk && cd ~/install/efk
설치를 위한 환경설정 파일을 만듭니다. elasticsearch.yaml이라는 이름으로 만들었다고 가정하고 설명하겠습니다.
아래 sample을 이용하여 본인의 상황에 맞게 적절히 변경하십시오.
최대한 자세한 주석을 달았으니 참고하십시오.
아래는 반드시 변경해야 할 설정입니다.
- storageClass: k get sc 명령어로 확인
- security.elasticPassword: elastic 유저의 암호를 지정. 이 암호로 초기 암호가 생성됨
- ingress.hostname: 본인이 원하는 Elasticsearch Host. IP는 지정 불가능함
- 환경변수 'KIBANA_SERVER_PUBLICBASEURL': 본인이 원하는 Kibana Host. IP는 지정 불가능
- kibana.elasticsearch.security.auth.kibanaPassword: kibana_system 유저의 암호. 이후 과정에서 이 암호로 지정해야 함
- kibana.ingress.hostname: 본인이 원하는 Kibana Host로서 위 환경변수 'KIBANA_SERVER_PUBLICBASEURL'와 동일하게 지정해야 함
# Elasticsearch 클러스터 이름 설정
clusterName: "elastic"
# 전역 설정
global:
# Kibana 활성화 여부
kibanaEnabled: true
# 마스터 노드 설정
master:
# 마스터 노드 복제본 수
replicaCount: 1
# 마스터 노드의 힙 크기 (메모리)
heapSize: 1048m
# 마스터 노드의 리소스 요청 및 제한
resources:
requests:
cpu: 1 # CPU 요청량
memory: 1Gi # 메모리 요청량
limits:
cpu: 2 # CPU 제한량
memory: 2Gi # 메모리 제한량
# 마스터 노드의 영구 저장소 설정
persistence:
enabled: true # 영구 저장소 활성화
storageClass: "nfs-retain" # 사용할 스토리지 클래스
accessModes:
- ReadWriteOnce # 접근 모드
size: 5Gi # 저장소 크기
# 마스터 노드를 배치할 노드 선택기
nodeSelector:
role: telemetry
# 데이터 노드 설정
# 데이터 노드의 역할:
# - 실제 데이터를 저장하고 관리
# - 인덱싱, 검색, 집계 등의 데이터 관련 작업 수행
# - 클러스터의 주요 워크로드를 처리
# 주의: 데이터 노드는 클러스터의 성능과 안정성에 직접적인 영향을 미치므로,
# 리소스 설정과 복제본 수를 신중히 고려해야 함
data:
# 데이터 노드 복제본 수
replicaCount: 1
# 데이터 노드의 힙 크기 (메모리)
heapSize: 1024m
# 데이터 노드의 리소스 요청 및 제한
resources:
requests:
cpu: 1000m
memory: 2Gi
limits:
cpu: 2000m
memory: 4Gi
# 데이터 노드의 영구 저장소 설정
persistence:
enabled: true
storageClass: "nfs-retain"
accessModes:
- ReadWriteOnce
size: 10Gi
# 코디네이팅 노드 설정
# 코디네이팅 노드의 역할:
# - 클라이언트 요청을 받아 적절한 데이터 노드로 라우팅
# - 검색 결과의 집계 및 정렬 수행
# - 클러스터의 부하를 분산시키고 전체적인 성능 향상에 기여
# 주의: 코디네이팅 노드는 데이터를 저장하지 않으므로 영구 저장소 설정이 불필요함
coordinating:
# 코디네이팅 노드 복제본 수
replicaCount: 1
# 코디네이팅 노드의 힙 크기 (메모리)
heapSize: 512m
# 코디네이팅 노드의 리소스 요청 및 제한
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
# 인제스트 노드 설정
# 인제스트 노드의 역할:
# - 데이터 인덱싱 전 전처리 작업 수행 (예: 데이터 변환, 보강)
# - 복잡한 데이터 처리 파이프라인 실행
# - 데이터 품질 향상 및 일관성 유지에 기여
# 주의: 인제스트 노드는 대량의 데이터 처리 시 중요한 역할을 하므로,
# 데이터 처리량에 따라 리소스와 복제본 수를 적절히 조정해야 함
ingest:
# 인제스트 노드 활성화 여부
enabled: true
# 인제스트 노드 복제본 수
replicaCount: 1
# 인제스트 노드의 힙 크기 (메모리)
heapSize: 512m
# 인제스트 노드의 리소스 요청 및 제한
resources:
requests:
cpu: 500m
memory: 1Gi
limits:
cpu: 1000m
memory: 2Gi
# 인제스트 노드의 영구 저장소 설정
persistence:
enabled: true
storageClass: "nfs-retain"
accessModes:
- ReadWriteOnce
size: 5Gi
# 시스템 설정을 위한 이미지 설정
sysctlImage:
enabled: true
# vm.max_map_count 값을 설정하는 명령어
command: ["sysctl", "-w", "vm.max_map_count=262144"]
# 메트릭스 설정
metrics:
# 메트릭스 수집 활성화
enabled: true
serviceMonitor:
# ServiceMonitor 비활성화 (Prometheus Operator가 없는 경우)
enabled: false
# 공통 서비스 설정
service:
type: ClusterIP
# Elasticsearch Ingress 설정
ingress:
enabled: true
hostname: es.msa.edutdc.com
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: "letsencrypt-prod"
# Ingress에서 백엔드로의 통신 프로토콜을 HTTPS로 지정
# 이는 Ingress 컨트롤러가 Kibana와 통신할 때 HTTPS를 사용하도록 함
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
tls: true
# 보안 설정
security:
# 보안 기능 활성화
enabled: true
# Elastic 사용자의 비밀번호
elasticPassword: "P@ssw0rd$"
tls:
# TLS 인증서 자동 생성
autoGenerated: true
# REST API에 대한 암호화 활성화
restEncryption: true
# Kibana 설정
kibana:
# Kibana에 추가할 환경 변수
extraEnvVars:
- name: KIBANA_SERVER_PUBLICBASEURL
value: "https://kibana.msa.edutdc.com"
# Elasticsearch 연결 설정
elasticsearch:
# 주의: hosts에는 http(s) 프로토콜과 포트 번호를 제외한 마스터 노드의 서비스 주소만 입력
# 예: "elasticsearch-master" (서비스 이름)
# 프로토콜과 포트는 별도로 지정되므로 여기서는 생략해야 함
hosts:
- "elasticsearch"
port: "9200"
security:
auth:
enabled: true
# kibana_system 사용자의 비밀번호
# kibana_system 사용자의 비밀번호
# 주의: 이 비밀번호는 Elasticsearch에서 생성한 실제 kibana_system 사용자의 비밀번호와 일치해야 합니다.
# 비밀번호 설정 방법:
# 1. Elasticsearch 클러스터가 실행 중이고 보안이 활성화된 상태에서 다음 명령을 실행합니다:
# kubectl exec -it elasticsearch-master-0 -- elasticsearch-setup-passwords interactive -Expack.security.http.ssl.verification_mode=certificate
# 2. 프롬프트에 따라 각 기본 사용자(elastic, kibana_system 등)의 비밀번호를 설정합니다.
# 3. kibana_system 사용자의 비밀번호를 메모하고, 아래 kibanaPassword 값으로 사용합니다.
# 4. 이 값을 변경한 후, Kibana deployment를 재시작하여 새 비밀번호를 적용합니다.
kibanaPassword: "P@ssw0rd$"
tls:
enabled: true
verificationMode: certificate
# 기존 TLS 인증서 시크릿 사용
existingSecret: elasticsearch-master-crt
usePemCerts: true
# Kibana Ingress 설정
ingress:
enabled: true
hostname: kibana.msa.edutdc.com
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: "letsencrypt-prod"
# Ingress에서 백엔드로의 통신 프로토콜을 HTTPS로 지정
# 이는 Ingress 컨트롤러가 Kibana와 통신할 때 HTTPS를 사용하도록 함
nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
tls: true
# Kibana를 배치할 노드 선택기
nodeSelector:
role: telemetry
# Kibana의 리소스 요청 및 제한
resources:
requests:
cpu: "300m"
memory: "512Mi"
limits:
cpu: "500m"
memory: "1Gi"
# Kibana 보안 설정
security:
enabled: true
# Kibana TLS 설정
tls:
enabled: true
verificationMode: certificate
existingSecret: elasticsearch-master-crt
usePemCerts: true
특정 노드에 각 Elasticsearch 노드를 설치하려면 nodeSelector를 지정합니다.
node label은 아래와 같이 지정하면 됩니다.
# label 추가
kubectl label nodes node1 role=telemetry
kubectl get nodes --show-label
# label 삭제
kubectl label nodes node1 role-
설치하기
namespace를 만들고 이동합니다.
k create ns efk
kubens efk
helm 명령으로 설치합니다.
helm upgrade elasticsearch -i -f elastic.yaml elastic/elasticsearch
Pod가 실행될때까지 기다립니다.
ubuntu@bastion:~$ k get po
NAME READY STATUS RESTARTS AGE
elasticsearch-coordinating-0 1/1 Running 0 43m
elasticsearch-data-0 1/1 Running 0 43m
elasticsearch-ingest-0 1/1 Running 0 43m
elasticsearch-kibana-596f8fdcbc-87bl4 1/1 Running 0 42m
elasticsearch-master-0 1/1 Running 0 43m
elasticsearch-metrics-85c74dfbdf-mxcr7 1/1 Running 0 95m
kibana_system 유저 암호 지정
아래 명령으로 Elasticsearch의 기본 유저들의 암호를 지정합니다.
특히 kibana_system의 암호는 elasticsearch.yaml에 지정한 kibanaPassword와 반드시 동일해야 합니다.
* 일일이 치지 말고 암호를 클립보드에 복사한 후 붙여넣기 하면 편합니다.
ubuntu@bastion:~$ kubectl exec -it elasticsearch-master-0 -- elasticsearch-setup-passwords interactive -Expack.security.http.ssl.verification_mode=certificate
...
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y
Enter password for [elastic]:
Reenter password for [elastic]:
Enter password for [apm_system]:
Reenter password for [apm_system]:
Enter password for [kibana_system]:
Reenter password for [kibana_system]:
Enter password for [logstash_system]:
Reenter password for [logstash_system]:
Enter password for [beats_system]:
Reenter password for [beats_system]:
Enter password for [remote_monitoring_user]:
Reenter password for [remote_monitoring_user]:
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
테스트
ingress 주소로 Elasticsearch를 로그인 합니다.
id는 elastic이고 암호는 위 elasticsearch.yaml에 지정한 값입니다.
Kibana를 로그인 합니다. ID/PW는 위 Elastic 로그인 id/pw와 동일합니다.
Kibana 기본 환경 설정
1. Index Pattern 작성
Fluent bit가 수집하여 Elasticsearch DB에 저장한 데이터의 index pattern을 생성합니다.
로그인 후 좌측 상단 햄버거 메뉴에서 Management > Stack Management를 클릭하고,
Kibana > Data Views를 선택합니다. 그리고 [Create data view]를 누릅니다.
Name은 적절히 지정하시고, Index Patten은 우측에 있는 Index sources리스트에 있는 것중 입력합니다.
좌측 전체 메뉴에서 'Discover'를 누르면 수집된 로그를 검색하는 화면이 표시됩니다.
2. 로그 보관 정책과 기간 설정
index의 보관 정책 및 기간을 설정합니다.
엘라스틱 서치의 index Lifecycle은 아래와 같이 4단계로 나눌 수 있으며, Hot과 Delete단계는 필수로 지정해야 합니다.
- Hot: 빈번하게 검색 해야할 최신 로그
- Warm: Hot보다 덜 찾는 로그
- Cold: 간헐적으로 찾는 로그
- Delete: 더 이상 필요 없어 삭제할 로그
<주의>
Index 보관 주기를 바꾸지 않으면 기본 설정대로 90일 후에나 로그가 삭제되므로 저장공간이 모자랄 수 있습니다.
</>
❶ Data > Index Lifecycle Policies을 클릭하고 ❷ kibana-reporting을 선택 합니다.
Hot/Warm/Cold/Delete Phase별로 로그 정책과 보관 기간을 설정 합니다.
로그 조회 및 검색 실습
헬스체크때 배포한 ‘probe-httpreq’파드를 이용하여 로그를 조회해 보겠습니다.
아래와 같이 ‘probe-httpreq’ 파드를 재시작 하십시오.
[root@osboxes efk]# kubens ott Context "kubernetes-admin@kubernetes" modified. Active namespace is "ott". [root@osboxes efk]# k rollout restart sts probe-httpreq statefulset.apps/probe-httpreq restarted |
이 파드는 ‘member’서비스를 시작하면서 여러분이 NFS 서버의 ‘/ data/ott/members.properties’파일에 만든 데이터를 콘솔에 표시 합니다.
[root@osboxes efk]# k logs -f probe-httpreq-0 … ondal=온달,남자,hiondal@gmail.com … user1=유저1,여자,user1@gmail.com … user2=유저2,여자,user2@gmail.com |
이 로그가 플루언트디에 의해 수집되어 엘라스틱 서치 DB에 저장될 것이고 키바나에서 검색할 수 있습니다.
키바나의 좌측 상단 햄버거 메뉴를 누르고 ‘Discover’를 클릭 하십시오.
아래와 같이 거의 실시간으로 로그가 수집되는걸 볼 수 있습니다.
상단의 검색 박스에 ‘kubernetes.pod_name : probe-httpreq and user1’이라고 입력하여 검색해 보십시오.
❶ 아래와 같이 수집된 로그에서 검색하여 결과를 하단에 보여 줍니다.
또한 ❷ 자주 사용하는 검색식을 저장하여 나중에 빠르게 로그를 볼 수 있습니다.