VictoriaLogs 신규 도입 (K3s logging ns)
- victoria-logs-single 0.11.31 helm chart 설치 (단일 노드, longhorn 50GiB, 14d retention) - vl.inouter.com Cloudflare CNAME → k3s.inouter.com (LAN 직접, BunnyCDN 우회) - Traefik IngressRoute (logging ns, wildcard-inouter-tls) - Vector daemonset에 APISIX log source 추가, parse_apisix transform, vlogs elasticsearch sink - 1800+ APISIX access log row 수집 동작 확인
This commit is contained in:
136
infra/victorialogs.md
Normal file
136
infra/victorialogs.md
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
---
|
||||||
|
title: VictoriaLogs (K3s 로그 저장)
|
||||||
|
updated: 2026-04-08
|
||||||
|
tags: [k3s, logging, vector, observability]
|
||||||
|
---
|
||||||
|
|
||||||
|
# VictoriaLogs
|
||||||
|
|
||||||
|
K3s 클러스터의 raw 로그 저장소. 메트릭은 [[victoriametrics-stack|VictoriaMetrics]], 로그는 VictoriaLogs로 분리. 같은 VM 팀 제품이라 운영 패턴 일치.
|
||||||
|
|
||||||
|
## 접속
|
||||||
|
|
||||||
|
| 항목 | 값 |
|
||||||
|
|------|------|
|
||||||
|
| Web UI | https://vl.inouter.com/select/vmui/ |
|
||||||
|
| HTTP API | https://vl.inouter.com/ |
|
||||||
|
| 클러스터 내부 | http://vlogs-victoria-logs-single-server.logging.svc.cluster.local:9428 |
|
||||||
|
| 노출 방식 | LAN 직접 (Cloudflare DNS → k3s.inouter.com → MetalLB 192.168.9.53 → Traefik IngressRoute), BunnyCDN 우회 |
|
||||||
|
| TLS | wildcard-inouter-tls (reflector로 logging ns에 자동 복제) |
|
||||||
|
| 인증 | 없음 (LAN/Tailscale 안에서만 접근 가능) |
|
||||||
|
|
||||||
|
## 설치
|
||||||
|
|
||||||
|
```bash
|
||||||
|
helm repo add vm https://victoriametrics.github.io/helm-charts/
|
||||||
|
helm install vlogs vm/victoria-logs-single -n logging -f vlogs-values.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
values 핵심:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
server:
|
||||||
|
retentionPeriod: 14d
|
||||||
|
persistentVolume:
|
||||||
|
enabled: true
|
||||||
|
storageClassName: longhorn
|
||||||
|
size: 50Gi
|
||||||
|
resources:
|
||||||
|
requests: { cpu: 100m, memory: 256Mi }
|
||||||
|
limits: { cpu: 1000m, memory: 1Gi }
|
||||||
|
```
|
||||||
|
|
||||||
|
- 단일 노드 (`victoria-logs-single`), 14일 보존, longhorn 50GiB PVC
|
||||||
|
- 네임스페이스: `logging` (Vector와 같은 곳)
|
||||||
|
|
||||||
|
## Traefik IngressRoute
|
||||||
|
|
||||||
|
`logging` ns:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
apiVersion: traefik.io/v1alpha1
|
||||||
|
kind: IngressRoute
|
||||||
|
metadata:
|
||||||
|
name: vlogs
|
||||||
|
namespace: logging
|
||||||
|
spec:
|
||||||
|
entryPoints: [websecure]
|
||||||
|
routes:
|
||||||
|
- match: Host(`vl.inouter.com`)
|
||||||
|
kind: Rule
|
||||||
|
services:
|
||||||
|
- name: vlogs-victoria-logs-single-server
|
||||||
|
port: 9428
|
||||||
|
tls:
|
||||||
|
secretName: wildcard-inouter-tls
|
||||||
|
```
|
||||||
|
|
||||||
|
## 데이터 파이프라인
|
||||||
|
|
||||||
|
### APISIX 로그 (현재 가동 중)
|
||||||
|
|
||||||
|
```
|
||||||
|
APISIX (apisix ns, 2 replica) stdout (nginx access log 형식)
|
||||||
|
→ Vector daemonset (logging ns, 3 노드)
|
||||||
|
- source: apisix_logs (kubernetes_logs, label=app.kubernetes.io/name=apisix)
|
||||||
|
- transform: parse_apisix (정규식 파싱 → method/path/status/request_time/host/UA 등 구조화)
|
||||||
|
- sink: vlogs (elasticsearch bulk API)
|
||||||
|
→ VictoriaLogs (/insert/elasticsearch/_bulk)
|
||||||
|
```
|
||||||
|
|
||||||
|
Vector helm values는 [[vector|vector]] 문서 또는 `helm get values vector -n logging` 참조.
|
||||||
|
|
||||||
|
### 다른 잠재 source
|
||||||
|
|
||||||
|
- Traefik 로그는 별도 sink로 [[crowdsec-safeline|CrowdSec]]에 전송 (vector의 다른 transform/sink). VictoriaLogs로는 안 보내고 있음. 필요하면 sink inputs에 `parse_traefik` 추가하면 됨.
|
||||||
|
|
||||||
|
## LogsQL 쿼리 예시
|
||||||
|
|
||||||
|
```logsql
|
||||||
|
# 모든 APISIX 로그
|
||||||
|
program:apisix
|
||||||
|
|
||||||
|
# 5xx 에러만
|
||||||
|
program:apisix status:>=500
|
||||||
|
|
||||||
|
# 특정 path
|
||||||
|
program:apisix path:/apisix/admin/routes
|
||||||
|
|
||||||
|
# 느린 요청 (1초 이상)
|
||||||
|
program:apisix request_time:>1.0
|
||||||
|
|
||||||
|
# 특정 IP
|
||||||
|
program:apisix remote_addr:10.42.2.240
|
||||||
|
|
||||||
|
# 특정 노드 pod
|
||||||
|
program:apisix _stream:{kubernetes.pod_name="apisix-58847b6b7c-rdnw6"}
|
||||||
|
```
|
||||||
|
|
||||||
|
UI에서 직접 쿼리하거나 HTTP API:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -s "https://vl.inouter.com/select/logsql/query?query=program:apisix+status:>=500&limit=20"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 운영 명령
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 메트릭 (ingest 통계)
|
||||||
|
curl -s https://vl.inouter.com/metrics | grep vl_rows_ingested_total
|
||||||
|
|
||||||
|
# 디스크 사용량
|
||||||
|
kubectl exec -n logging vlogs-victoria-logs-single-server-0 -- du -sh /storage
|
||||||
|
|
||||||
|
# Vector 상태
|
||||||
|
kubectl logs -n logging -l app.kubernetes.io/name=vector --tail=50
|
||||||
|
|
||||||
|
# Vector configmap 직접 보기
|
||||||
|
kubectl get cm vector -n logging -o jsonpath='{.data.vector\.yaml}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## 향후 작업
|
||||||
|
|
||||||
|
- [ ] Grafana data source 추가 (vm-stack helm upgrade로 `victoriametrics-logs-datasource` plugin 설치)
|
||||||
|
- [ ] CrowdSec와 통합 (APISIX 로그 → CrowdSec 시나리오)
|
||||||
|
- [ ] AI 분석 컴포넌트 (CronJob 또는 streaming, 새 공격 패턴 자동 차단 룰 생성)
|
||||||
|
- [ ] Traefik 로그도 VL로 동시 sink (현재는 CrowdSec only)
|
||||||
Reference in New Issue
Block a user