클러스터 개요
Lumie 플랫폼은 K3s v1.34.3 기반의 OCI(Oracle Cloud Infrastructure) 클러스터에서 운영됩니다. 1개의 마스터 노드와 3개의 워커 노드로 구성되며, 두 개의 OCI 계정(0213, 0214)에 걸쳐 VCN 피어링으로 연결됩니다. 모든 노드는 ARM64 (VM.Standard.A1.Flex) Ubuntu 24.04 기반입니다.
노드 구성
| 노드 | 역할 | 계정 | 비고 |
|---|---|---|---|
k3s-master | Control Plane | OCI-0214 | Private IP: 10.0.0.241, etcd + ArgoCD |
k3s-worker-2 | Worker | OCI-0214 | 애플리케이션 워크로드 |
k3s-worker-3 | Worker | OCI-0213 | VCN 피어링 연결 |
k3s-worker-4 | Worker | OCI-0213 | VCN 피어링 연결 |
worker-1은 2026-04 비용 최적화로 제외됨 (원래 OCI-0214 계정에 위치).
K3s 핵심 설정
마스터 노드
# provision/ansible/group_vars/masters.yml
k3s_server_args:
- "--write-kubeconfig-mode 644"
- "--tls-san {{ ansible_host }}" # 공용 IP
- "--tls-san {{ private_ip }}" # 프라이빗 IP
- "--cluster-cidr 10.42.0.0/16"
- "--service-cidr 10.43.0.0/16"
Traefik과 svclb(ServiceLB)는 기본 활성화 상태를 유지합니다. 단, 마스터 노드에는 node.kubernetes.io/exclude-from-external-load-balancers 레이블 또는 enablelb 레이블을 제거하여 svclb DaemonSet이 마스터에 배포되지 않도록 합니다. 마스터 노드의 443 포트는 Teleport가 hostNetwork 모드로 단독 점유합니다.
네트워크 CIDR
| 구분 | CIDR |
|---|---|
| Pod 네트워크 | 10.42.0.0/16 |
| Service 네트워크 | 10.43.0.0/16 |
| OCI-0214 VCN / subnet | 10.0.0.0/16 / 10.0.0.0/24 |
| OCI-0213 VCN / subnet | 10.1.0.0/16 / 10.1.0.0/24 |
CNI: Flannel
K3s 기본 CNI인 Flannel을 사용합니다. VXLAN 터널링으로 노드 간 Pod 네트워크를 구성합니다.
NetworkPolicy 미지원: Flannel은 NetworkPolicy를 지원하지 않습니다. 네임스페이스 간 트래픽 격리는 Kyverno 정책으로 보완합니다.
NLB 및 Ingress 구조
클러스 터에는 두 개의 OCI NLB(Network Load Balancer)가 운영됩니다:
| NLB | 계정 | 고정 IP | 용도 | 백엔드 |
|---|---|---|---|---|
k3s-nlb (애플리케이션) | OCI-0214 | 168.107.42.253 | lumie-edu.com 80/443 | 전체 워커 노드 |
teleport-nlb (인프라 접근) | OCI-0213 | 158.180.89.154 | lumie-infra.com 443 | worker-3/worker-4 (NodePort 30443) |
두 NLB 모두 고정 IP에 lifecycle { ignore_changes = [private_ip_id] } 설정이 적용되어 있어 OCI 프로바이더 버그(#1708)로 인한 IP 해제를 방지합니다.
Traefik은 K3s에 내장된 기본 Ingress Controller로 모든 애플리케이션 트래픽을 처리합니다. 자세한 설정은 네트워킹을 참고하세요.
스토리지
local-path-provisioner
K3s 기본 스토리지 클래스입니다. 노드 로컬 디스크를 PV로 동적 프로비저닝합니다.
# 기본 스 토리지 클래스 확인
kubectl get storageclass
MinIO (오브젝트 스토리지)
각 노드에 마운트된 50GB 블록 볼륨을 MinIO의 분산 스토리지 백엔드로 사용합니다. OCI-0213은 worker-3/worker-4 각각, OCI-0214는 master와 worker-2에 블록 볼륨이 연결됩니다(worker-1 디스크를 master로 이전한 결과).
마운트 포인트: /mnt/minio-data
파일시스템: ext4
MinIO는 minio 네임스페이스에 배포되며, Zot 이미지 레지스트리의 S3 백엔드로도 활용됩니다.
DNS 구성
DNS는 Cloudflare를 통해 OCI NLB로 라우팅됩니다:
| 도메인 | 레코드 타입 | 대상 |
|---|---|---|
lumie-edu.com, *.lumie-edu.com | A | 168.107.42.253 (k3s-nlb, CF 프록시됨) |
lumie-infra.com, *.lumie-infra.com | A | 158.180.89.154 (teleport-nlb, DNS-only) |
Kubernetes 클러스터 내부 DNS는 CoreDNS가 처리합니다:
# 서비스 내부 접근 형식
<service-name>.<namespace>.svc.cluster.local
# 예시
lumie-backend.lumie-backend.svc.cluster.local
minio.minio.svc.cluster.local
네임스페이스 목록
| 네임스페이스 | 용도 |
|---|---|
lumie-backend | Spring Boot 모노리스 백엔드 |
lumie-frontend | Next.js 프론트엔드 |
lumie-worker | Python 워커 서비스 (grading, report, audio, analysis) |
lumie-db | PostgreSQL (CNPG) + PgBouncer |
lumie-cache | Redis Sentinel |
lumie-event | RabbitMQ |
minio | MinIO 오브젝트 스토리지 |
argocd | ArgoCD GitOps |
tekton-pipelines | Tekton CI/CD |
vault | HashiCorp Vault |
teleport | Teleport 제로 트러스트 접근 |
keycloak | OIDC 인증 제공자 |
observability | Prometheus, Grafana, Loki, Tempo 등 |
kube-system | K3s 시스템 컴포넌트 |
cert-manager | TLS 인증서 자동화 |
운영 명령어
# 노드 상태 확인
kubectl get nodes -o wide
# 모든 파드 상태
kubectl get pods -A
# 특정 네임스페이스 전체 리소스
kubectl get all -n lumie-backend
# 리소스 사용량
kubectl top nodes
kubectl top pods -A