Ollama Kubernetes: Endurecimiento de Seguridad
Tabla de contenidos
Parte 4 de 4. Parte 1 | Parte 2 | Parte 3 | Parte 4
Consideraciones de Producción
Ejecutar Ollama en producción requiere endurecimiento más allá del despliegue básico. Esto es lo que he aprendido de seis clusters de producción.
Límites de Recursos y Prevención de OOM
La huella de memoria de Ollama se dispara al cargar modelos. Un modelo 70B cuantizado a Q4 necesita ~40 GB de RAM del sistema para cargar, más VRAM para capas activas. Establezco limits.memory al menos en 1.5x el requerimiento de RAM de tu modelo más grande.
kubectl top pod -n ollamaHorizontal Pod Autoscaling (HPA)
HPA es incompatible con esta arquitectura. El PVC ReadWriteOnce y la estrategia Recreate impiden el escalado horizontal.
Alternativas:
- Almacenamiento RWX: Cambia a
ReadWriteMany(NFS/EFS) y eliminastrategy: Recreate - Un modelo por Deployment: Deployments separados por modelo, cada uno con 1 réplica
Patrón de Deployment escalado:
apiVersion: apps/v1kind: Deploymentmetadata: name: ollama-llama3 namespace: ollamaspec: replicas: 1 selector: matchLabels: app: ollama-llama3 template: metadata: labels: app: ollama-llama3 spec: nodeSelector: gpu-type: nvidia containers: - name: ollama image: ollama/ollama:0.5.7 env: - name: OLLAMA_KEEP_ALIVE value: "30m" resources: limits: nvidia.com/gpu: "1" memory: "64Gi" volumeMounts: - name: models mountPath: /root/.ollama lifecycle: preStop: exec: command: ["/bin/sh", "-c", "sleep 15"] terminationGracePeriodSeconds: 60 volumes: - name: models emptyDir: {}---apiVersion: v1kind: Servicemetadata: name: ollama-llama3 namespace: ollamaspec: selector: app: ollama-llama3 ports: - port: 11434 targetPort: 11434Este patrón aísla modelos, evita conflictos de PVC y permite escalar cada modelo independientemente.
Network Policies
Restringe el ingress a Ollama solo desde namespaces de confianza:
apiVersion: networking.k8s.io/v1kind: NetworkPolicymetadata: name: ollama-netpol namespace: ollamaspec: podSelector: matchLabels: app.kubernetes.io/name: ollama policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: name: api-gateway ports: - protocol: TCP port: 11434Monitoreo Básico
| Métrica | Umbral de Alerta | Por Qué Importa |
|---|---|---|
container_memory_working_set_bytes | > 85% del límite | Previene OOMKilled |
container_gpu_memory_usage | > 90% de VRAM | Previene fallas de carga |
kube_pod_status_ready | 0 por > 2 min | Salud del pod |
Agrega dashboards GPU con el NVIDIA DCGM exporter.
Ollama K8s vs. Bare Metal
| Característica | Bare Metal / VM | Kubernetes |
|---|---|---|
| Programación | Manual | Afinidad automática de nodos GPU |
| Aislamiento | cgroups/systemd | Límites de contenedores + cuotas |
| Almacenamiento | Disco local | PVC con snapshot/backup |
| Escalado | Redimensionamiento manual | HPA + cluster autoscaler |
| Descubrimiento | IPs hardcodeadas | DNS + Ingress |
| Seguridad de red | Firewall | NetworkPolicy + TLS |
| Monitoreo | Scripts | Prometheus + Grafana |
| Multi-modelo | Instancia única | Deployments por modelo |
Cuándo NO Usar Kubernetes para Ollama
Considera alternativas si:
- Solo necesitas un modelo en una GPU. Una VM o Docker Compose es más simple.
- Tu equipo no tiene experiencia en Kubernetes. Depurar GPUs, PVCs e ingress requiere skills de plataforma.
- La latencia es tu prioridad. Kubernetes añade microsegundos de overhead.
- Necesitas paralelismo multi-GPU. Ollama no hace sharding nativo. Usa vLLM o TensorRT-LLM.
- Tu cluster no tiene GPUs. La inferencia por CPU es 10-50x más lenta.
Solución de Problemas
Error: “GPU not detected” o fallback a CPU
Síntoma: Ollama cae a CPU. Inferencia extremadamente lenta.
Diagnóstico:
kubectl exec -it deployment/ollama -n ollama -- nvidia-smiSolución: Confirma que el device plugin esté activo (kubectl get daemonset -n gpu-operator), revisa el runtime class y verifica nvidia.com/gpu: "1".
Error: “connection reset” o descarga colgada al 0%
Solución: Asegura espacio libre en PVC (~40 GB para modelo 70B). Revisa si un proxy bloquea ollama.com. Reduce OLLAMA_MAX_LOADED_MODELS. Verifica provisión dinámica del StorageClass.
Error: “OOMKilled” durante carga
Solución: Incrementa limits.memory a 1.5x la huella del modelo, usa cuantización menor (Q4 en vez de Q8), o reduce OLLAMA_NUM_PARALLEL.
Error: “ReadWriteOnce volume already mounted”
Solución: El pod anterior no ha terminado. Espera a Terminated o fuerza eliminación: kubectl delete pod <pod-name> -n ollama --force.
Error: “Ingress returns 502”
Solución: Verifica que el selector del Service coincida con labels del pod, que el pod esté Ready y que el ingress controller funcione.
FAQ
¿Puedo desplegar Ollama en Kubernetes sin GPU?
Sí, pero no para producción. Omite nvidia.com/gpu para CPU. Un modelo 7B corre 10-20x más lento en CPU. Para desarrollo con modelos 1-3B, funciona.
¿Cuánto almacenamiento necesito?
Empieza con 100 GB en SSD:
| Modelo | Cuantización | Tamaño |
|---|---|---|
| Llama 3.2 (3B) | Q4_0 | ~2.0 GB |
| Llama 3.1 (8B) | Q4_0 | ~4.7 GB |
| Llama 3.1 (70B) | Q4_0 | ~39 GB |
| Mixtral 8x7B | Q4_K_M | ~31 GB |
¿Cuál es la diferencia entre Ollama y vLLM?
Ollama optimiza experiencia de desarrollador y gestión multi-modelo. vLLM optimiza throughput con PagedAttention y continuous batching. Para alto QPS, usa vLLM. Mi comparativa Ollama vs vLLM tiene el desglose completo.
¿Cómo actualizo Ollama sin perder modelos?
Los modelos persisten en el PVC en /root/.ollama. Cambia el tag de imagen y reaplica el Deployment. Usa kubectl rollout restart deployment/ollama -n ollama.
¿Es Ollama adecuado para plataformas multi-tenant?
Para equipos internos y tráfico moderado, sí. Para multi-tenancy real con rate limiting, usa Kong o Envoy delante de Ollama, o evalúa vLLM.
¿Qué StorageClass funciona mejor?
SSD local (NVMe ideal). NFS/EFS introduce latencia que niega los beneficios de GPU.
Conclusión
Ahora sabes cómo desplegar Ollama en Kubernetes con programación GPU, almacenamiento persistente e ingress. Esta arquitectura es la base de una plataforma de IA self-hosted que mantiene tus datos privados y reduce costos de API.
Pasos siguientes:
- Interfaz de chat: Despliega OpenWebUI.
- Escalar rendimiento: vLLM para producción.
- Endurecer seguridad: Lee seguridad de LLM self-hosted.
- Automatizar: GitOps para IA.
¿Preguntas o casos que no cubrí? Déjalas en los comentarios. Pruebo cada sugerencia en un cluster real.
Partes de esta serie: ← Parte 3