diff --git a/infra/apisix.md b/infra/apisix.md index 0d9ce8d..fdf8465 100644 --- a/infra/apisix.md +++ b/infra/apisix.md @@ -5,7 +5,7 @@ updated: 2026-03-26 ## 아키텍처 -서울 K3s 클러스터 구성: 고객 도메인 → [[cloudflare]](DNS) → OpenWrt HAProxy (80/443) → APISIX hostNetwork (9080/9443, 3노드) → K3s 서비스 → pods +서울 K3s 클러스터 구성: 고객 도메인 → [[cloudflare]](DNS) → OpenWrt HAProxy (80/443) → Traefik MetalLB 192.168.9.53 → K3s 서비스 → pods 오사카 구성: 고객 도메인 → [[cloudflare]](DNS) → [[crowdsec-safeline|SafeLine WAF]] → APISIX(라우팅) → 고객 오리진 diff --git a/infra/cert-manager.md b/infra/cert-manager.md index 52dc90d..5ce0b10 100644 --- a/infra/cert-manager.md +++ b/infra/cert-manager.md @@ -1,6 +1,6 @@ --- title: cert-manager SSL 인증서 관리 -updated: 2026-03-12 +updated: 2026-03-26 --- ## 인증 @@ -38,3 +38,26 @@ it.com은 TLD(도메인 레지스트리)이며 kaffa가 소유한 zone이 아님 ## kr 도메인 *.kr.inouter.com → kr1만 + +## K3s cert-manager (Google Trust Services) + +ClusterIssuer: `google-trust-prod`, DNS-01 챌린지 (Cloudflare API). +Secret: `cloudflare-api-token` (cert-manager 네임스페이스). +reflector로 전체 네임스페이스에 TLS 시크릿 자동 복제. + +### 와일드카드 인증서 목록 + +| Certificate | Secret | 도메인 | +|------------|--------|--------| +| wildcard-inouter | wildcard-inouter-tls | *.inouter.com | +| wildcard-anvil-it-com | wildcard-anvil-it-com-tls | *.anvil.it.com | +| wildcard-actions-it-com | wildcard-actions-it-com-tls | *.actions.it.com | +| wildcard-ironclad-it-com | wildcard-ironclad-it-com-tls | *.ironclad.it.com | +| wildcard-keepanker-cv | wildcard-keepanker-cv-tls | *.keepanker.cv | +| wildcard-servidor-it-com | wildcard-servidor-it-com-tls | *.servidor.it.com | +| wildcard-api-inouter | wildcard-api-inouter-tls | *.api.inouter.com | +| wildcard-mcp-inouter | wildcard-mcp-inouter-tls | *.mcp.inouter.com | + +### Traefik Gateway 등록 인증서 + +websecure 리스너에 등록: wildcard-inouter-tls, wildcard-anvil-it-com-tls, wildcard-actions-it-com-tls, wildcard-api-inouter-tls, wildcard-mcp-inouter-tls diff --git a/infra/gateway-api.md b/infra/gateway-api.md index cc88f3a..8d724ea 100644 --- a/infra/gateway-api.md +++ b/infra/gateway-api.md @@ -17,10 +17,10 @@ K3s 메인 라우팅을 Traefik이 담당 (2026-03-25 APISIX에서 전환). ## Traefik 배포 (새 클러스터) - **DaemonSet** (kube-system 네임스페이스) -- hostPort: 80 (HTTP), 443 (HTTPS) +- LoadBalancer 192.168.9.53 (MetalLB, 이전 hostPort 80/443에서 전환) - Gateway API provider 활성화 - TLSStore CRD로 와일드카드 인증서 기본 로드 -- 와일드카드 인증서: *.inouter.com, *.anvil.it.com, *.actions.it.com, *.ironclad.it.com, *.keepanker.com, *.servidor.it.com +- 와일드카드 인증서: *.inouter.com, *.anvil.it.com, *.actions.it.com, *.api.inouter.com, *.mcp.inouter.com ## Gateway diff --git a/infra/metallb.md b/infra/metallb.md index be16cfa..e254645 100644 --- a/infra/metallb.md +++ b/infra/metallb.md @@ -8,6 +8,7 @@ tags: [infra, k3s, metallb, networking] K3s 클러스터에 LoadBalancer 타입 서비스를 제공하는 베어메탈 로드밸런서. NodePort 난립 문제를 해결하기 위해 도입 (2026-03-26). +K3s 내장 ServiceLB(Klipper)는 비활성화 (`--disable servicelb`, kr2/kr1 config.yaml). ## 배포 정보 @@ -28,11 +29,16 @@ NodePort 난립 문제를 해결하기 위해 도입 (2026-03-26). | 192.168.9.50 | apisix-gateway | apisix | 80, 443 | | 192.168.9.51 | sshpiper | sshpiper | 2222 | | 192.168.9.52 | teleport-cluster | teleport | 443 | +| 192.168.9.53 | traefik | kube-system | 80, 443 | + +## DNS 매핑 + +- `k3s.inouter.com` → 192.168.9.53 (Traefik LB, 이전 3노드 IP에서 변경) +- `teleport.inouter.com` → 52.79.45.166 (relay4wd 경유) ## 설정 ```yaml -# IPAddressPool apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: @@ -41,8 +47,7 @@ metadata: spec: addresses: - 192.168.9.50-192.168.9.59 - -# L2Advertisement +--- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: @@ -61,16 +66,16 @@ kubectl get l2advertisement -n metallb-system # L2 광고 확인 kubectl get svc --all-namespaces -o wide | grep LoadBalancer # LB 서비스 목록 ``` -## NodePort → LoadBalancer 이전 기록 (2026-03-26) +## 이전 기록 (2026-03-26) -| Service | Before (NodePort) | After (LoadBalancer) | -|---------|-------------------|---------------------| -| apisix-gateway | 30233, 31137 | 192.168.9.50 (80/443) | -| sshpiper | 31840 | 192.168.9.51 (2222) | -| teleport-cluster | ClusterIP → LB | 192.168.9.52 (443) | -| argocd-server | 30080, 30443 | ClusterIP (Traefik Ingress) | -| anvil/ssh-server | 30023 | ClusterIP (추후 통합) | -| ironclad/ssh-server | 30022 | ClusterIP (추후 통합) | -| ironclad/nginx | 30297 | ClusterIP (추후 Traefik) | +| Service | Before | After | +|---------|--------|-------| +| traefik | hostPort 80/443 | LoadBalancer 192.168.9.53 | +| apisix-gateway | NodePort 30233/31137 | LoadBalancer 192.168.9.50 | +| sshpiper | NodePort 31840 | LoadBalancer 192.168.9.51 | +| teleport-cluster | ClusterIP | LoadBalancer 192.168.9.52 | +| argocd-server | NodePort 30080/30443 | ClusterIP (Traefik Ingress) | +| ironclad/* | NodePort | 삭제 (오사카에서 서빙) | +| anvil/* | NodePort | 삭제 | -HAProxy 백엔드도 NodePort → MetalLB IP로 변경 완료. +HAProxy 백엔드: 3노드 roundrobin → MetalLB IP 단일 엔드포인트로 변경. diff --git a/infra/openwrt.md b/infra/openwrt.md index ad01d88..18db61b 100644 --- a/infra/openwrt.md +++ b/infra/openwrt.md @@ -25,12 +25,12 @@ maxconn: 20000 | Frontend | Port | Backend | 대상 | 용도 | |----------|------|---------|------|------| -| ft_http | :80 | bk_traefik_http | 3노드 :80 roundrobin | Traefik 메인 라우팅 | -| ft_https | :443 | bk_traefik_https | 3노드 :443 roundrobin | Traefik 메인 라우팅 | +| ft_http | :80 | bk_traefik_http | MetalLB 192.168.9.53:80 | Traefik 메인 라우팅 | +| ft_https | :443 | bk_traefik_https | MetalLB 192.168.9.53:443 | Traefik 메인 라우팅 | | ft_apisix_http | :9080 | bk_apisix_http | MetalLB 192.168.9.50:80 | APISIX SafeLine WAF | | ft_apisix_https | :9443 | bk_apisix_https | MetalLB 192.168.9.50:443 | APISIX SafeLine WAF | -백엔드 노드: incus-kr2(192.168.9.135), incus-kr1(192.168.9.214), incus-hp2(192.168.9.134) +백엔드: 전부 MetalLB IP 단일 엔드포인트 (2026-03-26 이전 완료, 이전에는 3노드 roundrobin) ## nftables 방화벽