티스토리 뷰
- Splunk Enterprise on Kubernetes: Splunk 서버 자체를 K8s 클러스터에 배포하는 방법. (테스트 또는 소규모 환경에 적합)
- Splunk Connect for Kubernetes (SC4K): K8s 클러스터의 로그, 메트릭, 이벤트 데이터를 기존 Splunk 서버(On-premise 또는 Cloud)로 보내는 에이전트를 배포하는 방법. (가장 일반적이고 권장되는 방식)
시나리오 선택 가이드
- 모든 것을 K8s 내부에서 해결하고 싶다면? -> Part 1 + Part 2
- 이미 외부에 Splunk 서버(또는 Splunk Cloud)가 있다면? -> Part 2만 진행.
사전 준비 사항
- 실행 중인 Kubernetes 클러스터
- kubectl 커맨드라인 도구
- helm v3+ 패키지 매니저
- (Part 1의 경우) Persistent Volume을 지원하는 Storage Class (예: gp2, nfs, ceph 등)
Part 1: Splunk Enterprise on Kubernetes 구축 (Operator 방식)
Splunk는 Kubernetes 환경을 위해 Operator 패턴을 공식적으로 지원. Operator를 사용하면 Splunk의 설치, 스케일링, 관리 등을 자동화할 수 있다.
1. Helm Repository 추가
Splunk 공식 Helm 레포지토리를 추가.
helm repo add splunk https://splunk.github.io/splunk-operator/
helm repo update
2. Namespace 생성
Splunk 관련 리소스를 격리하기 위한 네임스페이스 생성.
kubectl create namespace splunk-system
3. values.yaml 설정 (Standalone 배포 예시)
가장 중요한 단계입니다. values.yaml 파일을 생성하여 배포 옵션 정의. 여기서는 단일 인스턴스(Standalone)로 배포 예시.
splunk-enterprise-values.yaml 파일을 생성하고 아래 내용 붙여넣기.
# splunk-enterprise-values.yaml
# Splunk Operator 설정
splunk-operator:
# Operator를 위한 설정. 기본값으로도 충분.
enabled: true
# Splunk Enterprise 배포 설정
splunk-enterprise:
enabled: true
# 'standalone'은 단일 인스턴스, 'cluster'는 클러스터 모드
type: standalone
# Splunk 라이선스 파일을 수락
license:
accept: true
# Splunk Admin 계정 비밀번호 설정 (배포 후 Secret에서 확인)
# 비워두면 자동으로 생성됩니다.
# adminPassword: "YourStrongPassword"
# ★★★ 중요: 데이터 영속성을 위한 설정 ★★★
persistence:
# Splunk 데이터를 저장할 볼륨 크기
dataSize: 20Gi
# 사용할 Storage Class 이름 (사용자 환경에 맞게 변경)
# 예: "gp2", "nfs-client", "standard" 등
storageClassName: "gp2"
# 외부 접근을 위한 서비스 설정 (LoadBalancer 또는 Ingress)
service:
type: LoadBalancer # 클라우드 환경이 아닐 경우 NodePort로 변경
port: 8000
# (선택) Ingress를 사용하고 싶을 경우
# ingress:
# enabled: true
# host: splunk.your-domain.com
# path: /
설명:
- type: standalone: 학습 및 테스트용으로 적합한 단일 인스턴스 구성.
- persistence: Splunk의 데이터(인덱스, 설정 등)는 매우 중요하므로 반드시 Persistent Volume 사용. storageClassName을 자신의 K8s 클러스터 환경에 맞게 수정. (kubectl get sc로 확인 가능)
- service.type: LoadBalancer: 클라우드 환경(AWS, GCP, Azure)에서는 외부 IP를 자동으로 할당해주는 LoadBalancer가 편리. On-premise 환경에서는 NodePort 사용.
4. Helm Chart 설치
준비된 values.yaml 파일로 Helm chart 설치.
helm install splunk-enterprise splunk/splunk-enterprise \
-f splunk-enterprise-values.yaml \
-n splunk-system
5. 배포 확인 및 접속
몇 분 후 Pod들이 정상적으로 실행되는지 확인.
# Pod 상태 확인
kubectl get pods -n splunk-system
# NAME READY STATUS RESTARTS AGE
# splunk-enterprise-standalone-0 2/2 Running 0 5m
# splunk-operator-controller-manager-xxxx-yyyy 2/2 Running 0 6m
Splunk 접속 정보 확인:
- Admin 비밀번호 확인:
비밀번호를 values.yaml에 지정하지 않았다면, Secret에 자동으로 생성.kubectl get secret splunk-enterprise-standalone-secret -n splunk-system -o jsonpath='{.data.password}' | base64 --decode - Splunk Web UI 접속:
LoadBalancer 타입을 사용했다면 외부 IP 확인.출력된 EXTERNAL-IP 주소와 포트 8000 (예: http://<EXTERNAL-IP>:8000)으로 웹 브라우저 접속.kubectl get svc splunk-enterprise-standalone-service -n splunk-system
NodePort의 경우, http://<K8S-NODE-IP>:<NODE-PORT> 접속.
Part 2: Splunk Connect for Kubernetes (SC4K) 구축
이제 K8s 클러스터의 데이터를 수집하여 Splunk로 보낼 에이전트(SC4K) 설치.
1. Splunk에서 HEC(HTTP Event Collector) 설정
데이터를 수신하기 위해 Splunk 서버에서 HEC를 활성화하고 토큰 생성.
- Splunk Web UI 접속 > Settings > Data Inputs
- HTTP Event Collector 클릭
- Global Settings에서 All Tokens를 Enabled로 설정하고 저장
- 오른쪽 위 New Token 클릭
- Name: k8s-token (원하는 이름으로 지정)
- Source type: _json (SC4K가 JSON 형식으로 보내므로 _json으로 두면 자동 파싱됨)
- Index: main 또는 k8s_logs 등 데이터를 저장할 인덱스를 선택 (미리 생성해두는 것이 좋음)
- 생성된 HEC Token 값을 복사해둔다.
2. SC4K를 위한 values.yaml 설정
SC4K 배포를 위한 values.yaml 파일을 별도 생성.
sc4k-values.yaml 파일을 생성하고 아래 내용 붙여넣기.
# sc4k-values.yaml
global:
splunk:
hec:
# ★★★ 중요: Splunk HEC 설정 ★★★
# Part 1에서 구축한 Splunk 서버 주소
# K8s 내부 서비스 주소: <service-name>.<namespace>.svc.cluster.local
host: splunk-enterprise-standalone-service.splunk-system.svc.cluster.local
port: 8088
# SSL 사용 여부 (K8s 내부 통신이므로 false로 설정 가능)
# 외부 Splunk Cloud 사용 시에는 true로 설정
protocol: http
# 1단계에서 생성한 HEC 토큰
# !! 주의: 실제 운영 환경에서는 Secret을 사용하세요 !!
token: "YOUR_HEC_TOKEN_HERE"
# (권장) Secret 사용 예시
# token:
# valueFrom:
# secretKeyRef:
# name: splunk-hec-secret
# key: hec_token
# 수집할 데이터 종류 설정
# 로그 수집 설정
logs:
enabled: true
# 메트릭 수집 설정
metrics:
enabled: true
# Splunk 메트릭 인덱스 지정
index: k8s_metrics
# K8s 오브젝트 (Pod, Node 등) 상태 수집 설정
objects:
enabled: true
# 이벤트 수집 간격
interval: 60s
설명:
- global.splunk.hec.host: Splunk 서버 주소.
- Part 1처럼 K8s 내부에 설치했다면: K8s 내부 DNS 주소(splunk-enterprise-standalone-service.splunk-system.svc.cluster.local) 사용.
- 외부 Splunk 서버라면: 해당 서버의 IP 주소 또는 도메인 이름 입력.
- global.splunk.hec.token: 가장 중요. 1단계에서 발급받은 HEC 토큰 입력. 운영 환경에서는 보안을 위해 반드시 Kubernetes Secret에 토큰을 저장하고 참조하도록 설정.
- logs, metrics, objects: 수집할 데이터 종류를 선택할 수 있다. 모두 true로 설정하여 모든 데이터를 수집하는 것을 권장.
3. Helm Chart 설치
SC4K를 위한 Helm 레포지토리는 Splunk Enterprise와 동일.
# SC4K를 위한 별도 네임스페이스 생성
kubectl create namespace splunk-connect
helm install splunk-connect splunk/splunk-connect-for-kubernetes \
-f sc4k-values.yaml \
-n splunk-connect
4. 데이터 수집 확인
잠시 후 SC4K Pod들이 실행되면, Splunk Web UI의 Search & Reporting 앱으로 이동하여 데이터가 들어오는지 확인.
Generated splunk-spl
// 모든 로그 데이터 확인
index=main sourcetype="_json"
// K8s 컨테이너 로그 확인
index=main sourcetype="kube:container:*"
// K8s 메트릭 데이터 확인
index=k8s_metrics
// K8s 이벤트 데이터 확인
index=main sourcetype="kube:object:event"
Part 3: 사용법 및 모범 사례 (SPL 쿼리 예시)
이제 수집된 데이터를 활용하는 방법. 아래는 Splunk의 검색 언어(SPL)를 사용한 유용한 쿼리 예시.
1. 특정 Pod의 로그 검색
Generated splunk-spl
# 'my-app-pod-12345' 라는 이름을 가진 Pod의 로그만 필터링
index=main sourcetype="kube:container:*" pod="my-app-pod-12345"
2. 특정 Namespace의 모든 에러 로그 검색
# 'production' 네임스페이스에서 "error" 또는 "failed" 텍스트가 포함된 로그 검색
index=main sourcetype="kube:container:*" kubernetes.namespace_name="production" (error OR failed)
3. 컨테이너 재시작 횟수가 높은 Pod 찾기
# 재시작 횟수를 기준으로 상위 10개 Pod 목록 표시
index=main sourcetype="kube:object:pod"
| stats max(restart_count) as restarts by name, kubernetes.namespace_name
| sort -restarts
| head 10
| table name, kubernetes.namespace_name, restarts
4. 노드별 평균 CPU 사용률 시각화
# 메트릭 인덱스에서 노드별 CPU 사용률을 시간 흐름에 따라 차트로 표시
index=k8s_metrics sourcetype="kube:metrics:node" metric_name="cpu.usage.nanocores"
| timechart avg(value) by kubernetes.node
이 쿼리 결과를 Visualization 탭에서 Line Chart로 변경하면 멋진 그래프가 만들어진다.
5. OOMKilled 이벤트 발생한 Pod 찾기
# 메모리 부족으로 종료된(OOMKilled) Pod 이벤트 검색
index=main sourcetype="kube:object:event" reason="OOMKilled"
| table _time, involvedObject.name, involvedObject.namespace, message
요약
- 인덱스 분리: 로그, 메트릭, 애플리케이션 데이터를 별도의 인덱스에 저장하여 검색 성능을 높이고 데이터 관리 용이하게. (values.yaml에서 인덱스 지정 가능)
- HEC 토큰 보안: values.yaml에 토큰을 직접 하드코딩하지 말고, Kubernetes Secret을 생성하여 참조하는 방식 사용.
- 리소스 할당: SC4K 및 Splunk Enterprise Pod에 적절한 requests와 limits를 설정하여 클러스터의 안정성 보장.
- Splunk App 활용: Splunkbase에는 Splunk App for Infrastructure (SAI)나 Splunk App for Kubernetes와 같이 미리 만들어진 대시보드와 리포트를 제공하는 앱들이 있다. 이를 설치하면 K8s 환경을 훨씬 쉽게 모니터링할 수 있다.
- 데이터 필터링: 모든 로그를 수집하는 것이 부담스럽다면, SC4K의 설정을 통해 특정 네임스페이스나 라벨을 가진 Pod의 로그만 수집하도록 필터링할 수 있다. (성능 및 비용 최적화)
