llm-stack 네임스페이스에 Open WebUI · LiteLLM · Ollama · PostgreSQL 을 올리고, 외부 노출은 Open WebUI 만 리버스 프록시를 거쳐 한다.
default-deny 정책이 네임스페이스 전체에 걸려 있으면 뒤에 정의한 allow-* 정책이 빠짐없이 완전해야 통신이 된다. 제약을 쓰지 않기로 했다면 일부만 남기지 말고 전량 삭제하는 편이 명확하다.
kubectl get networkpolicy -n llm-stack
kubectl delete -f 50-networkpolicy.yaml
# 또는
kubectl delete networkpolicy --all -n llm-stack
kubectl get networkpolicy -n llm-stack # No resources found
default-deny 만 지우고 개별 allow 를 남기는 방법도 동작은 한다. NetworkPolicy 의 셀렉터에 걸리지 않는 Pod 은 기본 허용이기 때문이다. 다만 남은 정책이 무엇을 막는지 계속 따져야 하므로 관리 부담만 늘어난다. PostgreSQL 보호가 필요하면 NetworkPolicy 대신 ClusterIP 유지 · pg_hba.conf · listen_addresses 로 제한한다.
LiteLLM Connection 등록까지 끝났는데 모델 목록이 비어 있으면 아래 순서로 본다.
| 순위 | 원인 | 확인 |
|---|---|---|
| 1 | Connection URL 끝에 /v1 누락 |
Open WebUI 는 <base>/models 를 호출한다. http://litellm:4000/v1 이어야 한다 |
| 2 | API Key 불일치 | LiteLLM 의 master_key 또는 virtual key 가 Connection 에 들어갔는지 |
| 3 | config.yaml 의 model_list 가 비어 있음 |
ConfigMap 확인 |
| 4 | Admin → Models 에서 숨김 상태 | 토글 확인 |
| 5 | 등록 섹션 오류 | LiteLLM 은 Ollama 가 아니라 OpenAI API 섹션에 등록한다 |
| 6 | 서비스 이름 · DNS | litellm.llm-stack.svc.cluster.local |
| 7 | 사용자 · 그룹 권한 | Open WebUI 의 모델 접근 권한 |
가장 확실한 진단은 Open WebUI Pod 에서 직접 호출해 보는 것이다.
kubectl -n llm-stack exec deploy/open-webui -- \
curl -sS -H "Authorization: Bearer ${LITELLM_KEY}" http://litellm:4000/v1/models
Ollama 모델은 ollama/ 접두사를 붙이고 api_base 를 클러스터 내부 주소로 준다.
model_list:
- model_name: llama3.2
litellm_params:
model: ollama/llama3.2:3b-instruct-q4_K_M
api_base: http://ollama:11434
- model_name: gemma
litellm_params:
model: ollama/gemma:latest
api_base: http://ollama:11434
모델을 미리 받아 둔다.
kubectl -n llm-stack exec -it deploy/ollama -- ollama pull llama3.2:3b-instruct-q4_K_M
kubectl -n llm-stack exec -it deploy/ollama -- ollama list
model_name 은 ollama list 의 태그와 정확히 맞춰야 한다. 다르면 LiteLLM 이 모델을 찾지 못하고 목록에서 빠진다.
기동 로그에 PrismaClient.check_view_exists() 관련 예외(Task exception was never retrieved)가 보이는 경우가 있다. LiteLLM 이 사용량 집계용 뷰를 만들려다 권한이나 스키마 문제로 실패한 것으로, 프록시 기능 자체는 동작한다. 사용량 대시보드가 필요하면 DB 사용자에게 뷰 생성 권한을 주고 재기동한다.