Einleitung: Warum PHP in Kubernetes bereitstellen?
PHP bleibt eine der beliebtesten Sprachen für die Webentwicklung. Mit zunehmender Last und Komplexität von Projekten (Laravel, Symfony, Bitrix) stößt der traditionelle LAMP-Stack jedoch an seine Grenzen. Kubernetes (K8s) bietet eine Lösung: automatische Skalierung, Ausfallsicherheit, Zero-Downtime-Bereitstellung und Konfigurationsmanagement.
In diesem Leitfaden gehen wir praktisch den gesamten Zyklus der Bereitstellung einer PHP-Anwendung in Kubernetes durch: von der Erstellung des Docker-Images bis zur Konfiguration von Ingress. Sie erfahren, wie Sie Manifeste vorbereiten, Umgebungsvariablen verwalten und den Betrieb von PHP-FPM im Cluster sicherstellen.
1. Vorbereitung der PHP-Anwendung und des Docker-Images
1.1. Struktur des PHP-Projekts
Für die Bereitstellung benötigen wir eine minimale PHP-Anwendung. Nehmen wir eine klassische index.php:
<?php// index.phpecho "Hello from Kubernetes! PHP version: " . phpversion();Erstellen Sie außerdem eine composer.json (falls Sie ein Framework verwenden):
{ "require": { "php": "^8.1" }}1.2. Dockerfile für PHP-FPM
Wichtiger Punkt: In Kubernetes läuft PHP über PHP-FPM, während Nginx die statischen Dateien ausliefert. Erstellen wir ein Dockerfile:
FROM php:8.2-fpm-alpine
# Installation erforderlicher ErweiterungenRUN docker-php-ext-install pdo_mysql mysqli opcache
# Kopieren des AnwendungscodesCOPY . /var/www/html
# ZugriffsrechteRUN chown -R www-data:www-data /var/www/html
# PHP-EinstellungenCOPY php.ini /usr/local/etc/php/conf.d/custom.ini
WORKDIR /var/www/html
EXPOSE 9000CMD ["php-fpm"]Fügen Sie für die Produktion opcache hinzu:
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=100001.3. Dockerfile für Nginx
Nginx leitet Anfragen an PHP-FPM weiter:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.confCOPY public/ /var/www/html/public
EXPOSE 80Beispiel 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. Erstellung von Kubernetes-Manifesten
2.1. Namespace
Isolieren wir unsere Anwendung:
apiVersion: v1kind: Namespacemetadata: name: php-app2.2. ConfigMap für Umgebungsvariablen
PHP-Anwendungen verwenden häufig Umgebungsvariablen (z. B. für die Datenbankverbindung):
apiVersion: v1kind: ConfigMapmetadata: name: php-config namespace: php-appdata: APP_ENV: production APP_DEBUG: "false" DB_HOST: mysql-service2.3. Secret für sensible Daten
Passwörter und Schlüssel speichern wir in einem Secret:
apiVersion: v1kind: Secretmetadata: name: php-secrets namespace: php-apptype: Opaquedata: DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 "password123"2.4. Deployment für PHP-FPM
Die Hauptkomponente ist 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