Deployment von PHP auf Kubernetes: eine praktische Schritt-für-Schritt-Anleitung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum PHP in Kubernetes deployen?

\n\n

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

\n\n

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!

\n\n

Schritt 1: Vorbereitung der PHP-Anwendung und des Docker-Images

\n\n

Bevor 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\n

1.1. Projektstruktur

\n\n

Erstellen wir eine minimale Struktur:

\n\n
my-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\n

1.2. PHP-Anwendungscode

\n\n

Datei src/index.php:

\n\n
<?php\necho "<h1>Hallo, Kubernetes!</h1>";\necho "<p>PHP-Version: " . phpversion() . "</p>";\necho "<p>Server: " . gethostname() . "</p>";\n?>\n
\n\n

1.3. Dockerfile für PHP-FPM

\n\n

Erstellen Sie docker/php.Dockerfile:

\n\n
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\n

Warum alpine? Es ergibt ein Image von ~30 MB statt 200+ MB auf Debian. Dies ist entscheidend für schnelles Laden im Cluster.

\n\n

1.4. Nginx-Konfiguration

\n\n

PHP-FPM kann statische Dateien nicht direkt ausliefern – ein Webserver wird benötigt. Erstellen Sie docker/nginx.conf:

\n\n
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\n

In 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\n

Schritt 2: Erstellen und Veröffentlichen der Images

\n\n

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

\n\n

Erstellen des PHP-Images:

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

Erstellen des Nginx-Images:

\n

Erstellen Sie ein separates Dockerfile für Nginx:

\n
FROM nginx:alpine\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\nCOPY ./src /var/www/html\n
\n\n
docker build -t my-nginx:latest -f docker/nginx.Dockerfile .\n
\n\n

Laden Sie dann die Images in eine Registry (Docker Hub, GitLab Container Registry usw.) hoch:

\n
docker tag my-php-app:latest your-registry/my-php-app:latest\ndocker push your-registry/my-php-app:latest\n
\n\n

Schritt 3: Kubernetes-Manifeste

\n\n

Jetzt kommt der spannendste Teil – wir beschreiben, wie Kubernetes unsere Anwendung starten wird.

\n\n

3.1. Deployment (Hauptmanifest

Blogs

Buchempfehlungen