Kong (미배포 — 데드코드)
Kong은 클러스터에 배포된 적 없습니다.
bootstrap/kong/디렉토리에 매니페스트가 존재하지만,bootstrap/kustomization.yaml에서 제외되어 있어 ArgoCD가 해당 Application을 생성하지 않습니다.현재 클러스터의 Ingress Controller는 Traefik입니다.
현재 상태
bootstrap/kustomization.yaml은 다음 4개의 부트스트랩 애플리케이션만 등록합니다:
# bootstrap/kustomization.yaml (현재)
resources:
- minio/argocd.yaml # sync wave 0
- zot/argocd.yaml # sync wave 1
- vault/argocd.yaml # sync wave 2
- gitea/argocd.yaml # sync wave 3
bootstrap/kong/argocd.yaml은 이 목록에 없습니다. 따라서 kong 네임스페이스, Kong Pod, KongClusterPlugin 리소스는 클러스터에 존재하지 않습니다.
현재 책임 구조:
| 관심사 | 현재 처리 주체 |
|---|---|
| Ingress / TLS 종료 | Traefik (K3s 내장, platform/traefik-config/helmchartconfig.yaml으로 패치) |
| HTTP → HTTPS 리다이렉트 | Traefik HelmChartConfig 엔트리포인트 설정 |
| CORS | Spring Boot WebMvcConfigurer (애플리케이션 레벨) |
| JWT 검증 | Spring Security 필터 체인 (애플리케이션 레벨) |
| JWT 시크릿 | Vault secret/security/jwt → lumie-backend-jwt-secrets K8s Secret으로 직접 주입 |
| 테넌트 컨텍스트 헤더 | Spring Boot 필터 (X-Tenant-Slug, X-Tenant-Id, X-User-Id 등) |
| MinIO 업로드 프록시 | Traefik IngressRoute CRD (bootstrap/minio/manifests/upload-proxy-ingress.yaml) |
설계 의도 (미실현)
아래는 bootstrap/kong/ 매니페스트가 구현하려 했던 설계입니다. 실제로 동작한 적 없는 참조용 기록입니다.
배포 방식
# bootstrap/kong/helm-values.yaml
gateway:
deployment:
daemonset: true
hostNetwork: true # 모든 노드 80/443 포트 직접 바인딩
dnsPolicy: ClusterFirstWithHostNet
image:
repository: kong
tag: "3.6"
Kong Ingress Controller(chart: ingress, targetRevision: 0.14.0)를 DaemonSet + hostNetwork 방식으로 배포하여, HAProxy 없이 모든 노드에서 직접 80/443 포트를 점유하는 구조였습니다.
KongClusterPlugin 목록
bootstrap/kong/manifests/cluster-plugins.yaml에 정의된 플러그인:
| 플러그인 이름 | 종류 | 역할 |
|---|---|---|
https-redirect | pre-function (global) | HTTP 요청을 HTTPS로 301 리다이렉트 |
lumie-cors | cors | 허용 오리진(lumie-edu.com, dev.lumie-infra.com, localhost:3000) 및 헤더(X-Tenant-Slug 포함) CORS 정책 |
lumie-jwt | jwt | Authorization 헤더 또는 lumie_access_token 쿠키에서 HS256 JWT 검증 (iss 클레임 기반 키 조회) |
lumie-jwt-claims | post-function | 검증된 JWT 페이로드에서 sub, tenant_slug, tenant_id, role 추출 → 업스트림 헤더(X-User-Id, X-Tenant-Slug, X-Tenant-Id, X-User-Role) 주입 |
JWT 자격증명 관리
bootstrap/kong/manifests/jwt-auth.yaml:
# Vault에서 JWT 시크릿 주입
apiVersion: secrets.hashicorp.com/v1beta1
kind: VaultStaticSecret
metadata:
name: kong-jwt-credential-vss
namespace: kong
spec:
mount: secret
path: security/jwt # Vault KV 경로
destination:
name: kong-jwt-credential
labels:
konghq.com/credential: jwt
transformation:
templates:
algorithm:
text: "HS256"
key:
text: "lumie-auth-svc"
secret:
text: "{{ .Secrets.JWT_SECRET_KEY }}"
---
# KongConsumer (JWT 발급자 등록)
apiVersion: configuration.konghq.com/v1
kind: KongConsumer
metadata:
name: lumie-auth-issuer
namespace: kong
username: lumie-auth-svc
credentials:
- kong-jwt-credential
HS256 알고리즘, iss=lumie-auth-svc 클레임으로 Kong이 JWT를 검증하는 구조였습니다. 현재는 동일한 시크릿(secret/security/jwt)이 Spring Boot에 직접 주입됩니다.
왜 Traefik으로 대체되었나
Kong은 초기 설계 단계에서 API 게이트웨이로 선정되었으나, K3s 내장 Traefik이 이미 클러스터에 존재하고 DaemonSet+hostNetwork 방식의 Kong을 추가하는 복잡성 대비 실질적 이점이 없었습니다. JWT/CORS 처리는 Spring Boot 애플리케이션 레벨에서 충분히 수행 가능하므로, Kong 매니페스트는 배포 없이 보존 상태로 남아 있습니다.
관련 문서
- Traefik — 현재 Ingress Controller
- 네트워킹 개요 — 전체 네트워크 구성
- cert-manager — TLS 인증서 자동화