Zum Hauptinhalt springen

클러스터 개요

Lumie 플랫폼은 K3s v1.34.3 기반의 OCI(Oracle Cloud Infrastructure) 클러스터에서 운영됩니다. 1개의 마스터 노드와 3개의 워커 노드로 구성되며, 두 개의 OCI 계정(0213, 0214)에 걸쳐 VCN 피어링으로 연결됩니다. 모든 노드는 ARM64 (VM.Standard.A1.Flex) Ubuntu 24.04 기반입니다.

노드 구성

노드역할계정비고
k3s-masterControl PlaneOCI-0214Private IP: 10.0.0.241, etcd + ArgoCD
k3s-worker-2WorkerOCI-0214애플리케이션 워크로드
k3s-worker-3WorkerOCI-0213VCN 피어링 연결
k3s-worker-4WorkerOCI-0213VCN 피어링 연결

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 / subnet10.0.0.0/16 / 10.0.0.0/24
OCI-0213 VCN / subnet10.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-0214168.107.42.253lumie-edu.com 80/443전체 워커 노드
teleport-nlb (인프라 접근)OCI-0213158.180.89.154lumie-infra.com 443worker-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.comA168.107.42.253 (k3s-nlb, CF 프록시됨)
lumie-infra.com, *.lumie-infra.comA158.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-backendSpring Boot 모노리스 백엔드
lumie-frontendNext.js 프론트엔드
lumie-workerPython 워커 서비스 (grading, report, audio, analysis)
lumie-dbPostgreSQL (CNPG) + PgBouncer
lumie-cacheRedis Sentinel
lumie-eventRabbitMQ
minioMinIO 오브젝트 스토리지
argocdArgoCD GitOps
tekton-pipelinesTekton CI/CD
vaultHashiCorp Vault
teleportTeleport 제로 트러스트 접근
keycloakOIDC 인증 제공자
observabilityPrometheus, Grafana, Loki, Tempo 등
kube-systemK3s 시스템 컴포넌트
cert-managerTLS 인증서 자동화

운영 명령어

# 노드 상태 확인
kubectl get nodes -o wide

# 모든 파드 상태
kubectl get pods -A

# 특정 네임스페이스 전체 리소스
kubectl get all -n lumie-backend

# 리소스 사용량
kubectl top nodes
kubectl top pods -A

관련 문서