Kubernetes (K3s)
Lumie 플랫폼은 K3s를 사용하여 경량화된 Kubernetes 클러스터를 운영합니다. K3s는 Oracle Cloud Infrastructure(OCI)의 ARM64 인스턴스에서 실행되며, 멀티 테넌시 환경을 지원합니다.
클러스터 아키텍처
노드 구성
클러스터는 두 개의 OCI 계정에 걸쳐 구성되어 있으며, VCN 피어링을 통해 연결됩니다:
0214 계정 (마스터 계정)
-
마스터 노드:
k3s-master- 컨트롤 플레인 컴포넌트
- etcd 데이터베이스
- ArgoCD 설치
- Private IP:
10.0.0.241
-
워커 노드:
k3s-worker-2- 애플리케이션 워크로드
- 모니터링 스택
- MinIO 스토리지
- Traefik svclb (포트 80/443)
worker-1은 비용 최적화로 2026-04 제외됨
0213 계정 (워커 계정)
- 워커 노드:
k3s-worker-3,k3s-worker-4- 추가 워커 노드
- VCN 피어링을 통해 마스터와 연결
- MinIO 스토리지
- Traefik svclb (포트 80/443)
네트워크 구성
K3s 구성
버전 및 설정
- K3s 버전:
v1.34.3+k3s1 - CNI: Flannel (기본값)
- Ingress: Traefik 활성화 (K3s 기본 내장)
- Storage: local-path-provisioner
마스터 노드 설정
# 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 {{ k3s_cluster_cidr }}"
- "--service-cidr {{ k3s_service_cidr }}"
--disable traefik 옵션이 없으므로 K3s 내장 Traefik이 활성화됩니다. Traefik의 svclb DaemonSet은 마스터 노드에서 제외되어 443 포트 충돌을 방지합니다.
워커 노드 연결
워커 노드는 마스터의 Private IP를 통해 연결됩니다:
# 0214 계정 워커 (같은 VCN)
K3S_URL="https://10.0.0.241:6443"
# 0213 계정 워커 (VCN 피어링)
K3S_URL="https://10.0.0.241:6443"
클러스터 접근
Kubeconfig 설정
Ansible을 통해 kubeconfig를 로컬로 가져올 수 있습니다:
# kubeconfig 가져오기
ansible-playbook -i inventory/terraform_inventory.py playbooks/fetch-kubeconfig.yml
# 환경 변수 설정
export KUBECONFIG=provision/ansible/kubeconfig/config
# 클러스터 확인
kubectl get nodes
SSH 접근
# 마스터 노드 접근
ssh ubuntu@<master-public-ip>
# 마스터에서 kubectl 사용
sudo kubectl get nodes
sudo kubectl get pods -A
네임스페이스 구조
각 서비스는 독립적인 네임스페이스에서 실행됩니다:
| 네임스페이스 | 용도 | 관리 방식 |
|---|---|---|
lumie-backend | Spring Boot 모노리스 백엔드 | GitOps |
lumie-frontend | Next.js 프론트엔드 | GitOps |
lumie-worker | Python 워커 서비스 (grading, report, audio, analysis) | GitOps |
lumie-db | PostgreSQL (CNPG) + PgBouncer | GitOps |
lumie-cache | Redis Sentinel | GitOps |
lumie-event | RabbitMQ | GitOps |
argocd | ArgoCD 배포 | GitOps |
tekton-pipelines | Tekton CI/CD | GitOps |
minio | MinIO 오브젝트 스토리지 | GitOps |
vault | Vault 시크릿 관리 | GitOps |
teleport | Teleport 제로 트러스트 접근 | GitOps |
keycloak | OIDC 인증 제공자 | GitOps |
cert-manager | 인증서 관리 | GitOps |
kube-system | K3s 시스템 컴포넌트 (Traefik 포함) | K3s 관리 |
observability | Prometheus, Grafana, Loki, Tempo 등 | GitOps |
스토리지 구성
블록 볼륨
각 워커 노드는 MinIO용 50GB 블록 볼륨을 가집니다:
# 마운트 포인트
/mnt/minio-data
# 파일시스템
ext4
# 라벨
minio-<node-name>
스토리지 클래스
- local-path: 기본 스토리지 클래스
- 로컬 디스크 사용
- 개발 및 비중요 데이터용
일반적인 운영 작업
클러스터 상태 확인
# 노드 상태
kubectl get nodes -o wide
# 모든 네임스페이스의 파드
kubectl get pods -A
# 시스템 파드 상태 (Traefik 포함)
kubectl get pods -n kube-system
애플리케이션 상태 확인
# 특정 네임스페이스
kubectl get all -n <namespace>
# 파드 로그 확인
kubectl logs -n <namespace> <pod-name>
# 파드 상세 정보
kubectl describe pod -n <namespace> <pod-name>
ArgoCD 애플리케이션 관리
대부분의 애플리케이션은 ArgoCD를 통해 관리됩니다:
# ArgoCD 애플리케이션 확인
kubectl get applications -n argocd
# 애플리케이션 강제 동기화
kubectl patch application -n argocd <app-name> \
-p '{"metadata": {"annotations": {"argocd.argoproj.io/refresh": "hard"}}}' \
--type merge
네트워킹
보안 그룹 규칙
클러스터는 다음 포트를 사용합니다:
| 포트 | 프로토콜 | 용도 |
|---|---|---|
| 22 | TCP | SSH |
| 80 | TCP | HTTP (Traefik, 워커 노드) |
| 443 | TCP | HTTPS (Traefik 워커 노드 / Teleport NodePort 30443 → worker-3/4) |
| 6443 | TCP | K3s API Server |
| 10250 | TCP | Kubelet API |
| 8472 | UDP | Flannel VXLAN |
| 51820 | UDP | WireGuard |
트래픽 라우팅
두 개 의 OCI NLB를 통해 외부 트래픽을 라우팅합니다:
인터넷 → k3s-nlb (168.107.42.253) → Traefik (svclb, 워커 노드) → Service → Pod
인터넷 → teleport-nlb (158.180.89.154) → NodePort 30443 (worker-3/4) → Teleport Pod
문제 해결
파드 시작 실패
# 파드 이벤트 확인
kubectl describe pod -n <namespace> <pod-name>
# 로그 확인
kubectl logs -n <namespace> <pod-name>
# 이전 컨테이너 로그 (크래시된 경우)
kubectl logs -n <namespace> <pod-name> --previous
리소스 문제
# 노드 리소스 사용량
kubectl top nodes
# 파드 리소스 사용량
kubectl top pods -A
# 리소스 할당량 확인
kubectl describe quota -A
네트워크 연결 문제
# 서비스 확인
kubectl get svc -A
# 엔드포인트 확인
kubectl get endpoints -A
# 네트워크 디버깅 파드 실행
kubectl run -it --rm debug --image=nicolaka/netshoot --restart=Never -- /bin/bash
VCN 피어링 문제
# 0213 계정 워커에서 마스터 연결 테스트
telnet 10.0.0.241 6443
# 라우팅 테이블 확인 (OCI 콘솔)
# 피어링 게이트웨이 상태 확인
모니터링
클러스터 메트릭
Prometheus를 통해 다음 메트릭을 수집합니다:
- 노드 리소스 사용량
- 파드 상태 및 리소스
- 네트워크 트래픽
- 스토리지 사용량
로그 수집
Loki를 통해 모든 파드 로그를 중앙 집중식으로 수집합니 다.
알림
Alertmanager를 통해 다음 상황에 대한 알림을 설정합니다:
- 노드 다운
- 파드 크래시
- 리소스 부족
- 네트워크 문제
보안
네트워크 정책
Kyverno를 통해 네트워크 정책을 자동으로 적용합니다:
- 네임스페이스 간 격리
- 외부 트래픽 제한
- 서비스 메시 보안
시크릿 관리
Vault를 통해 모든 시크릿을 중앙 관리합니다:
- 데이터베이스 자격 증명
- API 키
- TLS 인증서