Servicio de Cron en EKS para aplicaciones PHP

Matias MartinezMatias Martinez
4 min read

TEn este artículo, vamos a explicar cómo crear una imagen Docker basada en Ubuntu 20.08 que ejecute una aplicación PHP simple de "Hello World" y tenga configurado un servicio Cron. Cron será responsable de ejecutar una tarea periódica que escribirá un mensaje en un archivo de log cada minuto. Te mostraremos cómo construir esta imagen, configurar el cron en el contenedor Docker y desplegarla en un entorno Kubernetes (EKS).

¿Qué Necesitamos?

Para seguir esta guía, necesitas:

  • Tener Docker instalado en tu máquina.

  • Contar con un cluster de Kubernetes o un entorno de despliegue similar, como Amazon EKS.

  • Familiaridad básica con la creación de Dockerfiles y contenedores.

Paso 1: Crear el Dockerfile

El Dockerfile será la receta para nuestra imagen Docker, donde configuraremos el sistema operativo base (Ubuntu 20.08), instalaremos las dependencias necesarias como cron y configuraremos el servicio web Apache para la aplicación PHP.

Aquí tienes el Dockerfile:

# Usamos Ubuntu 20.08 como base
FROM ubuntu:20.08

# Instalamos cron, Apache y otras dependencias necesarias
RUN apt update && apt install -y \
    apache2 \
    php \
    cron \
    dos2unix \
    && a2enmod proxy_fcgi \
    && a2enmod rewrite \
    && apt clean all

# Creamos el directorio para nuestra aplicación
RUN mkdir -p /var/www/html/cron \
    && chown www-data:root /var/www/html/cron

# Copiamos el archivo cron que contiene las instrucciones para la tarea programada
COPY cron-app /etc/cron.d/cron-app

# Establecemos los permisos correctos y preparamos el archivo para ser utilizado por cron
RUN chmod 0644 /etc/cron.d/cron-app \
    && dos2unix /etc/cron.d/cron-app \
    && crontab /etc/cron.d/cron-app

# Copiamos un simple archivo PHP de Hello World
COPY index.php /var/www/html/

# Exponemos el puerto 80 para que el servidor Apache esté disponible
EXPOSE 80

# Iniciamos el servicio cron y Apache
CMD ["/bin/sh", "-c", "/etc/init.d/cron start; apache2-foreground"]

Explicación del Dockerfile:

  • Base de Ubuntu 20.08: Utilizamos una imagen de Ubuntu como sistema operativo base.

  • Instalación de Dependencias: Instalamos Apache, PHP y cron para ejecutar nuestra aplicación web y las tareas programadas.

  • Configuración de Apache: Habilitamos módulos necesarios para que Apache funcione correctamente con PHP.

  • Configuración de Cron: Copiamos el archivo cron-app que contiene las instrucciones para la tarea programada, le damos los permisos necesarios y lo preparamos para ser ejecutado.

  • Tarea Cron: La tarea se ejecuta cada minuto y escribe un mensaje en el archivo /tmp/hola_mundo.log.

  • Inicio de Servicios: El contenedor ejecutará cron y Apache al arrancar.

Paso 2: Configurar el Cron

El archivo cron-app define las instrucciones para ejecutar la tarea cron cada minuto. Este archivo debe ser copiado a la imagen Docker y configurado adecuadamente.

Contenido del archivo cron-app:

* * * * * echo "hola mundo - $(date)" >> /tmp/hola_mundo.log

Este archivo indica que cada minuto, el contenedor escribirá "hola mundo" con la hora actual en el archivo /tmp/hola_mundo.log.

Paso 3: Despliegue en Kubernetes (EKS)

Si ya tienes configurado un cluster de Kubernetes, como Amazon EKS, puedes desplegar tu aplicación con el siguiente manifiesto de Kubernetes.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-cron-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: php-cron
  template:
    metadata:
      labels:
        app: php-cron
    spec:
      containers:
      - name: php-cron-container
        image: tu-repositorio/php-cron-app:latest
        imagePullPolicy: IfNotPresent
        command:
          - /bin/sh
          - -c
        args:
          - /etc/init.d/cron start; apache2-foreground
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: "500m"
            memory: "512Mi"
          requests:
            cpu: "250m"
            memory: "256Mi"

Explicación del Deployment en Kubernetes:

  • Deployment: Especificamos un deployment de Kubernetes que gestiona una réplica de nuestro contenedor.

  • imagePullPolicy: Esta directiva asegura que la imagen Docker se descargue solo si no está presente.

  • Comando de Inicio: Arrancamos el servicio cron y luego Apache para que nuestra aplicación y las tareas programadas funcionen simultáneamente.

  • Recursos: Establecemos límites de CPU y memoria para nuestro contenedor.

Paso 4: Crear la Aplicación PHP

Finalmente, necesitamos un archivo index.php que muestre un simple mensaje "Hello World". Este archivo se copiará a nuestro contenedor en el directorio raíz del servidor Apache.

Contenido de index.php:

<?php
echo "Hello World desde PHP!";
?>

Hemos creado una imagen Docker que ejecuta una aplicación PHP con una tarea programada de cron para escribir un mensaje en un archivo de log cada minuto. También mostramos cómo desplegar la aplicación en un cluster de Kubernetes utilizando Amazon EKS.

0
Subscribe to my newsletter

Read articles from Matias Martinez directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Matias Martinez
Matias Martinez

Apasionado por la tecnología con más de 10 años de experiencia. Actualmente trabajando con tecnologías Cloud y Devops. ☁️ AWS Certified Solutions Architect – Associate ☁️ AWS Certified Security – Specialty