Despliegue de un servidor web con contenido persistente en Kubernetes
- Francisco Javier Huete
- Servicios
- March 9, 2025
Índice
Para desplegar un servidor o aplicación web que sea persistente, es necesario usar volúmenes en Kubernetes. Para crear un volumen, es necesario contar con un storageClass
definido en el cluster. En este caso, como el cluster se ha creado usando Minikube, incluye, por defecto un storageClass
estándar de tipo hostpath
, que creará los volúmenes que se soliciten al crear un recurso de tipo PersistentVolumeClaim
(PVC)
❯ kubectl get storageclass
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
standard (default) k8s.io/minikube-hostpath Delete Immediate false 8m57s
Para crear un volumen usando este storageClass
se define un recurso de tipo pvc:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-webserver
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
En este caso, para mostrar el funcionamiento de los volúmenes en Kubernetes se despliega un servidor web Apache con el módulo para la ejecución de scripts PHP. Este servidor se define también en un despliegue:
apiVersion: apps/v1
kind: Deployment
metadata:
name: webserver
labels:
app: apache-php
spec:
replicas: 1
selector:
matchLabels:
app: apache-php
template:
metadata:
labels:
app: apache-php
spec:
volumes:
- name: volumen-webserver
persistentVolumeClaim:
claimName: pvc-webserver
containers:
- name: contenedor-apache-php
image: php:7.4-apache
ports:
- name: http-server
containerPort: 80
volumeMounts:
- mountPath: "/var/www/html"
name: volumen-webserver
Para acceder al servidor web también hay que definir un servicio de tipo NodePort en el cluster de Kubernetes.
apiVersion: v1
kind: Service
metadata:
name: webserver
spec:
type: NodePort
ports:
- name: service-http
port: 80
targetPort: http-server
selector:
app: apache-php
Para crear estos recursos en el cluster se usa el comando kubectl apply
.
kubectl apply -f pvc-webserver.yaml
kubectl apply -f webserver-deployment.yaml
kubectl apply -f webserver-service.yaml
Con el comando kubectl describe
se puede averiguar la ruta del equipo local en la que el cluster de Minikube ha creado el directorio montado como volumen en el servidor web.
❯ kubectl describe persistentvolume/pvc-770f4cbd-46f9-4470-972a-7a47a68b3a3f
Name: pvc-770f4cbd-46f9-4470-972a-7a47a68b3a3f
Labels: <none>
Annotations: hostPathProvisionerIdentity: 543b9105-df10-4463-b7ee-1fbe49c4f89c
pv.kubernetes.io/provisioned-by: k8s.io/minikube-hostpath
Finalizers: [kubernetes.io/pv-protection]
StorageClass: standard
Status: Bound
Claim: default/pvc-webserver
Reclaim Policy: Delete
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 2Gi
Node Affinity: <none>
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /tmp/hostpath-provisioner/default/pvc-webserver
HostPathType:
Events: <none>
Con el comando kubectl exec
se copia el fichero info.php al directorio raíz del servidor web.
kubectl exec pod/webserver-8c6677d96-mfsgk -- bash -c "echo '<?php phpinfo(); ?>' > /var/www/html/info.php"
Para acceder al servidor web se usa la ip del cluster de Minikube, el puerto creado con el servicio NodePort y se añade la ruta /info.php/
. Si se elimina el despliegue y se vuelve a crear, el uso de un volumen persistente permite que el contenido del servidor web no cambie.