diff --git a/infra/k3s-ingress-architecture.md b/infra/k3s-ingress-architecture.md new file mode 100644 index 0000000..7f92028 --- /dev/null +++ b/infra/k3s-ingress-architecture.md @@ -0,0 +1,84 @@ +--- +title: K3s 인그레스 아키텍처 +updated: 2026-04-13 +tags: [infra, k3s, traefik, apisix, safeline, ingress] +--- + +## 개요 + +K3s 클러스터에 **2개의 독립 Ingress Controller**가 병렬 운영됨. 역할에 따라 트래픽 경로가 분리됨. + +| Ingress Controller | MetalLB VIP | 용도 | CRD | +|---|---|---|---| +| **Traefik** | 192.168.9.53 | 내부/관리 서비스 (*.inouter.com) | `IngressRoute` (traefik.io/v1alpha1) | +| **APISIX** | 192.168.9.50 | WAF 보호 필요한 외부 노출 서비스 | `ApisixRoute` (apisix.apache.org/v2) | + +## 트래픽 흐름 + +### Traefik 경로 (내부/관리) + +``` +클라이언트 → BunnyCDN (iron-kr) → OpenWrt HAProxy (:80/:443) + → MetalLB 192.168.9.53 → Traefik → K3s Service → Pod +``` + +대상: outline, vault, gitea, portainer, argocd, vector, vlogs 등 inouter.com 도메인 서비스 + +### APISIX 경로 (SafeLine WAF 경유) + +``` +클라이언트 → BunnyCDN (iron-kr-waf) → OpenWrt HAProxy (:9080/:9443) + → MetalLB 192.168.9.50 → APISIX → SafeLine WAF (chaitin-waf 플러그인) + → K3s Service → Pod +``` + +대상: juiceshop.keepanker.cv 등 외부 도메인 서비스. WAF 보호가 필요한 서비스는 APISIX 경로로 라우팅. + +## APISIX + SafeLine 연동 구조 + +APISIX 라우트에 `chaitin-waf` 플러그인을 라우트별로 적용. SafeLine detector가 요청을 검사하고 차단/허용 판단. + +``` +APISIX Pod → safeline-detector:8000 (K3s ClusterIP 10.43.253.244) + → 판단: 허용 → 백엔드 서비스로 전달 + → 판단: 차단 → APISIX가 403 반환 +``` + +- SafeLine tengine(리버스 프록시)은 replica 0으로 비활성화 — APISIX가 리버스 프록시 역할 대체 +- detector만 가동하여 순수 WAF 엔진으로 사용 +- global_rule이 아닌 **라우트별 플러그인**으로 적용 (`plugins.chaitin-waf`) +- SafeLine 관리 UI: `safeline-mgt:1443` + +## 인그레스 리소스 유형 (통일 규칙) + +| 유형 | 사용 여부 | 비고 | +|------|-----------|------| +| `IngressRoute` (Traefik CRD) | ✅ 사용 | Traefik 경로 서비스 | +| `ApisixRoute` (APISIX CRD) | ✅ 사용 | APISIX/WAF 경로 서비스 | +| `Ingress` (표준 K8s) | ❌ 사용 금지 | 통일을 위해 CRD로 전환. ArgoCD가 마지막 Ingress였으나 IngressRoute로 전환 완료 | + +## 구성 요소 상세 + +### Traefik +- K3s 기본 내장 ingress controller +- DaemonSet (3노드) +- TLS: cert-manager wildcard 인증서 (`wildcard-inouter-tls` 등) +- 설정: [[k3s-migration]] 참조 + +### APISIX (K3s 내부) +- Deployment replica 2, etcd StatefulSet 3 replica +- Ingress Controller: `apisix-ingress-controller` (GatewayProxy 모드) +- global_rules: `http-logger` (CrowdSec) + `limit-req` (rate 20, burst 10) +- 상세: [[apisix]] 참조 + +### SafeLine WAF +- detector + database + mgt + luigi + chaos + fvm +- tengine는 replica 0 (APISIX가 대체) +- 상세: [[crowdsec-safeline]] 참조 + +## 관련 문서 + +- [[apisix]] — APISIX 전체 설정 (서울/오사카/relay) +- [[crowdsec-safeline]] — CrowdSec LAPI + SafeLine WAF +- [[cert-manager]] — TLS 인증서 관리 +- [[metallb]] — MetalLB LoadBalancer IP 할당