Ollama Kubernetes: Endurecimiento de Seguridad

2026.04.04
Technology
761 Words
Ollama Kubernetes: Endurecimiento de Seguridad

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.

Terminal window
kubectl top pod -n ollama

Horizontal Pod Autoscaling (HPA)

HPA es incompatible con esta arquitectura. El PVC ReadWriteOnce y la estrategia Recreate impiden el escalado horizontal.

Alternativas:

  1. Almacenamiento RWX: Cambia a ReadWriteMany (NFS/EFS) y elimina strategy: Recreate
  2. Un modelo por Deployment: Deployments separados por modelo, cada uno con 1 réplica

Patrón de Deployment escalado:

04-ollama-llama3-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: ollama-llama3
namespace: ollama
spec:
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: v1
kind: Service
metadata:
name: ollama-llama3
namespace: ollama
spec:
selector:
app: ollama-llama3
ports:
- port: 11434
targetPort: 11434

Este 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/v1
kind: NetworkPolicy
metadata:
name: ollama-netpol
namespace: ollama
spec:
podSelector:
matchLabels:
app.kubernetes.io/name: ollama
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: api-gateway
ports:
- protocol: TCP
port: 11434

Monitoreo Básico

MétricaUmbral de AlertaPor Qué Importa
container_memory_working_set_bytes> 85% del límitePreviene OOMKilled
container_gpu_memory_usage> 90% de VRAMPreviene fallas de carga
kube_pod_status_ready0 por > 2 minSalud del pod

Agrega dashboards GPU con el NVIDIA DCGM exporter.

Ollama K8s vs. Bare Metal

CaracterísticaBare Metal / VMKubernetes
ProgramaciónManualAfinidad automática de nodos GPU
Aislamientocgroups/systemdLímites de contenedores + cuotas
AlmacenamientoDisco localPVC con snapshot/backup
EscaladoRedimensionamiento manualHPA + cluster autoscaler
DescubrimientoIPs hardcodeadasDNS + Ingress
Seguridad de redFirewallNetworkPolicy + TLS
MonitoreoScriptsPrometheus + Grafana
Multi-modeloInstancia únicaDeployments 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:

Terminal window
kubectl exec -it deployment/ollama -n ollama -- nvidia-smi

Solució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:

ModeloCuantizaciónTamañ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 8x7BQ4_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:

  1. Interfaz de chat: Despliega OpenWebUI.
  2. Escalar rendimiento: vLLM para producción.
  3. Endurecer seguridad: Lee seguridad de LLM self-hosted.
  4. 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

# Ollama # Kubernetes # ia-self-hosted # inferencia-gpu # nvidia # DevOps # Llm