티스토리 뷰

카테고리 없음

Splunk on Kubernetes 구축

자바바라 2025. 7. 15. 23:17
  1. Splunk Enterprise on Kubernetes: Splunk 서버 자체를 K8s 클러스터에 배포하는 방법. (테스트 또는 소규모 환경에 적합)
  2. 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 접속 정보 확인:

  1. Admin 비밀번호 확인:
    비밀번호를 values.yaml에 지정하지 않았다면, Secret에 자동으로 생성.
    kubectl get secret splunk-enterprise-standalone-secret -n splunk-system -o jsonpath='{.data.password}' | base64 --decode
  2. Splunk Web UI 접속:
    LoadBalancer 타입을 사용했다면 외부 IP 확인.
    kubectl get svc splunk-enterprise-standalone-service -n splunk-system
    출력된 EXTERNAL-IP 주소와 포트 8000 (예: http://<EXTERNAL-IP>:8000)으로 웹 브라우저 접속.
    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를 활성화하고 토큰 생성.

  1. Splunk Web UI 접속 > Settings > Data Inputs
  2. HTTP Event Collector 클릭
  3. Global Settings에서 All TokensEnabled로 설정하고 저장
  4. 오른쪽 위 New Token 클릭
  5. Name: k8s-token (원하는 이름으로 지정)
  6. Source type: _json (SC4K가 JSON 형식으로 보내므로 _json으로 두면 자동 파싱됨)
  7. Index: main 또는 k8s_logs 등 데이터를 저장할 인덱스를 선택 (미리 생성해두는 것이 좋음)
  8. 생성된 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에 적절한 requestslimits를 설정하여 클러스터의 안정성 보장.
  • Splunk App 활용: Splunkbase에는 Splunk App for Infrastructure (SAI)Splunk App for Kubernetes와 같이 미리 만들어진 대시보드와 리포트를 제공하는 앱들이 있다. 이를 설치하면 K8s 환경을 훨씬 쉽게 모니터링할 수 있다.
  • 데이터 필터링: 모든 로그를 수집하는 것이 부담스럽다면, SC4K의 설정을 통해 특정 네임스페이스나 라벨을 가진 Pod의 로그만 수집하도록 필터링할 수 있다. (성능 및 비용 최적화)
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함