오제원

인프라 · 플랫폼 엔지니어 지망

2023년부터 리눅스 홈서버를 운영하며 가상화와 네트워크, 스토리지, 쿠버네티스를 구성해 왔습니다. 장애가 나면 실측으로 원인을 좁히고, 고친 내용은 코드와 문서로 남깁니다.

홈랩 운영 3년 6개월 · k3s 5노드 · CKA · 2026-10-06 갱신

기술

인프라
Linux, Proxmox VE, TrueNAS, Proxmox Backup Server
네트워크
OPNsense, VLAN, BGP(FRR) 기반 DNS 이중화
쿠버네티스
k3s, Longhorn, Helm, ArgoCD
모니터링
Prometheus, Grafana, Loki, Alertmanager
자동화
Terraform, Ansible, GitHub Actions
개발
TypeScript(React, Electron), C/C++

프로젝트

온프레미스 홈랩

2023.03 ~ 현재 · 개인
서비스
Immich, Jellyfin, OpenCloud, Vaultwarden, 기술 블로그
플랫폼
Keycloak 통합 로그인, Gitea, GitHub Actions 러너(팀 프로젝트 빌드), ArgoCD, Envoy Gateway, cert-manager
클러스터
k3s 5노드 (control-plane 1, worker 4)
호스트
Proxmox VE 2대 (VM 3) · 베어메탈 2대 (N100, ROCK 5B)
네트워크
OPNsense 방화벽 · VLAN으로 관리망과 서비스망 분리
홈랩 구성도 (2026-09) OPNsense 방화벽 아래 Proxmox 호스트 2대와 베어메탈 2대가 있고, 그 위에 k3s 5노드 클러스터(control-plane 1, worker 4)가 서비스, 플랫폼, 모니터링을 운영한다. 집 밖 감시 GCP e2-micro 정전·회선 단절 알림 OPNsense 방화벽 VLAN으로 관리망과 서비스망 분리 DNS 이중화 AdGuard 2대 (E25, ROCK 5C) 같은 주소를 BGP로 광고 BD895i · Proxmox VE Ryzen 9 8945HX · 64GB VM · server-1 (control-plane) VM · worker-1 wtrpro · Proxmox VE Ryzen 7 5825U · 64GB VM · worker-5 VM · TrueNAS CT · 백업(PBS) CT · AI 도구 VM · 스마트홈 베어메탈 싱글보드·미니 PC worker-7 · N100 (amd64) rock-5b · ROCK 5B (arm64) k3s 클러스터 · 5노드 (control-plane 1, worker 4) 파란 칸이 클러스터 노드 · VM 생성은 Terraform, 노드 설정은 Ansible, 배포는 ArgoCD(GitOps) 서비스 OpenCloud (파일 동기화) Vaultwarden (비밀번호) Immich (사진 백업) Jellyfin (미디어) 기술 블로그 플랫폼 Keycloak (통합 로그인) Actions 러너 (DoEatFit 빌드) ArgoCD · Gitea Envoy Gateway · cert-manager Longhorn (블록 스토리지) 모니터링 Prometheus · Alertmanager Grafana Loki (로그) 텔레그램 알림 2026-09 기준
2026-09 구성. 파란 칸이 k3s 노드다
홈랩 랙 사진: 수납장 안 랙에 싱글보드 컴퓨터, 스위치, 미니 PC가 들어 있다
실물 랙(2026-09). 발열 때문에 8월에 랙과 배기를 바꿨다
  • 2026.03 쿠버네티스 학습, 2026.05부터 k3s 클러스터로 서비스 운영
  • Terraform 기반 VM 생성, Ansible 기반 노드 설정, ArgoCD 기반 GitOps 배포
  • Prometheus와 Loki 기반 지표와 로그 수집, 텔레그램 알림 구성

장애 대응

MTU 불일치ping은 되는데 k3s API 통신만 시간 초과

원인 OPNsense VLAN 인터페이스의 MTU 기본값 1500. 분할 금지 비트를 켠 9000바이트 ping 전량 유실로 확정

조치 경로 MTU 9000으로 조정. 이후 노드 MTU를 1500으로 낮추며 문서를 고치지 않아 8월 재발, 1500으로 통일하고 문서에 경고 추가

이유 디스크 병목, 작은 패킷 위주 트래픽으로 점보 프레임 이득 없음

제어 노드 메모리 축출할당 가능 메모리 기준 요청량 28%, 실제 사용량 99%

원인 k3s 제어 컴포넌트가 단일 프로세스로 실행돼 요청량에 미반영. 해당 예약값이 워커와 같은 512Mi

조치 실측 2,531Mi 기준으로 예약값을 2,560Mi로 조정

이유 예약값은 사용량 한도가 아닌 스케줄러의 가용 메모리 계산 기준

기록 블로그 · K3s 노드 축소

Grafana 캡처, 8월 29일 12시~30일 01시 제어 노드 메모리(GiB): 실제 사용이 할당 가능선 약 4.3에 붙어 있고 파드 요청 합은 0.7~1.2Grafana 캡처, 8월 29일 12시~30일 01시 제어 노드 메모리(GiB): 실제 사용이 할당 가능선 약 4.3에 붙어 있고 파드 요청 합은 0.7~1.2
조정 전, 사건 당일(08-29 12:00~08-30 01:00) Grafana 캡처(단위 GiB). 파드 요청 합은 1GiB 안팎인데 실제 사용은 할당 가능선에 붙어 있다
Grafana 캡처, 제어 노드 메모리 최근 7일(GiB): 노드 전체 약 5.8, 실제 사용 약 3~3.5, 할당 가능 약 2.3, 파드 요청 합 약 0.7Grafana 캡처, 제어 노드 메모리 최근 7일(GiB): 노드 전체 약 5.8, 실제 사용 약 3~3.5, 할당 가능 약 2.3, 파드 요청 합 약 0.7
조정 후 7일, Grafana 캡처(단위 GiB). 실제 사용에는 예약으로 떼어 둔 k3s server 몫이 들어 있어 할당 가능선보다 높다
NVMe 온도임계 온도 90% 초과 시간 하루 58%(8/24) → 7일 0%(9/14~)

원인 발열로 랙과 배기를 바꾼 뒤에도 온도 유지. 알림 규칙은 있었지만 온도 규칙이 없었음

조치 임계 온도 초과 알림 규칙 추가, NVMe 방열판 부착

이유 90% 초과는 상시라 알림을 걸면 계속 울림. 알림은 임계 초과에만 걸고, 온도는 냉각으로 해결

기록 블로그 · 홈랩 랙 교체

Grafana 캡처, 8월 23일~30일 NVMe 온도(°C): 76.4°C 선을 자주 넘다가 8월 29일 밤 방열판 뒤 50~60°C대로 내려감Grafana 캡처, 8월 23일~30일 NVMe 온도(°C): 76.4°C 선을 자주 넘다가 8월 29일 밤 방열판 뒤 50~60°C대로 내려감
방열판 전후, 08-23~08-30 Grafana 캡처(단위 °C, 호스트 1은 bd895i, 호스트 2는 wtrpro). 08-29 밤에 방열판을 붙인 뒤 온도가 내려갔다
Grafana 캡처, NVMe 다섯 장의 최근 7일 온도(°C): 모두 임계의 90%(76.4°C) 아래, 최고 약 68°CGrafana 캡처, NVMe 다섯 장의 최근 7일 온도(°C): 모두 임계의 90%(76.4°C) 아래, 최고 약 68°C
방열판 부착 후 7일, Grafana 캡처(단위 °C). 다섯 장 모두 임계의 90% 아래, 최고 67.9°C
DNS 이중화가상 IP가 3~6분마다 흔들려 질의 유실

원인 keepalived 가상 IP에서 2호기가 광고를 놓치면 두 대가 모두 주소를 가져 ARP가 혼란

조치 두 서버가 같은 주소를 BGP(FRR)로 방화벽에 광고. 2초마다 로컬 DNS를 질의해 3회 실패하면 광고를 거둠

이유 라우터가 경로를 하나만 골라 두 대가 동시에 주인이 되는 일이 구조상 없음. 셀프호스팅 커뮤니티 구성을 참고

알려진 한계

  • 제어 노드가 1대라 고가용성 구성이 아님. 8노드 시절 제어 노드 3대였으나 호스트 메모리가 모자라 줄였고, 8월 제어 노드가 멈췄을 때 API와 인그레스가 함께 멈춤
  • 백업 서버(PBS)가 백업 대상과 같은 호스트에 있음. 11월 클라우드 저장소로 외부 백업을 추가할 계획
  • 서비스망 안쪽 방화벽 규칙을 좁히는 작업이 남음. 43시간 연결 기록으로 허용 목록 17건과 적용 순서를 정리했고 적용 전

DoEatFit

2024.01 ~ 진행 중 · 2인 · 백엔드에서 인프라로 · doeatfit.org
  • 식단과 운동 기록 웹 서비스
  • Spring Boot 기반 운동 API 및 JPA 데이터 모델 구현 (2024)
  • Spring Security와 JWT 기반 로그인 인증 구현 (2024)
  • 2025년부터 AI 코딩 도구를 활용한 기능 개발과 인프라 매니페스트 작성
  • 현재 인프라 매니페스트 담당, 홈랩 k3s 러너 기반 빌드
  • 팀원 클러스터의 로그와 지표를 홈랩에서 수집하도록 구성, 역할 분담 문서화
DoEatFit 메인 화면: 식단 계산, 목표 심박, 운동 방법 기능 소개
메인 화면
DoEatFit 운동 가이드 화면: 운동 검색과 부위별 운동 카드
운동 가이드 · 운동 검색 API를 직접 구현(2024)
DoEatFit 운동 일지 화면: 종목별 세트, 무게, 횟수 기록
운동 일지 · 세트 단위 기록

중고워싱

2024.09 ~ 12 · 4인 졸업 프로젝트 · 팀장, 백엔드 · GitHub
  • Spring Boot 기반 경매 API 구현, AWS(EC2, RDS, S3)에 Docker로 배포
  • Jenkins 기반 빌드와 배포 자동화
  • 동시 입찰 경쟁 상태에 Redis 분산 락 적용

경력

OS전자 · 소프트웨어 개발

2025.08 ~ 재직 중 · 정규직
  • PCB 코팅 공정용 CAM 데스크톱 앱(coating-cam) 개발
  • AI 코딩 도구를 활용한 개발, 요구사항 정리와 현장 검증 담당
  • 좌표 수동 등록 작업을 도면 기반 G-code 생성 방식으로 전환, 보드 수만큼 복사해 일괄 변환
  • GitHub Actions 기반 Windows 앱 빌드와 자동 업데이트 구성

OS전자 · 코팅 장비 제어 소프트웨어 개발

2022.10 ~ 2024.02
  • C/C++와 ImGui 기반 툴패스 작성 및 장비 제어 프로그램 개발

자격 · 학력