글

라벨이 DevOps인 게시물 표시

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...

오픈클로(OpenClaw) 2026.6.1 → 2026.10.5 업그레이드 후기 — 넉 달 사이 2.0 대개편, Node 24 필수, State DB v20까지 버전별로 달라진 것과 좋아진 점 4가지

이미지
24시간 켜 두고 쓰는 오픈클로(OpenClaw)를 2026.6.1에서 2026.10.5로 한 번에 올렸습니다. 6월 버전에 머물러 있는 사이 OpenClaw 2.0 대개편이 지나갔고, Node 최소 버전이 바뀌었고, 대화 저장소가 SQLite로 통째로 옮겨 갔습니다. 넉 달 치 릴리스를 건너뛰는 업그레이드라 걱정했는데, 결과부터 말하면 Doctor 한 번에 깔끔하게 끝났습니다. 이 글에서는 실제 업그레이드 결과, 그 사이 지나온 릴리스들, 버전별 기능 비교, 그리고 써 보니 좋아진 점을 정리합니다. 아직 6월이나 7월 버전에 머물러 있다면 마지막의 체크리스트만 봐도 됩니다. 오픈클로가 처음이라면 이전 글 메신저 한 줄로 내 PC를 부리는 AI 비서, 오픈클로 를 먼저 보시면 좋습니다. 실제 업그레이드 결과 macOS(Homebrew) 환경에서 진행했고, 바뀐 항목은 여섯 가지입니다. openclaw : 2026.6.1 → 2026.10.5 Node : 22.22.0 → 24.22.0. node@22 를 unlink하고 node@24 를 link했습니다. 2026.9 계열부터 Node 22는 지원 대상에서 빠졌기 때문에 이 단계를 건너뛸 수 없습니다. state DB 스키마 : 1 → 20. 마이그레이션 19단계가 preflight 검사를 정확히 통과한 뒤 적용됐습니다. openclaw.json : 설정 파일은 손대지 않았는데 Config valid로 통과했습니다. Gateway : 2026.10.5 / node@24로 running, 127.0.0.1:18789 에만 바인딩. CLI와 Gateway 버전이 일치합니다. openclaw doctor --fix : Doctor complete. 특히 스키마가 1에서 20으로 한 번에 넘어간 부분이 이번 업그레이드의 핵심입니다. 6월 버전은 2.0 이전이라, 그 사이 세션과 대화 기록을 SQLite로 옮기는 변경이 모두 이번에 한꺼번에 적용됐습니다. 넉 달 사이 지나온 릴...

메신저 한 줄로 내 PC를 부리는 AI 비서, 오픈클로(OpenClaw) — 깃허브 스타 24만 개를 받고도 중국이 금지한 이유와 안전하게 써먹는 활용 방안 6가지

이미지
텔레그램에 "어제 받은 메일 중 답장 안 한 거 정리해줘"라고 한 줄 보냈더니, 내 PC가 메일함을 뒤져 목록을 만들어 보내줍니다. 퇴근길 지하철에서 "서버 로그에 500 에러 있는지 봐줘"라고 보내면 집에 있는 PC가 로그를 읽고 요약해 줍니다. 공상이 아닙니다. 2026년 상반기 깃허브에서 가장 빠르게 별을 모은 프로젝트, 오픈클로(OpenClaw) 가 지금 하고 있는 일입니다. 그런데 같은 프로젝트를 두고 마이크로소프트 CEO는 "바이러스 같다"고 했고, 중국은 국유기업과 은행에서 사용을 막았습니다. 깃허브 스타 24만 개짜리 오픈소스가 왜 이렇게 양극단의 평가를 받는 걸까요. 오늘은 오픈클로가 정확히 무엇인지, 실무에서 어디에 써먹을 수 있는지, 그리고 쓰기 전에 반드시 막아야 할 구멍 이 무엇인지 정리합니다. 오픈클로, 이름이 네 번 바뀐 사연 오픈클로는 오스트리아 개발자 피터 슈타인버거(Peter Steinberger)가 2025년 11월 공개한 오픈소스 AI 에이전트입니다. 처음 이름은 Warelay였고, 이후 Clawdis, Clawdbot을 거쳐 2026년 1월 말 Moltbot이 됐다가 사흘 만에 다시 OpenClaw로 바뀌었습니다. 중간의 개명은 Anthropic의 상표 문제 제기 때문이었고, 마지막 개명은 "Moltbot이 입에 안 붙어서"였습니다. MIT 라이선스로 완전히 무료이고, 2026년 3월 기준 깃허브 스타 24만 7천 개, 포크 4만 7천 개를 기록했습니다. 2월에는 창시자가 OpenAI에 합류하면서 프로젝트는 비영리 재단(OpenClaw Foundation)이 맡게 됐고, 8월 말에는 설치를 쉽게 하고 UI를 새로 짠 OpenClaw 2.0 이 나왔습니다. 기존 챗봇과 결정적으로 다른 점은 하나입니다. 오픈클로는 내 PC(또는 내 서버)에서 돌아가며, 내 파일과 셸과 브라우저를 직접 만집니다. 클라우드 서비스에 질문을 던지는 게 아니라...

배포 파이프라인 하나 만들려고 티켓을 몇 장 쓰시나요? 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 시작 팀별 티켓과 메시지 포...

CLAUDE.md 작성법 7가지 원칙 — 안티패턴 4가지와 Spring Boot SI 템플릿 전문

이미지
클로드 코드(Claude Code)를 팀에 도입하면서 가장 많이 고친 파일이 CLAUDE.md 였습니다. 처음엔 "자세할수록 좋다"고 믿고 길게 썼는데, 결과는 반대였습니다. 이 글은 그 시행착오 끝에 정리한 작성 원칙 7가지와, 금융권 Spring Boot SI 프로젝트용 템플릿 전문입니다. 앞 글 금융권 망분리 환경 도입 5가지 의 후속입니다. CLAUDE.md는 문서가 아니라 지시문입니다 클로드 코드는 세션을 시작할 때 다음 위치의 CLAUDE.md 를 찾아 컨텍스트에 넣습니다. ~/.claude/CLAUDE.md — 개인 전역 (모든 프로젝트에 적용) 프로젝트 루트 CLAUDE.md — 팀 공용, git 커밋 대상 하위 폴더의 CLAUDE.md — 그 폴더의 파일을 다룰 때 추가로 로드 (모노레포에서 유용) CLAUDE.local.md — 개인용, .gitignore 에 넣음 핵심은 두 번째입니다. 프로젝트 루트 CLAUDE.md 하나가 팀 전체에 같은 규칙을 강제 합니다. 이 파일을 읽는 대상은 사람이 아니라 모델이라는 점을 잊지 마세요. 서술문이 아니라 명령문으로, 배경 설명이 아니라 규칙으로 씁니다. 잘 쓰는 CLAUDE.md의 7가지 원칙 1. 짧게. 300줄을 넘기지 않는다 길어질수록 모델이 각 규칙에 주는 가중치가 떨어집니다. 정확히 말하면 길이 자체보다 모든 규칙을 같은 우선순위로 한꺼번에 읽히게 만드는 것 이 문제입니다. 상세 내용은 docs/ 로 빼고 링크만 둡니다. 루트에는 자주 틀리는 치명 규칙과 실행 명령만 남깁니다. 2. "하지 말 것"이 "할 것"보다 중요하다 모델은 기본적으로 뭐든 해 보려 합니다. 금지 목록이 사고를 막습니다. 아래 템플릿마다 "절대 하지 말 것" 섹션이 있는 이유입니다. 그중 정말 치명적인 것(운영 설정 파일 수정, force push, 테스트 삭제)은 CLAUDE.md에 적는 것으로 끝내지 말고 ...

금융권 망분리 환경에서 클로드 코드 도입할 때 실제로 걸리는 5가지 — 보안팀 질문과 대응 설정

이미지
카드사·신용평가사 대형 SI와 멀티클라우드·Kubernetes 운영을 20년 가까이 해 왔고, 최근에는 사내 AI 코딩 도구 도입과 거버넌스(가드레일) 설계를 다루고 있습니다. 이 글은 금융권처럼 망분리·보안 심사가 있는 환경에서 클로드 코드(Claude Code)를 도입할 때 실제로 어디에서 막히고, 무엇을 준비하면 통과하는지를 정리한 것입니다. 도입이 막히는 지점은 기술이 아니라 "질문"입니다 클로드 코드는 파일을 읽고 쓰고, 셸 명령을 실행하고, MCP로 외부 도구까지 부르는 에이전트입니다. 개발자 입장에서는 강력하지만, 정보보호팀 입장에서는 "우리 소스코드와 데이터를 외부로 내보내고, 운영 환경에 명령을 내릴 수 있는 프로그램"입니다. 그래서 심사에서 나오는 질문은 늘 비슷합니다. 이 질문에 설정 파일과 증적으로 답할 수 있으면 통과하고, 말로만 답하면 막힙니다. 보안팀이 반드시 묻는 5가지와 대응 1. 소스코드가 외부로 나가는가? 나갑니다. 이걸 부정하려고 하면 신뢰를 잃습니다. 대신 두 가지를 준비합니다. 첫째, 벤더의 데이터 보존 정책(학습 미사용, 보존 기간) 을 계약 문서·DPA로 확보합니다. 둘째, 나가면 안 되는 파일은 아예 읽지 못하게 설정으로 막습니다. .claude/settings.json 의 permissions.deny 에 .env* , *.pem , *.jks , 운영 프로파일 설정을 넣으면 클로드가 그 파일을 열 수 없습니다. 1번에서 막히면 나머지는 의미가 없으니 계약 확인부터 하세요. 2. 어떤 경로로 나가는가? 망분리 환경에서는 "직접 호출 경로가 막혀 있다"는 것을 증적으로 보여야 합니다. 구성 패턴은 세 가지입니다. 프록시 화이트리스트 : 개발망에서 벤더 API 도메인만 프록시로 허용. 가장 단순하고 빠릅니다. HTTPS_PROXY 환경변수로 클로드 코드가 프록시를 타게 합니다. 사내 LLM 게이트웨이 : 모든 호출을 사내 게이트웨이로 보내고 게이트웨이가 벤...