Despliegue de PHP en Kubernetes: guía básica para principiantes
\n\nKubernetes (K8s) se ha convertido en el estándar de facto para la orquestación de contenedores. Si eres desarrollador PHP, tarde o temprano te enfrentarás a la necesidad de desplegar tu aplicación en un clúster. En esta guía, analizaremos cómo convertir una aplicación PHP común en un servicio completo que se ejecute bajo Kubernetes. Aprenderá cómo preparar una imagen Docker, escribir manifiestos y ejecutar todo esto en un clúster local (por ejemplo, Minikube).
\n\nUsaremos el combo clásico: PHP-FPM para procesar scripts PHP y NGINX como servidor web. Esto nos permitirá lograr un alto rendimiento y flexibilidad.
\n\n1. Preparación de la aplicación PHP y la imagen Docker
\n\nEl primer paso es empaquetar su código PHP en un contenedor Docker. Crearemos dos imágenes: una para PHP-FPM y otra para NGINX (o usaremos una imagen con un supervisor, pero para principiantes es más fácil separarlas).
\n\nCree un archivo Dockerfile para PHP-FPM:
FROM php:8.2-fpm-alpine\n\n# Instalamos extensiones\nRUN docker-php-ext-install pdo_mysql mysqli opcache\n\n# Copiamos el código de la aplicación\nCOPY . /var/www/html\n\n# Configuración de PHP\nCOPY php.ini /usr/local/etc/php/conf.d/custom.ini\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\nPara NGINX, cree un Dockerfile separado:
FROM nginx:alpine\n\n# Copiamos la configuración\nCOPY nginx.conf /etc/nginx/nginx.conf\nCOPY default.conf /etc/nginx/conf.d/default.conf\n\n# Archivos estáticos (si los hay)\nCOPY public/ /var/www/html/public/\n\nEXPOSE 80\nCMD ["nginx", "-g", "daemon off;"]\n\nNo olvide el archivo default.conf para NGINX, que redirige las solicitudes a PHP-FPM:
server {\n listen 80;\n server_name _;\n root /var/www/html/public;\n index index.php;\n\n location / {\n try_files $uri $uri/ /index.php?$args;\n }\n\n location ~ \\.php$ {\n fastcgi_pass php-service:9000; # nombre del servicio en K8s\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}\n\nConstruya las imágenes con el comando:
\n\ndocker build -t my-php-app:latest -f Dockerfile.php .\ndocker build -t my-nginx:latest -f Dockerfile.nginx .\n\n2. Fundamentos de Kubernetes: Pods, Deployments y Services
\n\nAntes de escribir manifiestos, comprendamos los objetos básicos de K8s:
\n\n- \n
- Pod — la unidad mínima de despliegue, uno o más contenedores. \n
- Deployment — gestiona las réplicas de los Pods, proporciona actualizaciones y reversiones. \n
- Service — un punto de acceso estable a los Pods (dentro del clúster o desde fuera). \n
Para nuestra aplicación PHP, crearemos dos Deployments: uno para PHP-FPM y otro para NGINX. Luego los conectaremos a través de un Service interno.
\n\n3. Escritura de manifiestos para PHP y NGINX
\n\nCree un archivo php-deployment.yaml:
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n name: php-app\nspec:\n replicas: 2\n selector:\n matchLabels:\n app: php-app\n template:\n metadata:\n labels:\n app: php-app\n spec:\n containers:\n - name: php-fpm\n image: my-php-app:latest\n ports:\n - containerPort: 9000\n env:\n - name: DB_HOST\n value: "mysql-service" # ejemplo de variable de entorno\n - name: DB_NAME\n value: "mydb"\n resources:\n requests:\n memory: "128Mi"\n cpu: "250m"\n limits:\n memory: "256Mi"\n cpu: "500m"\n---\napiVersion: v1\nkind: Service\nmetadata:\n name: php-service\nspec:\n selector:\n app: php-app\n ports:\n - protocol: TCP\n port: 9000\n targetPort: 9000\n\nAhora cree