Introduction : pourquoi déployer PHP dans Kubernetes ?
PHP reste l'un des langages les plus populaires pour le développement web. Cependant, avec l'augmentation de la charge et de la complexité des projets (Laravel, Symfony, Bitrix), la pile LAMP traditionnelle ne suffit plus. Kubernetes (K8s) propose une solution : mise à l'échelle automatique, tolérance aux pannes, déploiement sans interruption (zero-downtime) et gestion des configurations.
Dans ce guide, nous allons parcourir en pratique le cycle complet de déploiement d'une application PHP dans Kubernetes : de la création de l'image Docker à la configuration d'Ingress. Vous apprendrez à préparer les manifestes, gérer les variables d'environnement et assurer le fonctionnement de PHP-FPM dans le cluster.
1. Préparation de l'application PHP et de l'image Docker
1.1. Structure du projet PHP
Pour le déploiement, nous aurons besoin d'une application PHP minimale. Prenons le classique index.php :
<?php// index.phpecho "Hello from Kubernetes! PHP version: " . phpversion();Créons également un composer.json (si vous utilisez un framework) :
{ "require": { "php": "^8.1" }}1.2. Dockerfile pour PHP-FPM
Point clé : dans Kubernetes, PHP fonctionne via PHP-FPM, tandis que Nginx sert les fichiers statiques. Créons un Dockerfile :
FROM php:8.2-fpm-alpine
# Installation des extensions nécessairesRUN docker-php-ext-install pdo_mysql mysqli opcache
# Copie du code de l'applicationCOPY . /var/www/html
# Droits d'accèsRUN chown -R www-data:www-data /var/www/html
# Configuration PHPCOPY php.ini /usr/local/etc/php/conf.d/custom.ini
WORKDIR /var/www/html
EXPOSE 9000CMD ["php-fpm"]Pour la production, ajoutez opcache :
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=100001.3. Dockerfile pour Nginx
Nginx va proxyer les requêtes vers PHP-FPM :
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.confCOPY public/ /var/www/html/public
EXPOSE 80Exemple 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. Création des manifestes Kubernetes
2.1. Namespace
Isolons notre application :
apiVersion: v1kind: Namespacemetadata: name: php-app2.2. ConfigMap pour les variables d'environnement
Les applications PHP utilisent souvent des variables d'environnement (par exemple, pour la connexion à la base de données) :
apiVersion: v1kind: ConfigMapmetadata: name: php-config namespace: php-appdata: APP_ENV: production APP_DEBUG: "false" DB_HOST: mysql-service2.3. Secret pour les données sensibles
Les mots de passe et les clés sont stockés dans un Secret :
apiVersion: v1kind: Secretmetadata: name: php-secrets namespace: php-apptype: Opaquedata: DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 "password123"2.4. Deployment pour PHP-FPM
Le composant principal — 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