Ollama Kubernetes: Arquitectura y Componentes

2026.03.29
Technology
436 Words
Ollama Kubernetes: Arquitectura y Componentes

Parte 2 de 4. Parte 1 | Parte 2 | Parte 3 | Parte 4

Visión General de la Arquitectura

Aquí está la arquitectura que desplegarás para Ollama en Kubernetes:

┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Client │────▶│ Ingress │────▶│ Ollama Service │
│ (curl/API) │ │ (nginx/haproxy) │ (ClusterIP) │
└─────────────┘ └──────────────┘ └─────────────────┘
┌─────────────────────────────┘
┌─────────────────┐
│ Ollama Pod │
│ (GPU-enabled) │
└─────────────────┘
┌────────┴────────┐
▼ ▼
┌─────────────┐ ┌──────────────┐
│ NVIDIA GPU │ │ PVC (models)│
│ (Inference)│ │ (Local SSD) │
└─────────────┘ └──────────────┘

Decisiones clave de diseño que he validado en producción:

  • Deployment de réplica única con almacenamiento persistente. El PVC evita re-descargar modelos en cada reinicio.
  • Node affinity apunta a nodos GPU con la etiqueta gpu-type: nvidia.
  • Resource limits evitan OOMKilled durante cargas de modelos grandes.
  • ConfigMap externaliza configuración de Ollama sin reconstruir la imagen.

Paso 1: Crear el Namespace y Resource Quota

El aislamiento por namespace con resource quotas evita que descargas de modelos consuman toda la memoria del cluster.

01-namespace.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ollama
labels:
app.kubernetes.io/name: ollama
app.kubernetes.io/part-of: self-hosted-ai
---
apiVersion: v1
kind: ResourceQuota
metadata:
name: ollama-quota
namespace: ollama
spec:
hard:
requests.cpu: "8"
requests.memory: 64Gi
limits.cpu: "16"
limits.memory: 128Gi
requests.nvidia.com/gpu: "2"
limits.nvidia.com/gpu: "2"
persistentvolumeclaims: "5"

Aplica el manifiesto:

Terminal window
kubectl apply -f 01-namespace.yaml

Paso 2: Configurar Selección de Nodos GPU

Usa etiquetas de nodos con afinidad o taints con tolerations para que los pods de Ollama siempre aterricen en nodos GPU.

Terminal window
kubectl label nodes <gpu-node-name> gpu-type=nvidia accelerator=nvidia-gpu

Estas etiquetas se referencian en el manifiesto del Deployment en la Parte 3. Si tu cluster usa taints, agrega la toleration correspondiente.

Para más detalles sobre programación GPU, consulta mi guía de infraestructura de IA en Kubernetes.

FAQ

¿Qué es el aislamiento por namespace en despliegues de Ollama en Kubernetes?

El aislamiento por namespace significa ejecutar el pod de Ollama y sus recursos en un namespace dedicado con su propio ResourceQuota. Esto evita que descargas de modelos o picos de inferencia consuman recursos asignados a otros equipos o servicios.

¿Por qué usar ResourceQuota para Ollama?

Sin ResourceQuota, una descarga de modelo 70B puede consumir 40 GB de RAM durante la carga, disparando OOMKilled en el nodo y afectando otros pods. He visto clusters completos caer por esto.

¿Cómo funciona la afinidad de nodos GPU con Ollama?

La afinidad usa nodeSelector en el Deployment para asegurar que los pods solo se programen en nodos con GPUs NVIDIA. Sin esto, Kubernetes podría colocar el pod en un nodo CPU, causando inferencia 10-50x más lenta. La Parte 3 muestra el manifiesto completo con ambos patrones.

¿Debo usar node affinity o taints/tolerations?

Uso ambos. nodeSelector asegura que el pod apunte a nodos GPU. Las tolerations manejan nodos con NoSchedule, común en clusters GPU donde las cargas sin GPU deben ser repelidas.

¿Qué pasa si mi nodo GPU se cae?

Con un Deployment de réplica única y PVC ReadWriteOnce, el pod queda en Pending hasta que el nodo se recupere. Para clusters multi-nodo, usa almacenamiento ReadWriteMany (NFS, EFS) y elimina strategy: Recreate. Lo explico en la Parte 4.

Siguientes Pasos

Tu namespace y selección de nodos GPU están configurados. En la Parte 3 despliego el manifiesto completo de producción con PVC, ConfigMap, liveness probes y security context.

Partes de esta serie: ← Parte 1 | Parte 3 →

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