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

Conceptos básicos del gestor de paquetes apt

En este post se recoge un breve resumen sobre la información relativa a los gestores de paquetes apt y aptitude incluida en el manual de referencia de Debian

Leer

Cómo crear una instancia basada en un volumen en OpenStack

OpenStack es un proyecto de cloud computing (computación en la nube) de software libre y código abierto. Ofrece una estructura como servicio (IaaS) y permite virtualizar equipos en los servidores en los que esté configurado. En este post se muestra, a través de un ejemplo práctico cómo se puede crear una instancia basada en un volumen en OpenStack y cómo se puede volcar el contenido de un sistema a un nuevo volumen con mayor capacidad de almacenamiento.

Leer

Construcción de una imagen Docker en un pipeline de Jenkins

Para crear una imagen Docker desde un pipeline de Jenkins es necesario conectar este servicio a la cuenta de DockerHub a la que debe subir la imagen. Para ello, en el menú Administrar Jenkins -> Credenciales -> Global -> Add Credentials se crea una nueva credencial de tipo nombre de usuario y contraseña.

Leer