Despliegue de PHP en Kubernetes: guía básica
El desarrollo web moderno requiere cada vez más soluciones escalables y tolerantes a fallos. Kubernetes (K8s) se ha convertido en el estándar de facto para la orquestación de contenedores. Si eres desarrollador PHP y quieres aprender a desplegar tus aplicaciones en Kubernetes, esta guía es para ti. Recorreremos el camino desde la creación de una imagen Docker hasta el despliegue de un servicio PHP completo en un clúster.
¿Por qué desplegar PHP en Kubernetes?
Kubernetes ofrece una serie de ventajas para las aplicaciones PHP:
- Escalado automático: K8s puede aumentar el número de pods cuando la carga crece y reducirlo cuando disminuye.
- Autocuración: Si un contenedor falla, Kubernetes lo reinicia automáticamente.
- Gestión de configuración: Las variables de entorno y los archivos de configuración se centralizan fácilmente mediante ConfigMap y Secrets.
- Simplicidad en las actualizaciones: Las Rolling updates permiten actualizar la aplicación sin tiempo de inactividad.
Para PHP esto es especialmente relevante, ya que muchos proyectos heredados son difíciles de escalar con métodos tradicionales.
Paso 1: Contenerización de la aplicación PHP
Antes de desplegar la aplicación en Kubernetes, hay que empaquetarla en una imagen Docker. Veamos un ejemplo de una aplicación PHP simple usando Nginx y PHP-FPM.
Creando la estructura del proyecto
my-php-app/├── src/│ └── index.php├── docker/│ ├── nginx/│ │ └── default.conf│ └── php/│ └── Dockerfile└── docker-compose.ymlEjemplo de src/index.php
<?phpecho "Hello from PHP on Kubernetes!";phpinfo();?>Dockerfile para PHP-FPM
FROM php:8.2-fpm-alpine
RUN docker-php-ext-install pdo pdo_mysql
COPY src/ /var/www/html/
EXPOSE 9000CMD ["php-fpm"]Configuración de Nginx (docker/nginx/default.conf)
server { listen 80; server_name localhost; root /var/www/html;
location / { try_files $uri $uri/ /index.php?$query_string; }
location ~ \\.php$ { fastcgi_pass php:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }}Construcción de la imagen
docker build -t my-php-app:latest -f docker/php/Dockerfile .Paso 2: Escritura de los manifiestos de Kubernetes
Ahora que la imagen está lista, crearemos los manifiestos para el despliegue en el clúster.
Deployment para PHP-FPM
apiVersion: apps/v1kind: Deploymentmetadata: name: php-app labels: app: php-appspec: replicas: 3 selector: matchLabels: app: php-app template: metadata: labels: app: php-app spec: containers: - name: php-fpm image: my-php-app:latest ports: - containerPort: 9000 env: - name: DB_HOST value: "mysql-service" - name: DB_NAME value: "mydb" resources: requests: memory: "128Mi" cpu: "250m" limits: memory: "256Mi" cpu: "500m"Deployment para Nginx
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx labels: app: nginxspec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:alpine ports: - containerPort: 80 volumeMounts: - name: nginx-config mountPath: /etc/nginx/conf.d volumes: - name: nginx-config configMap: name: nginx-config