Kubernetes에서 멀티 테넌트 Loki

발행: (2025년 12월 18일 오전 01:44 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

Loki란?

Loki는 Prometheus에서 영감을 받은 수평 확장 가능하고 고가용성의 멀티‑테넌트 로그 집계 시스템입니다.

Loki를 처음 사용한다면 공식 문서를 확인하세요:
Loki Docs

필요한 것들

  • Loki 배포 (Helm을 통한 SimpleScalable 모드)
  • Promtail
  • 객체 저장소용 S3‑호환 버킷 (object storage)

Loki 설정 (SimpleScalable + S3 스토리지)

배포는 객체 스토리지를 사용하므로, 로그를 저장할 S3 호환 버킷과 해당 자격 증명이 필요합니다.

Helm 차트 구조

loki-helm-chart/
├── templates/
│   └── loki-secrets.yaml
├── Chart.yaml
└── values.yaml

loki-secrets.yaml – S3 자격 증명

apiVersion: v1
kind: Secret
metadata:
  name: loki-s3-credentials
  namespace: monitoring
type: Opaque
stringData:
  AWS_ACCESS_KEY_ID: ""
  AWS_SECRET_ACCESS_KEY: ""

values.yaml – Loki 구성

deploymentMode: SimpleScalable

loki:
  auth_enabled: true

  extraEnvFrom:
    - secretRef:
        name: loki-s3-credentials

  schemaConfig:
    configs:
      - from: "2024-04-01"
        store: tsdb
        object_store: s3
        schema: v13
        index:
          prefix: loki_index_
          period: 24h

  storage_config:
    tsdb_shipper:
      index_gateway_client:
        server_address: '{{ include "loki.indexGatewayAddress" . }}'

  storage:
    type: s3
    s3:
      endpoint: rook-ceph-rgw-store.rook-ceph.svc.cluster.local:80
      s3ForcePathStyle: true
      insecure: true

    bucketNames:
      chunks: loki-logs
      ruler: loki-ruler
      admin: loki-admin

  commonConfig:
    replication_factor: 3

  ingester:
    chunk_encoding: snappy

  querier:
    multi_tenant_queries_enabled: true
    max_concurrent: 4

  pattern_ingester:
    enabled: true

  limits_config:
    allow_structured_metadata: true
    volume_enabled: true

중요 참고 사항

  • auth_enabled: true는 Loki가 다중 테넌시를 위해 테넌트 식별자(X‑Scope‑OrgID)를 기대하도록 설정합니다.
  • 보존은 Compactor에 의해 수행됩니다. 여기서 보존이 활성화되지 않으면 retention_period를 설정했더라도 로그가 영원히 남을 수 있습니다.

로컬 상태를 위한 남은 값 (PVCs for local state)

Loki 구성 요소는 여전히 WAL, 캐시 및 작업 상태를 위한 로컬 디스크가 필요하므로 read/write/backend 파드에서 PVC를 확인할 수 있습니다.

Note: ceph-block은 우리의 확장 가능한 스토리지 클래스입니다.

backend:
  replicas: 2
  persistence:
    enabled: true
    size: 2Gi
    storageClass: ceph-block
    accessModes:
      - ReadWriteOnce
  extraEnvFrom:
    - secretRef:
        name: loki-s3-credentials

write:
  replicas: 3
  persistence:
    enabled: true
    size: 2Gi
    storageClass: ceph-block
    accessModes:
      - ReadWriteOnce
  extraEnvFrom:
    - secretRef:
        name: loki-s3-credentials

read:
  replicas: 2
  extraEnvFrom:
    - secretRef:
        name: loki-s3-credentials

게이트웨이 구성 (무엇을 하고 무엇을 하지 않는가)

gateway:
  nginx:
    customHeaders:
      - name: X-Scope-OrgID
        value: $http_x_scope_orgid
  • 이는 격리를 강제하지 않으며; 호출자가 제공하는 테넌트 헤더를 그대로 전달합니다.
  • Grafana 문서에서는 X‑Scope‑OrgID인증된 리버스 프록시가 설정하도록 권장하고 있어, 사용자가 다른 테넌트를 가장할 수 없게 합니다.

내 설정에서는 클라이언트가 Loki에 직접 접근하지 않습니다. 클러스터 내부에서 실행되는 Promtail만 로그를 푸시하고, 나는 테넌트 매핑을 제어하므로 이 헤더를 전달하는 것이 허용됩니다.

Promtail 설정

Promtail은 각 노드에서 실행되며 컨테이너 로그를 Loki로 전송합니다.

daemonset:
  enabled: true
deployment:
  enabled: false

config:
  clients:
    - url: http://loki-gateway.monitoring.svc.cluster.local:80/loki/api/v1/push
      timeout: 60s
      batchwait: 1s
      batchsize: 1048576

  serverPort: 3101

테넌트를 올바르게 설정하기

Kubernetes 네임스페이스를 namespace 라벨로 사용합니다:

snippets:
  common:
    - action: replace
      source_labels: [__meta_kubernetes_namespace]
      target_label: namespace

그 다음 파이프라인에서 해당 라벨을 사용해 테넌트를 설정합니다:

snippets:
  pipelineStages:
    - cri: {}
    - tenant:
        label: namespace

이렇게 하면 멀티‑테넌트 Loki 설정이 완료됩니다!

Grafana에 Loki를 데이터 소스로 추가하기

Loki가 실행 중이면 Grafana에 데이터 소스로 추가하고 테넌트별 로그를 탐색하기 시작하세요.

Grafana dashboard

Tenant filtering screenshots

Setup X-Scope-OrgID – 값을 monitoring으로 설정했습니다.

Grafana 대시보드 – monitoring 네임스페이스

이제 오직 monitoring 네임스페이스의 로그만 표시됩니다:

Grafana 대시보드 – 필터링된 로그

Ben Ye에게 큰 감사의 말씀을 전합니다!
GitHub 프로필

유용하셨길 바랍니다. 언제든지 짧은 대화를 나누고 싶다면 LinkedIn이나 Twitter에서 저와 연결해 주세요.

Back to Blog

관련 글

더 보기 »

창고 활용에 대한 종합 가이드

소개 창고는 근본적으로 3‑D 박스일 뿐입니다. Utilisation은 실제로 그 박스를 얼마나 사용하고 있는지를 측정하는 지표입니다. While logistics c...