Despliegue de PHP en Kubernetes: guía paso a paso en la práctica

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: ¿Por qué desplegar PHP en Kubernetes?

\n\n

Muchos desarrolladores todavía perciben PHP como un lenguaje para hosting «clásico» con FTP y phpMyAdmin. Sin embargo, en la cultura DevOps moderna, las aplicaciones PHP se ejecutan cada vez más en contenedores, y su gestión recae en Kubernetes (K8s). Esto no solo proporciona escalado automático y tolerancia a fallos, sino también uniformidad del entorno en todas las etapas, desde el desarrollo hasta la producción.

\n\n

En esta guía, analizaremos en la práctica cómo preparar un proyecto PHP para su despliegue en Kubernetes: desde la creación de una imagen Docker hasta la escritura de manifiestos y la ejecución en el clúster. Aprenderá cómo hacer que el contenedor sea ligero, cómo configurar correctamente php-fpm y cómo vincularlo todo con Nginx. ¡Vamos allá!

\n\n

Paso 1: Preparación de la aplicación PHP y la imagen Docker

\n\n

Antes de cargar el código en K8s, debe empaquetarlo en una imagen Docker. Consideremos un proyecto PHP típico en PHP puro (sin framework): un script simple que muestra un saludo y phpinfo.

\n\n

1.1. Estructura del proyecto

\n\n

Creemos una estructura mínima:

\n\n
my-php-app/\n├── src/\n│   └── index.php\n├── docker/\n│   ├── php.Dockerfile\n│   └── nginx.conf\n└── k8s/\n    ├── deployment.yaml\n    └── service.yaml\n
\n\n

1.2. Código de la aplicación PHP

\n\n

Archivo src/index.php:

\n\n
<?php\necho "<h1>¡Hola, Kubernetes!</h1>";\necho "<p>Versión de PHP: " . phpversion() . "</p>";\necho "<p>Servidor: " . gethostname() . "</p>";\n?>\n
\n\n

1.3. Dockerfile para PHP-FPM

\n\n

Creemos docker/php.Dockerfile:

\n\n
FROM php:8.2-fpm-alpine\n\n# Instalamos dependencias (si son necesarias)\nRUN docker-php-ext-install pdo pdo_mysql\n\n# Copiamos el código de la aplicación\nCOPY ./src /var/www/html\n\n# Permisos de acceso (importante para FPM)\nRUN chown -R www-data:www-data /var/www/html\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n
\n\n

¿Por qué alpine? Proporciona una imagen de ~30 MB en lugar de 200+ MB en Debian. Esto es crítico para una carga rápida en el clúster.

\n\n

1.4. Configuración de Nginx

\n\n

PHP-FPM no puede servir contenido estático directamente: se necesita un servidor web. Creemos docker/nginx.conf:

\n\n
server {\n    listen 80;\n    server_name _;\n    root /var/www/html;\n\n    index index.php index.html;\n\n    location / {\n        try_files $uri $uri/ /index.php?$query_string;\n    }\n\n    location ~ \\.php$ {\n        fastcgi_pass 127.0.0.1:9000;\n        fastcgi_index index.php;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n}\n
\n\n

En Kubernetes, ejecutaremos Nginx y PHP-FPM en un mismo Pod (como contenedores sidecar) o como servicios separados. Para simplificar, usaremos un Pod con dos contenedores.

\n\n

Paso 2: Compilación y publicación de las imágenes

\n\n

Compilaremos la imagen PHP-FPM y la imagen Nginx con nuestra configuración. En un proyecto real, se podría usar una sola imagen combinando Nginx y PHP con supervisord, pero lo haremos «correctamente»: las separaremos.

\n\n

Compilación de la imagen PHP:

\n
docker build -t my-php-app:latest -f docker/php.Dockerfile .\n
\n\n

Compilación de la imagen Nginx:

\n

Creemos un Dockerfile separado para Nginx:

\n
FROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n
\n\n
docker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n
\n\n

Luego, suba las imágenes al registry (Docker Hub, GitLab Container Registry, etc.):

\n
docker tag my-php-app:latest your-registry/my-php-app:latest\ndocker push your-registry/my-php-app:latest\n
\n\n

Paso 3: Manifiestos de Kubernetes

\n\n

Ahora viene lo más interesante: describiremos cómo Kubernetes ejecutará nuestra aplicación.

\n\n

3.1. Deployment (manifiesto principal

Blogs

Book Recommendations