Introducción: ¿por qué desplegar PHP en Kubernetes?
PHP sigue siendo uno de los lenguajes más populares para el desarrollo web. Sin embargo, a medida que crecen la carga y la complejidad de los proyectos (Laravel, Symfony, Bitrix), el stack LAMP tradicional deja de ser suficiente. Kubernetes (K8s) ofrece una solución: escalado automático, tolerancia a fallos, despliegue con zero-downtime y gestión de configuraciones.
En esta guía analizaremos en la práctica el ciclo completo de despliegue de una aplicación PHP en Kubernetes: desde la creación de la imagen Docker hasta la configuración de Ingress. Aprenderá cómo preparar manifiestos, gestionar variables de entorno y garantizar el funcionamiento de PHP-FPM en el clúster.
1. Preparación de la aplicación PHP y la imagen Docker
1.1. Estructura del proyecto PHP
Para el despliegue necesitaremos una aplicación PHP mínima. Tomemos un index.php clásico:
<?php// index.phpecho "Hello from Kubernetes! PHP version: " . phpversion();También crearemos un composer.json (si usa un framework):
{ "require": { "php": "^8.1" }}1.2. Dockerfile para PHP-FPM
Punto clave: en Kubernetes, PHP funciona a través de PHP-FPM, y Nginx sirve los archivos estáticos. Creemos el Dockerfile:
FROM php:8.2-fpm-alpine
# Instalación de extensiones necesariasRUN docker-php-ext-install pdo_mysql mysqli opcache
# Copiamos el código de la aplicaciónCOPY . /var/www/html
# Permisos de accesoRUN chown -R www-data:www-data /var/www/html
# Configuración de PHPCOPY php.ini /usr/local/etc/php/conf.d/custom.ini
WORKDIR /var/www/html
EXPOSE 9000CMD ["php-fpm"]Para producción, agregue opcache:
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=100001.3. Dockerfile para Nginx
Nginx actuará como proxy para las solicitudes hacia PHP-FPM:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.confCOPY public/ /var/www/html/public
EXPOSE 80Ejemplo de nginx.conf:
server { listen 80; root /var/www/html/public; index index.php;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \\.php$ { fastcgi_pass php-service:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }}2. Creación de manifiestos de Kubernetes
2.1. Namespace
Aislamos nuestra aplicación:
apiVersion: v1kind: Namespacemetadata: name: php-app2.2. ConfigMap para variables de entorno
Las aplicaciones PHP suelen usar variables de entorno (por ejemplo, para la conexión a la base de datos):
apiVersion: v1kind: ConfigMapmetadata: name: php-config namespace: php-appdata: APP_ENV: production APP_DEBUG: "false" DB_HOST: mysql-service2.3. Secret para datos sensibles
Las contraseñas y claves se almacenan en Secret:
apiVersion: v1kind: Secretmetadata: name: php-secrets namespace: php-apptype: Opaquedata: DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 "password123"2.4. Deployment para PHP-FPM
El componente principal es PHP-FPM:
apiVersion: apps/v1kind: Deploymentmetadata: name: php-deployment namespace: php-appspec: replicas: 2 selector: matchLabels: app: php-app template: metadata: labels: app: php-app spec: containers: - name: php-fpm image: my-registry/php-app:latest ports: - containerPort: 9000 envFrom: - configMapRef: name: php-config - secretRef: name: php-secrets resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi