AnibalOSanibal@core disponible
← cd ~/manual

Fase 8 · Almacenamiento persistente con Longhorn

Volúmenes replicados y PostgreSQL persistente en K3s.

Longhorn es una solución de almacenamiento en bloque ligero, altamente disponible y 100% Open Source (proyecto graduado de la CNCF) diseñada para Kubernetes/K3s. Permite crear volúmenes de almacenamiento persistente replicados entre múltiples nodos trabajadores.

8.1 Instalar Dependencias en los Nodos K3s

Longhorn requiere los paquetes open-iscsi y nfs-common instalados en las VMs de Linux. Puedes ejecutarlo mediante Ansible o SSH en los nodos:

sudo apt-get update && sudo apt-get install -y open-iscsi nfs-common

8.2 Desplegar Longhorn en K3s

Ejecuta el manifiesto oficial de Longhorn para instalar el controlador en el namespace longhorn-system:

export KUBECONFIG=~/Documents/infra-proxmox/kubeconfig
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.7.2/deploy/longhorn.yaml

(Verifica que los pods estén listos con kubectl get pods -n longhorn-system).

8.3 Exponer la Interfaz Gráfica (UI) de Longhorn

Para supervisar volúmenes, réplicas y realizar copias de seguridad (snapshots), aplica un Ingress para la consola web de Longhorn:

cat <<EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: longhorn-ingress
  namespace: longhorn-system
spec:
  ingressClassName: traefik
  rules:
  - http:
      paths:
      - path: /longhorn
        pathType: Prefix
        backend:
          service:
            name: longhorn-frontend
            port:
              number: 80
EOF

Accede desde tu navegador a: http://192.168.1.201/longhorn.

8.4 Configurar PostgreSQL con Volúmenes Persistentes de Longhorn

Para que la base de datos PostgreSQL conserve los datos ante reinicios o migración de pods entre nodos, edita apps/01-infra/postgres-redis.yaml añadiendo la sección volumeClaimTemplates:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
  namespace: default
spec:
  serviceName: postgres-service
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:16-alpine
        env:
        - name: POSTGRES_DB
          value: microcoreos
        - name: POSTGRES_USER
          value: postgres
        - name: POSTGRES_PASSWORD
          value: postgres
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: postgres-storage
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: postgres-storage
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "longhorn"
      resources:
        requests:
          storage: 5Gi

Al guardar y hacer git push, ArgoCD creará automáticamente un PVC de 5 GB respaldado por Longhorn con almacenamiento persistente distribuido.