Despliegue de PHP en Kubernetes: guía básica 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?



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=10000


1.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 80


Ejemplo 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-app


2.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-service


2.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                

Blogs

Book Recommendations