Aprovisionamiento dinámico de volúmenes
Desde el punto de vista del desarrollador que necesita almacenamiento para su aplicación, este realizará una petición de un volumen (objeto PersistentVolumeClaim) y usando algún mecanismo que haya configurado el administrador del clúster se asociará un volumen a esa petición.
En este ejemplo vamos a desplegar un servidor web que va a servir una página html que tendrá almacenada en un volumen. La asignación del volumen se va a realizar de forma dinámica.
Como vimos en CRC tenemos configurado un recurso StorageClass, que de forma dinámica van a crear el nuevo volumen de tipo hostPath y lo asocian a la petición de volumen que vamos a realizar.
oc get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
crc-csi-hostpath-provisioner (default) kubevirt.io.hostpath-provisioner Delete WaitForFirstConsumer false 36d
Solicitud del volumen
Vamos a realizar la solicitud de volumen, en este caso usaremos el fichero pvc.yaml:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
Al crear el objeto PersistentVolumenClaim (PVC), veremos que se queda en estado Pending, no se creará el objeto PersistentVolume (PV) hasta que no lo vayamos a usar por primera vez:
oc login -u developer -p developer https://api.crc.testing:6443
oc new-project almacenamiento
oc apply -f pvc.yaml
oc get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Pending crc-csi-hostpath-provisioner 2s
Podemos ver las características del objeto que hemos creado, ejecutando:
oc describe pvc my-pvc
Uso del volumen
Creamos el Deployment usando el fichero deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: bitnami/nginx
name: contenedor-nginx
ports:
- name: http
containerPort: 8080
volumeMounts:
- name: my-volumen
mountPath: /app
securityContext:
runAsNonRoot: true
allowPrivilegeEscalation: false
seccompProfile:
type: RuntimeDefault
capabilities:
drop:
- ALL
volumes:
- name: my-volumen
persistentVolumeClaim:
claimName: my-pvc
- En la especificación del Pod, además de indicar el contenedor, hemos indicado que va a tener un volumen (campo
volumes). - En realidad, definimos una lista de volúmenes (en este caso solo definimos uno) indicando su nombre (
name) y la solicitud del volumen (persistentVolumeClaim-claimName). - Además en la definición del contenedor tendremos que indicar el punto de montaje del volumen (
volumeMounts) señalando el directorio del contenedor (mountPath) y el nombre (name).
Creamos el Deployment:
oc apply -f deployment.yaml
Ya podemos comprobar que se ha asociado un volumen a la solicitud de volumen:
oc get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
my-pvc Bound pvc-69e0a042-6964-45aa-b06e-73a2f620b1bb 30Gi RWO crc-csi-hostpath-provisioner 2m25s
También podemos verlos desde el punto de vista del administrador para poder listar los objetos PeristentVolume:
oc login -u kubeadmin https://api.crc.testing:6443
oc project developer
oc get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-69e0a042-6964-45aa-b06e-73a2f620b1bb 30Gi RWO Delete Bound developer/my-pvc crc-csi-hostpath-provisioner 2m38s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/my-pvc Bound pvc-69e0a042-6964-45aa-b06e-73a2f620b1bb 30Gi RWO crc-csi-hostpath-provisioner 4m22s
Nota: Los objetos PersistentVolumeClaim están asociados a un proyecto (en nuestro caso developer/my-pvc). Sin embargo, los objetos PersistentVolume no pertenecen a un proyecto, son globales al clúster de OpenShift.
Seguimos trabajando con el usurio developer, y creamos un fichero index.html:
oc login -u developer -p developer https://api.crc.testing:6443
oc exec deploy/nginx -- bash -c "echo '<h1>Curso de OpenShift</h1>' > /app/index.html"
Finalmente creamos el Service y el Route para acceder al despliegue:
oc expose deploy/nginx
oc expose service/nginx

Podemos comprobar que la información de la aplicación no se pierde borrando el Deployment y volviéndolo a crear, comprobando que se sigue sirviendo el fichero index.html.
Eliminación del volumen
En este caso, los volúmenes que crea de forma dinámica el StorageClass tiene como política de reciclaje el valor de Delete. Esto significa que cuando eliminemos la solicitud, el objeto PersistentVolumeClaim, también se borrará el volumen, el objeto PersistentVolume.
oc delete deploy/nginx
oc delete persistentvolumeclaim/my-pvc