Déploiement PHP sur Kubernetes : guide pratique de base

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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


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


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


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


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

Blogs

Book Recommendations