글

라벨이 kubernetes인 게시물 표시

Kubernetes에 vLLM 올렸더니 Pod가 계속 죽는다면 — GPU 할당·모델 로딩 Probe·/dev/shm·KV 캐시·대기열 오토스케일링, LLM 서빙 매니페스트 7가지 함정

이미지
로컬에서 vllm serve 한 줄이면 잘 돌던 모델을 Kubernetes에 올리는 순간 이야기가 달라집니다. Pod는 Running인데 GPU를 못 잡고, 모델 가중치를 반쯤 읽다가 재시작되고, 겨우 뜬 서버는 첫 요청에서 CUDA OOM을 냅니다. 오토스케일링을 걸었더니 CPU 사용률이 안 올라서 영원히 1대로 버팁니다. 이 블로그에서는 그동안 맥·DGX Spark 같은 로컬 LLM 서빙 하드웨어 를 주로 비교했는데, 이번에는 반대편, 쿠버네티스 GPU 노드에서 vLLM을 운영할 때 실제로 터지는 지점 을 정리합니다. 앞서 쓴 CrashLoopBackOff 점검 가이드 의 LLM 서빙 실전편이라고 보면 됩니다. 0. 출발점: 최소 매니페스트 vLLM은 OpenAI 호환 API 서버를 내장하고 있어서, 공식 이미지( vllm/vllm-openai )에 모델 이름만 넘기면 8000번 포트로 /v1/chat/completions 를 제공합니다. 아래가 이 글에서 계속 고쳐 나갈 출발점입니다. apiVersion: apps/v1 kind: Deployment metadata: name: vllm-qwen spec: replicas: 1 selector: matchLabels: { app: vllm-qwen } template: metadata: labels: { app: vllm-qwen } spec: containers: - name: vllm image: vllm/vllm-openai:latest # 운영에서는 버전 태그 고정 args: ["--model", "Qwen/Qwen3-8B", "--port", "8000"] ports: - containerPort: 8000 이대로 배포하면 거의 확실하게 아래 7가지 중 몇 개를 만납니다. 1. ...

CrashLoopBackOff, 재시작 버튼 누르기 전에 Exit Code부터 — 137·1·127·0 숫자 하나로 원인 좁히는 Kubernetes 실전 점검 가이드 (OOMKilled·Probe·설정 오류)

이미지
배포 직후 kubectl get pods 를 쳤는데 STATUS에 CrashLoopBackOff , RESTARTS 숫자는 계속 올라갑니다. 이때 가장 흔한 반응은 kubectl delete pod 나 rollout restart 입니다. 그런데 이 순간 지워지는 게 하나 있습니다. 바로 방금 죽은 컨테이너의 흔적 입니다. 지난번 Pod Pending 해결법 이 "스케줄러가 남긴 이벤트를 읽자"였다면, CrashLoopBackOff는 "컨테이너가 남긴 종료 코드를 읽자"입니다. 이 글에서는 Exit Code로 원인을 좁히고, 실무에서 자주 만나는 6가지 패턴을 순서대로 점검하는 방법을 정리합니다. 1. CrashLoopBackOff는 원인이 아니라 '대기 상태'다 CrashLoopBackOff는 "컨테이너가 시작했다가 종료되는 일이 반복되어, kubelet이 다음 재시작을 미루고 있다"는 뜻입니다. 재시작 간격은 10초, 20초, 40초… 식으로 늘어나 최대 5분까지 벌어집니다. 즉 이 상태 이름 자체는 아무것도 알려주지 않습니다. 진짜 정보는 직전에 종료된 컨테이너 에 있습니다. kubectl get pods -n <namespace> kubectl describe pod <pod-name> -n <namespace> describe 출력에서 봐야 할 곳은 두 군데입니다. State: Waiting Reason: CrashLoopBackOff Last State: Terminated Reason: OOMKilled Exit Code: 137 Started: Mon, 26 Oct 2026 19:40:02 +0900 Finished: Mon, 26 Oct 2026 19:40:31 +0900 Restart C...

배포 파이프라인 하나 만들려고 티켓을 몇 장 쓰시나요? GitLab·Argo CD·Jenkins를 한 번에 잇는 DevOps Code Foundry

이미지
한 번의 요청을 GitLab → Argo CD → Jenkins → Kubernetes 배포 흐름으로 바꾸는 셀프서비스 플랫폼 새 서비스 하나를 만들기 위해 티켓을 몇 장이나 쓰고 있나요? 저장소 생성 요청, 브랜치 보호 설정, CI/CD 변수 등록, Argo CD Application 생성, Jenkins 잡 실행, 배포 상태 확인까지. 개발을 시작하기도 전에 여러 팀의 답변을 기다리는 일이 익숙해졌다면 문제는 개발자의 속도가 아닙니다. 진짜 병목은 서비스마다 반복되는 배포 파이프라인 준비 작업입니다. 사람이 매번 같은 설정을 옮겨 적으면 리드타임은 길어지고, 누락과 표준 편차가 쌓이며, 실패했을 때 어디까지 만들어졌는지도 알기 어려워집니다. 그래서 만든 것이 devops-code-foundry입니다. 개발자가 셀프서비스 포털에 앱 이름·팀·템플릿을 입력하면 GitLab 프로젝트부터 GitOps 매니페스트, Jenkins 초기 실행까지 자동으로 프로비저닝하는 플랫폼입니다. 한 줄로 요약하면 devops-code-foundry는 단순한 배포 스크립트가 아닙니다. 플랫폼 팀의 반복 작업을 멱등한 워크플로우로 바꾸고, 개발팀이 기다리지 않고 표준 파이프라인을 만들게 하는 셀프서비스 DevOps 플랫폼 입니다. 개발자 요청 ↓ 즉시 request_id 반환 FastAPI — 인증 · 검증 · 정책 적용 ↓ Argo Workflows — 상태 · 재시도 · 보상 제어 ↓ GitLab → Argo CD(GitOps) → Jenkins ↓ 대상 Kubernetes 클러스터에 애플리케이션 배포 왜 ‘자동화 스크립트’가 아니라 플랫폼인가? 스크립트는 실행한 사람에게만 편리할 수 있습니다. 플랫폼은 입력 규칙, 진행 상태, 실패 복구, 권한, 감사 기록까지 조직의 공통 방식으로 만듭니다. 이 프로젝트가 해결하려는 차이는 다음과 같습니다. 구분 수동 요청 방식 Code Foundry 시작 팀별 티켓과 메시지 포...

RKE2 + Ansible 설치 자동화 스크립트 소개

이미지
Rancher 기반 Kubernetes 클러스터를 보다 쉽게 구축하고 운영하기 위해 Ansible을 활용한 자동화 스크립트를 제공합니다. 본 스크립트를 사용하면 Rancher, Longhorn, CI/CD 툴(GitLab, Jenkins, Argo CD), 데이터베이스(MySQL, PostgreSQL)까지 한 번에 설치할 수 있어 운영의 편의성과 일관성을 높일 수 있습니다. 🔗 GitHub Repository 바로가기 ✅ 개요 Rancher 환경 구축을 위한 Ansible 기반 자동화 스크립트 반복적인 설치 작업을 단순화하고 설치 시간과 실수 가능성 최소화 사용자의 선택에 따라 전체 설치 또는 단일 구성 요소만 설치 가능 삭제 기능까지 포함된 완성도 높은 설치 관리 스크립트 ⚙️ 사용 방법 터미널에서 다음 명령어를 실행하세요: ./INSTALL.sh 스크립트가 실행되면 인터페이스에서 아래와 같은 작업을 선택할 수 있습니다. 🛠️ 주요 기능 설명 기능 구분 설명 전체 설치 Rancher, Longhorn, GitLab, Jenkins, Argo CD, MySQL, PostgreSQL 등 모든 컴포넌트 설치 단일 작업 설치 특정 구성 요소만 설치 (예: Jenkins만 설치) 지정 지점부터 설치 단일 작업 설치 후, 그 이후 작업부터 연속 설치 전체 삭제 위에서 설치한 모든 컴포넌트를 한 번에 삭제 📁 구성 요소 설치되는 주요 오픈소스 솔루션은 다음과 같습니다: Rancher : Kubernetes 관리 플랫폼 Longhorn : 클라우드 네이티브 분산 스토리지 GitLab : Git 저장소 및 DevOps 플랫폼 Jenkins : CI/CD 자동화 도구 Argo CD : GitOps 방식의 Kubernetes 배포 도구 MySQL / PostgreSQL : 오픈소스 관계형 데이터베이스 💡 추가 자동화 요소 group_vars 를 통한 설정 관리 HAProxy를 통한 로드밸런싱 구성 자...