refactor: organize infra/ into compute/network/security/data/platform
This commit is contained in:
117
infra/network/gateway-api.md
Normal file
117
infra/network/gateway-api.md
Normal file
@@ -0,0 +1,117 @@
|
||||
---
|
||||
title: K3s Gateway API — Traefik 메인 라우팅
|
||||
updated: 2026-03-25
|
||||
tags: [k3s, traefik, gateway-api]
|
||||
---
|
||||
|
||||
## 개요
|
||||
|
||||
K3s 메인 라우팅을 Traefik이 담당. APISIX는 독립 LoadBalancer(MetalLB VIP 192.168.9.50)로 병렬 운영.
|
||||
|
||||
전환 이력: [[2026-03-25-apisix-to-traefik-routing|history]]
|
||||
|
||||
## Traefik 배포
|
||||
|
||||
- **DaemonSet** (kube-system 네임스페이스)
|
||||
- LoadBalancer 192.168.9.53 (MetalLB)
|
||||
- Gateway API provider 활성화
|
||||
- TLSStore CRD로 와일드카드 인증서 기본 로드
|
||||
- 와일드카드 인증서: *.inouter.com, *.inouter.com, *.actions.it.com, *.api.inouter.com, *.mcp.inouter.com
|
||||
|
||||
## Gateway
|
||||
|
||||
- GatewayClass: `traefik` (traefik.io/gateway-controller)
|
||||
- Gateway: `traefik-gateway` (kube-system)
|
||||
- Listeners: web (HTTP 80) + websecure (HTTPS 443)
|
||||
- TLS: TLSStore로 기본 인증서, Gateway listener에서 추가 인증서 참조
|
||||
- ReferenceGrant: cert-manager → kube-system (Secret 참조 허용)
|
||||
|
||||
## 서비스 상태 (2026-03-25 전환 완료)
|
||||
|
||||
| 서비스 | 도메인 | 상태 |
|
||||
|--------|--------|------|
|
||||
| NocoDB | nocodb.inouter.com | 200 ✅ |
|
||||
| Gitea | gitea.inouter.com | 200 ✅ |
|
||||
| n8n | n8n.inouter.com | 200 ✅ |
|
||||
| ArgoCD | argocd.inouter.com | 200 ✅ |
|
||||
| Grafana | grafana.inouter.com | 302 ✅ |
|
||||
| SearXNG | searxng.inouter.com | 200 ✅ |
|
||||
| SafeLine | safeline.inouter.com | 200 ✅ |
|
||||
| Namecheap API | namecheap.api.inouter.com | 403 ✅ |
|
||||
| Vultr API | vultr.api.inouter.com | 403 ✅ |
|
||||
| OpenMemory | mem0.inouter.com | MCP 서버 (웹 응답 없음) |
|
||||
| BunnyCDN MCP | bunny.inouter.com | MCP 서버 (웹 응답 없음) |
|
||||
| Gitea Runner | declare successfully ✅ | Tailscale 직접 접속, 와일드카드 인증서 정상 |
|
||||
|
||||
## HTTPRoute 목록
|
||||
|
||||
| Namespace | Name | Hosts | Port |
|
||||
|-----------|------|-------|------|
|
||||
| anvil | nginx-anvil | anvil.local, gnu.inouter.com | 80 |
|
||||
| argocd | argocd-server | argocd.inouter.com | 80 (insecure 모드) |
|
||||
| ironclad | nginx-ironclad | ironclad.local | 80 |
|
||||
| openmemory | openmemory-mcp | mem0.inouter.com | 8765 |
|
||||
| searxng | searxng | searxng.inouter.com | 8080 |
|
||||
| tools | cloud-api-emulator | emul.actions.it.com | 3000 |
|
||||
| tools | cloud-api-linode | linode.actions.it.com | 3001 |
|
||||
| tools | cloud-api-vultr | vultr.actions.it.com | 3002 |
|
||||
| tools | n8n | n8n.inouter.com | 5678 |
|
||||
| tools | namecheap-api | namecheap.api.inouter.com | 80 |
|
||||
| tools | nocodb | nocodb.inouter.com | 8080 |
|
||||
| tools | vultr-api | vultr.api.inouter.com | 80 |
|
||||
| vault | vault-mcp | hcv.inouter.com (/mcp) | 8080 |
|
||||
| vault | vault-ui | hcv.inouter.com (/) | 8200 |
|
||||
|
||||
## ArgoCD 변경사항
|
||||
|
||||
argocd-server를 insecure 모드로 변경 (configmap `argocd-cmd-params-cm`에 `server.insecure: "true"`). TLS 종료를 Gateway에서 처리.
|
||||
|
||||
## 클러스터 내부 DNS (헤어핀 방지)
|
||||
|
||||
Pod에서 외부 도메인(`gitea.inouter.com` 등)에 접근할 때 트래픽이 외부로 나갔다 돌아오는 헤어핀 NAT 문제를 방지하기 위해, CoreDNS rewrite로 서비스 도메인을 Traefik ClusterIP로 직접 해석.
|
||||
|
||||
### 설정
|
||||
|
||||
ConfigMap `coredns-custom` (kube-system)의 `hairpin.override`:
|
||||
|
||||
```
|
||||
rewrite name gitea.inouter.com traefik.kube-system.svc.cluster.local
|
||||
rewrite name argocd.inouter.com traefik.kube-system.svc.cluster.local
|
||||
rewrite name searxng.inouter.com traefik.kube-system.svc.cluster.local
|
||||
rewrite name mem0.inouter.com traefik.kube-system.svc.cluster.local
|
||||
rewrite name nocodb.inouter.com traefik.kube-system.svc.cluster.local
|
||||
rewrite name n8n.inouter.com traefik.kube-system.svc.cluster.local
|
||||
rewrite name hcv.inouter.com traefik.kube-system.svc.cluster.local
|
||||
...
|
||||
```
|
||||
|
||||
### 동작
|
||||
|
||||
1. Pod이 `gitea.inouter.com` DNS 조회
|
||||
2. CoreDNS가 `traefik.kube-system.svc.cluster.local`로 rewrite
|
||||
3. Traefik ClusterIP 반환 → 클러스터 내부에서 처리
|
||||
4. Traefik이 HTTPRoute 호스트 매칭으로 백엔드 라우팅
|
||||
|
||||
### 이전 방식과 차이
|
||||
|
||||
| 방식 | 장점 | 단점 |
|
||||
|------|------|------|
|
||||
| NodeHosts (IP 직접 등록) | 단순 | ClusterIP 변경 시 수동 갱신 필요, stale 엔트리 위험 |
|
||||
| **rewrite (현재)** | ClusterIP 자동 추종 | HTTPRoute 추가 시 rewrite 규칙도 추가 필요 |
|
||||
|
||||
### 유지보수
|
||||
|
||||
새 HTTPRoute 추가 시 `coredns-custom` ConfigMap에 rewrite 규칙 추가 후 CoreDNS 재시작:
|
||||
|
||||
```bash
|
||||
kubectl edit configmap coredns-custom -n kube-system
|
||||
kubectl rollout restart deployment coredns -n kube-system
|
||||
```
|
||||
|
||||
## 주의사항
|
||||
|
||||
- Gateway/GatewayClass를 수동 생성하면 Helm upgrade 실패 (ownership metadata 충돌)
|
||||
- HelmChartConfig로만 설정할 것
|
||||
- `namespacePolicy.from: All` 필수 (기본값은 Same)
|
||||
- ArgoCD가 관리하는 Ingress를 삭제하면 재생성될 수 있으니 Application 확인 필요
|
||||
- HTTPRoute 추가 시 `coredns-custom` hairpin rewrite도 함께 추가할 것
|
||||
Reference in New Issue
Block a user