From ec9df443eb9730b81aaf8357290643f42e858671 Mon Sep 17 00:00:00 2001 From: kappa Date: Wed, 8 Apr 2026 20:39:27 +0900 Subject: [PATCH] =?UTF-8?q?VictoriaLogs=20=EC=8B=A0=EA=B7=9C=20=EB=8F=84?= =?UTF-8?q?=EC=9E=85=20(K3s=20logging=20ns)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 수집 동작 확인 --- infra/victorialogs.md | 136 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 infra/victorialogs.md diff --git a/infra/victorialogs.md b/infra/victorialogs.md new file mode 100644 index 0000000..6e046e5 --- /dev/null +++ b/infra/victorialogs.md @@ -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)