Déploiement PHP sur Kubernetes : guide de base pour débutants

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

Déploiement PHP sur Kubernetes : guide de base pour débutants

\n\n

Kubernetes (K8s) est devenu le standard de facto pour l'orchestration de conteneurs. Si vous êtes développeur PHP, vous serez tôt ou tard confronté à la nécessité de déployer votre application dans un cluster. Dans ce guide, nous allons voir comment transformer une application PHP classique en un service complet fonctionnant sous Kubernetes. Vous apprendrez à préparer une image Docker, à rédiger des manifestes et à exécuter le tout dans un cluster local (par exemple, Minikube).

\n\n

Nous utiliserons la combinaison classique : PHP-FPM pour le traitement des scripts PHP et NGINX comme serveur web. Cela nous permettra d'obtenir des performances et une flexibilité élevées.

\n\n

1. Préparation de l'application PHP et de l'image Docker

\n\n

La première étape consiste à empaqueter votre code PHP dans un conteneur Docker. Nous allons créer deux images : une pour PHP-FPM, une pour NGINX (ou utiliser une seule image avec un superviseur, mais pour les débutants, il est plus simple de les séparer).

\n\n

Créez un fichier Dockerfile pour PHP-FPM :

\n\n
FROM php:8.2-fpm-alpine\n\n# Installer les extensions\nRUN docker-php-ext-install pdo_mysql mysqli opcache\n\n# Copier le code de l'application\nCOPY . /var/www/html\n\n# Paramètres PHP\nCOPY php.ini /usr/local/etc/php/conf.d/custom.ini\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]
\n\n

Pour NGINX, créez un Dockerfile séparé :

\n\n
FROM nginx:alpine\n\n# Copier la configuration\nCOPY nginx.conf /etc/nginx/nginx.conf\nCOPY default.conf /etc/nginx/conf.d/default.conf\n\n# Fichiers statiques (s'il y en a)\nCOPY public/ /var/www/html/public/\n\nEXPOSE 80\nCMD ["nginx", "-g", "daemon off;"]
\n\n

N'oubliez pas le fichier default.conf pour NGINX, qui proxy les requêtes vers PHP-FPM :

\n\n
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;  # nom du service dans K8s\n        fastcgi_index index.php;\n        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n        include fastcgi_params;\n    }\n}
\n\n

Construisez les images avec la commande :

\n\n
docker build -t my-php-app:latest -f Dockerfile.php .\ndocker build -t my-nginx:latest -f Dockerfile.nginx .
\n\n

2. Bases de Kubernetes : Pods, Deployments et Services

\n\n

Avant d'écrire les manifestes, familiarisons-nous avec les objets de base de K8s :

\n\n
    \n
  • Pod — unité de déploiement minimale, un ou plusieurs conteneurs.
  • \n
  • Deployment — gère les répliques des Pods, assure les mises à jour et les retours en arrière.
  • \n
  • Service — point d'accès stable aux Pods (à l'intérieur ou à l'extérieur du cluster).
  • \n
\n\n

Pour notre application PHP, nous allons créer deux Deployments : un pour PHP-FPM, un pour NGINX. Ensuite, nous les relierons via un Service interne.

\n\n

3. Rédaction des manifestes pour PHP et NGINX

\n\n

Créez un fichier php-deployment.yaml :

\n\n
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"  # exemple de variable d'environnement\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\n

Créez maintenant

Blogs

Book Recommendations