AI 모델을 프로덕션에 안정적으로 서빙하는 DevOps 엔지니어
DevOps engineer specializing in deploying AI models (LLM, OCR, Embedding) to on-premise and Kubernetes environments. Delivered AI solutions to 10+ projects across finance, manufacturing, education, and public sectors.
- 🏢 Upstage — AI DevOps Engineer (2024.11 ~)
- 🟢 LINE — Software Engineer / DBA (2021.11 ~ 2024.11)
| Certification | Issuer | Date |
|---|---|---|
| Kubestronaut (CKA + CKAD + CKS + KCNA + KCSA) | CNCF | 2025 |
| CKA (Certified Kubernetes Administrator) | CNCF | 2023.12 |
| CKAD (Certified Kubernetes Application Developer) | CNCF | 2024.11 |
| KCSA (Kubernetes and Cloud Native Security Associate) | CNCF | 2025.07 |
| 정보처리기사 | 한국산업인력공단 | 2021.06 |
| 빅데이터분석기사 | 한국데이터산업진흥원 | 2023.08 |
@ Upstage — On-premise & K8s delivery of AI products (LLM, OCR, EWS)
- 🏗 Generative AI (Finance) — Helm-based AI solution on GPU K8s cluster, NVIDIA MIG, monitoring stack
- 📊 DevOps Helm Standard — Helm charts for serving LLM & Document Processing models, v1.0 release, GitOps with ArgoCD
- 🖥 Education Platform — Operated large-scale GPU multi-cloud cluster (IPSec VPN)
- 🏭 Manufacturing · Insurance · Public — OCR/LLM/EWS install, SSO·LDAP·DRM integration, load testing
- 🤖 k13d — Building a natural language Kubernetes dashboard (docs)
@ LINE — Large-scale distributed database (Apache HBase) operations & tooling · ▶ Job Interview
- 🔄 Led HBase open-source migration (cluster build, load testing, data integrity verification)
- 🛠 HBH (HitBaseHandler) — Designed and built Django-based cluster management tool
An 8-node kubeadm cluster at home that runs TT Lab: a hands-on DevOps learning platform (real root shells in isolated lab pods and KubeVirt VMs) and AI services such as a real-time table tennis scoreboard.
| Node | Role | CPU · RAM | GPU | Runs |
|---|---|---|---|---|
| cubi01–03 | Control plane (etcd quorum) | 4 vCPU · 15 GiB each | — | API server, etcd |
| nuc1, nuc2 | Worker | 22 vCPU · 30 GiB each | RTX 4070 Laptop (8GB) | TT Lab web, CI/CD, AI serving (TTS, LLM) |
| omen | GPU worker | 24 vCPU · 61 GiB | RTX 3090 (24GB, time-sliced ×5) | Real-time ball tracking & scoring, table segmentation |
| loq | GPU worker | 16 vCPU · 14 GiB | RTX 4060 Laptop (8GB) | Git hosting, registry, ML experiments & fine-tuning |
| dell | VM worker | 16 vCPU · 22 GiB | RTX 3060 Laptop (VFIO passthrough) | KubeVirt VMs with GPU |
Stack — Kubernetes v1.34 · Cilium 1.20 (Gateway API, FQDN egress policies) · MetalLB L2 · Argo CD · Jenkins · Gitea · Harbor · Keycloak SSO · CloudNativePG · KubeVirt + CDI · NVIDIA GPU Operator · Istio · Airflow · Prometheus · Grafana · OpenTelemetry
Write-ups — Postmortems, measurements and study notes from running it are on the TT Lab blog.
| Project | Description | Tech |
|---|---|---|
| k13d | Natural language Kubernetes dashboard · docs | Go, Claude Code |
| fingerscore | Real-time sports score platform | Next.js, Supabase |
| ai-shorts-generator | Automated AI shorts video pipeline | Python, Wan2.1/2.2 |
| ai-stages-kubevirt | KubeVirt-based AI training environment | KubeVirt, K8s |
I contribute to the cloud-native and AI-infrastructure projects I run in my home lab, and back each change with a reproduction or measurement from a real cluster. Main focus: KubeVirt, Kubeflow and CloudNativePG.
25 merged across 23 projects · 48 in review (as of October 30, 2026)
Merged
Virtualization (6)
| Project | PR | Change |
|---|---|---|
| KubeVirt | #19499 | virt-operator: stop GETting a disabled webhook on every reconcile |
| KubeVirt CDI | #4319 | Storage capabilities for rancher.io/local-path |
| KubeVirt CDI | #4318 | Explain how filesystem overhead changes PVC and image size |
| KubeVirt CDI | #4320 | Log the storage class name instead of its pointer |
| KubeVirt user-guide | #1040 | Mark spec.running deprecated in favor of runStrategy |
| KubeVirt virt-template | #137 | Use template.kubevirt.io/v1beta1 in README examples |
AI / ML infrastructure (6)
| Project | PR | Change |
|---|---|---|
| Kubeflow Trainer | #4334 | Use v2.3.0 in the installation guide |
| Gemini cookbook | #1433 | Live API WebSocket starter: current realtime_input format, flush playback on interruption |
| llm-d | #2835 | Replace vLLM metric names that vLLM no longer exports |
| LMCache | #5814 | Drop --disable-log-requests from vllm serve examples |
| MiniMind | #889 | Pick native vs. Transformers loading by directory name |
| models.dev | #10155 | Add Upstage Solar Mini 4 |
Kubernetes, networking & registries (7)
| Project | PR | Change |
|---|---|---|
| Envoy | #48408 | Explain how route and virtual host rate limits combine |
| Distribution (registry) | #5021 | Do not write hash state when closing a cancelled upload |
| Harbor | #24164 | Stamp version info into the bundled Trivy adapter |
| Argo Workflows | #17246 | Quick start: replace the MinIO Helm install with the quick-start S3 server |
| eBPF Docs | #301 | Add newer bpf_base_func_proto helpers |
| Helm docs | #2307 | lookup only runs for template, install and upgrade |
| alpine/k8s | #99 | Point eksctl and jq downloads at their current repositories |
Observability, storage & IaC (6)
| Project | PR | Change |
|---|---|---|
| kube-prometheus-stack | #7384 | Keep container_memory_swap from cAdvisor |
| Grafana Helm chart | #896 | Admin password is only applied on first start |
| OpenSearch docs | #13346 | Fix the disk watermark example in ISM error resolutions |
| SeaweedFS | #11755 | weed mini help: mini.options and Docker filer.toml pitfalls |
| Ansible community.general | #12997 | terraform module: use state_file for apply and destroy |
| Apache HBase | #5927 | Fix RowTooBigException on a duplicate increment RPC (HBASE-28599) (2024) |
In review
- Virtualization — KubeVirt #19617 #19618 #19530 · KubeVirt user-guide #1045 · macvtap-cni #160 · NVIDIA kubevirt-gpu-device-plugin #222 · kubernetes-mcp-server #1518
- GPU & AI infrastructure — NVIDIA GPU Operator #3086 · NVIDIA k8s-device-plugin #2104 · NVIDIA go-nvlib #129 · NVIDIA cloud-native-docs #524 · DCGM Exporter #760 · KAI Scheduler #2532 · Dynamo #17386 #16465 · llm-d router #3681 #3682 · vLLM production-stack #1147 #1148 · CoreWeave tensorizer #211 · NeMo #16396 · Slinky Slurm operator #272
- Databases & storage — CloudNativePG barman-cloud #1164 #1166 · ClickHouse #126337 · zstd #4847 · RocksDB #15418
- Kubernetes & tooling — MetalLB #3156 · k9s #4298 · Harbor Helm #2423 · k8s-sidecar #661 · podman-compose #1585 · Keycloak (codecentric) chart #939 · alpine/k8s #100
- Observability & IaC — Grafana Tempo chart #898 · Ansible docs #4077 #4078 · Terraform local provider #533
- AI frameworks & apps — LlamaIndex #23548 · LobeHub #21026 · Hermes Agent #140057 · catwalk #676 · gptel #1578 · MediaPipe #6381
- Python web & robotics — python-multipart #338 · prometheus-fastapi-instrumentator #403 · PX4 Autopilot #29271 #29291
→ All my open-source pull requests · how each merged change came about: Open source contribution log on the TT Lab blog (Korean)
I use Claude Code as a coding assistant and disclose it in each PR as the project's AI policy asks. Reproductions and tests run on my own cluster.
- 🥈 Naver Clova AI-Rush 4th (2021)
- 🥇 고양시 메이커톤 대상 (2018)
- 📊 KLUE 뉴스 토픽 분류 AI 경진대회 27/256 (상위 11%)
"Building reliable AI infrastructure, even in air-gapped environments."


