# Guía para instalar Portainer CE en Kubernetes con almacenamiento persistente usando local-path-provisioner en Arch Linux

---

## 1. Preparación en Arch Linux (nodos del cluster)

El provisioner `local-path` usa un directorio en el nodo para almacenar datos persistentes. Por defecto usa `/opt/local-path-provisioner`.

### Pasos:

- Asegúrate que en cada nodo físico o VM de tu cluster exista el directorio:

```bash
sudo mkdir -p /opt/local-path-provisioner
````

* Otorga permisos de escritura para evitar problemas de acceso:

```bash
sudo chmod 777 /opt/local-path-provisioner
```

---

## 2. Instalación del provisioner local-path en Kubernetes

Este provisioner permite que PVC con StorageClass `local-path` funcionen, creando volúmenes persistentes usando el directorio de cada nodo.

Ejecuta:

```bash
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml
```

Esto crea:

* Namespace `local-path-storage`
* ServiceAccount, Roles y ClusterRoles para el provisioner
* Deployment del provisioner
* StorageClass `local-path`

---

## 3. Verifica la instalación y que el provisioner esté corriendo

```bash
kubectl get pods -n local-path-storage
kubectl logs -n local-path-storage <nombre-del-pod-local-path-provisioner>
kubectl get storageclass
```

Debes ver el StorageClass `local-path` y el provisioner corriendo sin errores.

---

## 4. Establecer `local-path` como StorageClass por defecto (opcional)

Si deseas que los PVC usen `local-path` por defecto, ejecuta:

```bash
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
```

---

## 5. Crear PersistentVolumeClaim (PVC) para Portainer

Archivo `pvc-portainer.yml`:

```yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: portainer
  namespace: portainer
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
  storageClassName: local-path
```

Aplica el PVC con:

```bash
kubectl apply -f pvc-portainer.yml
```

---

## 6. Instalación y despliegue de Portainer CE

### Usando Helm (recomendado):

```bash
helm repo add portainer https://portainer.github.io/k8s/
helm repo update

helm upgrade --install --create-namespace -n portainer portainer portainer/portainer \
    --set persistence.storageClass=local-path \
    --set persistence.size=50Gi \
    --set image.tag=lts
```

### Usando YAML (alternativo):

```bash
kubectl apply -n portainer -f https://downloads.portainer.io/ce-lts/portainer.yaml
```

---

## 7. Resolución de problemas comunes

* Si el PVC queda en estado `Pending`, verifica que:

  * El provisioner local-path esté corriendo correctamente.
  * El directorio `/opt/local-path-provisioner` exista en todos los nodos y tenga permisos adecuados.
  * No exista un PVC previo con configuración incompatible (en ese caso, elimina el PVC y vuelve a crear).

* Para eliminar PVC problemáticos:

```bash
kubectl delete pvc portainer -n portainer
kubectl apply -f pvc-portainer.yml
```

* El pod de Portainer puede quedar en estado `Pending` si el PVC no está enlazado a un PV.

---

## 8. Verificación final

* Revisa el estado de los pods y servicios:

```bash
kubectl get pods -n portainer
kubectl get svc -n portainer
```

* Accede a Portainer a través del navegador con la IP del nodo y el puerto NodePort asignado (por ejemplo, `https://<IP-Nodo>:30779`).

---

# Resumen de comandos útiles

```bash
# En cada nodo físico o VM
sudo mkdir -p /opt/local-path-provisioner
sudo chmod 777 /opt/local-path-provisioner

# Instalar provisioner local-path
kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml

# Verificar provisión
kubectl get pods -n local-path-storage
kubectl get storageclass

# Opcional: hacer local-path storageclass default
kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

# Crear PVC para Portainer
kubectl apply -f pvc-portainer.yml

# Instalar Portainer con Helm
helm repo add portainer https://portainer.github.io/k8s/
helm repo update
helm upgrade --install --create-namespace -n portainer portainer portainer/portainer --set persistence.storageClass=local-path --set persistence.size=50Gi --set image.tag=lts

# Alternativa: instalar Portainer con YAML
kubectl apply -n portainer -f https://downloads.portainer.io/ce-lts/portainer.yaml

# Si es necesario, eliminar PVC problemático
kubectl delete pvc portainer -n portainer
```

# Arquitectura de la infraestructura

Al final los servicios quedan de esta forma!

[![](https://wiki.grandbastion.dev/uploads/images/gallery/2025-07/scaled-1680-/jmQ56Ya8Ny1hxBbT-image-1752557668820.png)](https://wiki.grandbastion.dev/uploads/images/gallery/2025-07/jmQ56Ya8Ny1hxBbT-image-1752557668820.png)

Y listo tenemos el servicio de portainer corriendo en nuestro baremetal.

[![](https://wiki.grandbastion.dev/uploads/images/gallery/2025-07/scaled-1680-/zx2ITX4vKVGfjWAF-image-1752557733335.png)](https://wiki.grandbastion.dev/uploads/images/gallery/2025-07/zx2ITX4vKVGfjWAF-image-1752557733335.png)

[![](https://wiki.grandbastion.dev/uploads/images/gallery/2025-07/scaled-1680-/I7x16jbET1WYOtFF-image-1752557779168.png)](https://wiki.grandbastion.dev/uploads/images/gallery/2025-07/I7x16jbET1WYOtFF-image-1752557779168.png)