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:
sudo mkdir -p /opt/local-path-provisioner
- Otorga permisos de escritura para evitar problemas de acceso:
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:
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
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:
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
:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: portainer
namespace: portainer
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
storageClassName: local-path
Aplica el PVC con:
kubectl apply -f pvc-portainer.yml
6. Instalación y despliegue de Portainer CE
Usando Helm (recomendado):
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):
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:
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:
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
# 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!
Y listo tenemos el servicio de portainer corriendo en nuestro baremetal.