Bereitstellung von PHP auf Kubernetes: Ein praktischer Leitfaden

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


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


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


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


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

Blogs

Buchempfehlungen