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

Despliegue de una aplicación PHP en Kubernetes

En este post se documenta el despliegue de la aplicación Let`s Chat en Kubernetes.

Leer

Configuración NAT en routers Cisco en GNS3

NAT (Network Address Translation o traducción de direcciones de red) es un mecanismo que consiste en modificar la información de direccionamiento en los paquetes IP que atraviesan un router. En este post se muestra un ejemplo de configuración de este mecanismo en un escenario de GNS3.

Leer

Configuración NAT en routers Mikrotik en Openstack

En este post se configura el funcionamiento del NAT en una red creada en Openstack que usa routers Mikrotik. NAT (Network Address Translation o traducción de direcciones de red) es un mecanismo que consiste en modificar la información de direccionamiento en los paquetes IP que atraviesan un router.

Leer