resources/views/pages/frontend/docs/arquitectura-minikube.md
Última modificación: 23 Oct, 2026

Arquitectura en Minikube (Laboratorio K8s Single-Node + Observabilidad)

Minikube permite ejecutar un clúster completo de Kubernetes dentro de un único servidor o máquina virtual de desarrollo (minikube.manu.ti), utilizando Docker como driver de virtualización y manteniendo 100% de compatibilidad con los manifiestos YAML de producción de Mañuti.

Esta guía incluye la configuración de almacenamiento persistente mediante Helm + CSI Driver for NFS, exposición de subdominios con Ingress Addon, túneles maestros para clientes de base de datos (Navicat) y monitoreo en tiempo real con Prometheus, Grafana y Loki.


1. Fase 1: Preparación del Host, Usuario Dedicado y Servidor NFS Local

Ejecuta estos pasos en tu servidor Ubuntu LTS (192.168.1.104):

1.1. Paquetes Base, Usuario manuti y Hostname

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https ca-certificates software-properties-common

# Crear usuario dedicado de administración
sudo useradd -m -s /bin/bash manuti
echo "manuti:kls2qr824" | sudo chpasswd
sudo usermod -aG sudo manuti

# Configurar identidad de red
sudo hostnamectl set-hostname minikube.manu.ti

1.2. Configurar Servidor NFS Local (/srv/nfs/manuti-data)

Para que los PersistentVolumeClaims (PVCs) de MariaDB, MongoDB, Redis, MinIO y Assets funcionen igual que en producción:

sudo apt install -y nfs-kernel-server
sudo mkdir -p /srv/nfs/manuti-data
sudo chown -R nobody:nogroup /srv/nfs/manuti-data
sudo chmod -R 777 /srv/nfs/manuti-data

# Exportar con bandera 'insecure' (Requerida para puertos >1024 desde contenedores Minikube)
echo "/srv/nfs/manuti-data *(rw,sync,no_subtree_check,no_root_squash,insecure)" | sudo tee /etc/exports
sudo exportfs -fv
sudo systemctl restart nfs-kernel-server

2. Fase 2: Instalación de Docker Engine, kubectl, helm y minikube

2.1. Instalar Docker Engine y Asignar Permisos al Usuario manuti

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker manuti

2.2. Instalar kubectl, minikube y helm

# 1. Instalar kubectl
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/

# 2. Instalar Minikube
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube

# 3. Instalar Helm 3 (Gestor de paquetes de Kubernetes)
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | sudo bash

3. Fase 3: Arranque del Clúster, Addons y CSI Driver para NFS

Cambia a la sesión del usuario manuti (su - manuti o newgrp docker) y levanta el clúster:

# 1. Iniciar Minikube asignando recursos dedicados
minikube start --driver=docker --cpus=4 --memory=8192 --disk-size=80g

# 2. Habilitar Addons esenciales
minikube addons enable ingress
minikube addons enable ingress-dns
minikube addons enable metrics-server

# 3. Verificar estado del nodo
kubectl get nodes

3.1. Instalar el Controlador Oficial CSI para NFS vía Helm

helm repo add csi-driver-nfs https://raw.githubusercontent.com/kubernetes-csi/csi-driver-nfs/master/charts
helm repo update

helm install csi-driver-nfs csi-driver-nfs/csi-driver-nfs \
    --namespace kube-system \
    --version v4.9.0

3.2. Registrar la StorageClass (nfs-desarrollo)

cat <<EOF | kubectl apply -f -
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-desarrollo
provisioner: nfs.csi.k8s.io
parameters:
  server: 192.168.1.104
  share: /srv/nfs/manuti-data
reclaimPolicy: Delete
volumeBindingMode: Immediate
mountOptions:
  - nfsvers=4.1
EOF

4. Fase 4: Despliegue Secuencial del Ecosistema Mañuti (manuti-v12)

4.1. Crear Namespace y Secreto de Registro (ghcr.io)

kubectl create namespace manuti-v12
kubectl config set-context --current --namespace=manuti-v12

kubectl create secret docker-registry ghcr-secret \
  --docker-server=ghcr.io \
  --docker-username=manuelemiliano \
  --docker-password=TU_PAT_GITHUB \
  [email protected]

4.2. Regla de Ingress Multi-Dominio (manuti-ingress.yaml)

Enruta el tráfico hacia la aplicación web, la consola administrativa de MinIO y el CDN de objetos:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: manuti-v12-ingress
  namespace: manuti-v12
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/proxy-body-size: "50m"
spec:
  rules:
  - host: web.minikube.manu.ti
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-externo
            port: { number: 80 }
  - host: minio.minikube.manu.ti
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: minio-externo
            port: { number: 9001 }
  - host: cdn.minio.minikube.manu.ti
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: minio-externo
            port: { number: 9000 }

4.3. Ejecución Ordenada de Manifiestos

# Fase 1 y 2: Configuración, PVCs y Motores de Datos
kubectl apply -f manuti-config.yaml
kubectl apply -f manuti-storage.yaml
kubectl apply -f manuti-dbs.yaml
kubectl apply -f manuti-acceso-externo.yaml

# Fase 3 y 4: Jobs de Inicialización y Servicios Backend (Reverb & Horizon)
kubectl apply -f manuti-migrate-job.yaml
kubectl apply -f manuti-minio-setup.yaml
kubectl apply -f manuti-reverb-service.yaml
kubectl apply -f manuti-reverb.yaml
kubectl apply -f manuti-worker.yaml

# Fase 5: Capa Web PHP-FPM, Copia de Assets, Gateway Nginx e Ingress
kubectl apply -f manuti-nginx-config.yaml
kubectl apply -f manuti-web-internal-svc.yaml
kubectl apply -f manuti-web.yaml
kubectl apply -f manuti-copy-assets-job.yaml
kubectl apply -f manuti-nginx-gateway.yaml
kubectl apply -f manuti-web-external-svc.yaml
kubectl apply -f manuti-ingress.yaml

5. Fase 5: Túneles de Acceso Externo (Web, Dashboard y Navicat)

Debido a que Minikube corre dentro de una red interna de Docker (192.168.49.2), exponemos el tráfico hacia la red LAN (192.168.1.104) mediante los siguientes puentes:

5.1. Túnel HTTP para el Ingress Controller (Acceso Web desde la LAN)

# Ejecutar en segundo plano en el servidor Ubuntu:
sudo nohup kubectl --kubeconfig=/home/manuti/.kube/config port-forward --address 0.0.0.0 -n ingress-nginx service/ingress-nginx-controller 80:80 > ingress.log 2>&1 &

(Permite acceder desde cualquier PC en la red a http://web.minikube.manu.ti y http://minio.minikube.manu.ti).

5.2. Túnel para el Dashboard Oficial de Minikube

nohup minikube dashboard --url > dashboard.log 2>&1 &
nohup kubectl proxy --address='0.0.0.0' --port=8001 --accept-hosts='^.*$' > proxy.log 2>&1 &
  • URL de acceso: http://192.168.1.104:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/

5.3. Túnel Maestro SSH para Bases de Datos (Desde Windows / Navicat)

Ejecuta este comando en el PowerShell de tu PC Windows para conectar clientes gráficos directamente a los NodePort internos de Minikube (192.168.49.2):

ssh -L 30306:192.168.49.2:30306 -L 30017:192.168.49.2:30017 -L 30379:192.168.49.2:30379 [email protected]
Motor de Datos Host en Navicat / Compass Puerto Local Destino en Minikube
MariaDB 127.0.0.1 30306 192.168.49.2:30306
MongoDB 127.0.0.1 30017 192.168.49.2:30017
Redis 127.0.0.1 30379 192.168.49.2:30379

6. Fase 6: Observabilidad con Prometheus y Grafana (monitoring)

6.1. Instalación Ligera con Helm

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install monitor prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace \
  --set grafana.enabled=true \
  --set prometheus.enabled=true \
  --set alertmanager.enabled=false

6.2. Exponer Grafana vía Ingress (grafana-ingress.yaml)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: grafana-ingress
  namespace: monitoring
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: monitor.minikube.manu.ti
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: monitor-grafana
            port: { number: 80 }

6.3. Obtener la Contraseña de admin de Grafana

kubectl get secret -n monitoring monitor-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
Edita este documento en >> arquitectura-minikube.md
← Volver a la Landing Page