Kubernetes에서 멀티 테넌트 Loki
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에 데이터 소스로 추가하고 테넌트별 로그를 탐색하기 시작하세요.

Tenant filtering screenshots
Setup X-Scope-OrgID – 값을 monitoring으로 설정했습니다.
이제 오직 monitoring 네임스페이스의 로그만 표시됩니다:
Ben Ye에게 큰 감사의 말씀을 전합니다!
GitHub 프로필
유용하셨길 바랍니다. 언제든지 짧은 대화를 나누고 싶다면 LinkedIn이나 Twitter에서 저와 연결해 주세요.

