Einleitung: Warum PHP in Kubernetes deployen?
\n\nViele Entwickler sehen PHP immer noch als Sprache für „klassisches“ Hosting mit FTP und phpMyAdmin. In der modernen DevOps-Kultur werden PHP-Anwendungen jedoch zunehmend in Containern ausgeführt, und deren Verwaltung übernimmt Kubernetes (K8s). Dies bietet nicht nur automatische Skalierung und Ausfallsicherheit, sondern auch eine einheitliche Umgebung in allen Phasen – von der Entwicklung bis zur Produktion.
In diesem Leitfaden werden wir praktisch durchgehen, wie man ein PHP-Projekt für das Deployment in Kubernetes vorbereitet: von der Erstellung eines Docker-Images bis zum Schreiben von Manifesten und dem Start im Cluster. Sie erfahren, wie Sie den Container leicht halten, php-fpm richtig konfigurieren und alles mit Nginx verbinden. Los geht's!
Schritt 1: Vorbereitung der PHP-Anwendung und des Docker-Images
\n\nBevor Sie den Code in K8s laden, müssen Sie ihn in ein Docker-Image packen. Betrachten wir ein typisches PHP-Projekt in reinem PHP (ohne Framework) – ein einfaches Skript, das eine Begrüßung und phpinfo ausgibt.
\n\n1.1. Projektstruktur
\n\nErstellen wir eine minimale Struktur:
\n\nmy-php-app/\n├── src/\n│ └── index.php\n├── docker/\n│ ├── php.Dockerfile\n│ └── nginx.conf\n└── k8s/\n ├── deployment.yaml\n └── service.yaml\n\n\n1.2. PHP-Anwendungscode
\n\nDatei src/index.php:
<?php\necho "<h1>Hallo, Kubernetes!</h1>";\necho "<p>PHP-Version: " . phpversion() . "</p>";\necho "<p>Server: " . gethostname() . "</p>";\n?>\n\n\n1.3. Dockerfile für PHP-FPM
\n\nErstellen Sie docker/php.Dockerfile:
FROM php:8.2-fpm-alpine\n\n# Abhängigkeiten installieren (falls benötigt)\nRUN docker-php-ext-install pdo pdo_mysql\n\n# Anwendungscode kopieren\nCOPY ./src /var/www/html\n\n# Zugriffsrechte (wichtig für FPM)\nRUN chown -R www-data:www-data /var/www/html\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\n\nWarum alpine? Es ergibt ein Image von ~30 MB statt 200+ MB auf Debian. Dies ist entscheidend für schnelles Laden im Cluster.
1.4. Nginx-Konfiguration
\n\nPHP-FPM kann statische Dateien nicht direkt ausliefern – ein Webserver wird benötigt. Erstellen Sie docker/nginx.conf:
server {\n listen 80;\n server_name _;\n root /var/www/html;\n\n index index.php index.html;\n\n location / {\n try_files $uri $uri/ /index.php?$query_string;\n }\n\n location ~ \\.php$ {\n fastcgi_pass 127.0.0.1:9000;\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}\n\n\nIn Kubernetes werden wir Nginx und PHP-FPM in einem Pod (als Sidecar-Container) oder als separate Dienste ausführen. Der Einfachheit halber verwenden wir einen Pod mit zwei Containern.
\n\nSchritt 2: Erstellen und Veröffentlichen der Images
\n\nErstellen wir das PHP-FPM-Image und das Nginx-Image mit unserer Konfiguration. In einem realen Projekt könnte man ein einzelnes Image verwenden, das Nginx und PHP in supervisord kombiniert, aber wir machen es „richtig“ – getrennt.
Erstellen des PHP-Images:
\ndocker build -t my-php-app:latest -f docker/php.Dockerfile .\n\n\nErstellen des Nginx-Images:
\nErstellen Sie ein separates Dockerfile für Nginx:
\nFROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n\n\ndocker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n\n\nLaden Sie dann die Images in eine Registry (Docker Hub, GitLab Container Registry usw.) hoch:
\ndocker tag my-php-app:latest your-registry/my-php-app:latest\ndocker push your-registry/my-php-app:latest\n\n\nSchritt 3: Kubernetes-Manifeste
\n\nJetzt kommt der spannendste Teil – wir beschreiben, wie Kubernetes unsere Anwendung starten wird.
\n\n