Despliegue de un servidor web con contenido persistente en Kubernetes

Í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.

comments powered by Disqus

Relacionados

Implantación de aplicaciones web PHP en Docker

Para implantar una aplicación PHP en Docker se genera un entorno LAMP usando varios contenedores a través de un fichero docker-compose como se muestra en este post

Leer

Creación de Deployments en kubernetes

Para crear un despliegue o deployment en Kubernetes se define el recurso en un fichero yaml.

Leer

Creación de usuarios y políticas de seguridad en Debian

En este post se explica, a través de varios casos prácticos y ejemplos, el uso adecuado de los comandos básicos para la creación de usuarios y el establecimiento de políticas de seguridad en los sistemas operativos basados en Debian.

Leer