Bereitstellung von PHP auf Kubernetes: Ein grundlegender Leitfaden für Anfänger

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

Bereitstellung von PHP auf Kubernetes: Ein grundlegender Leitfaden für Anfänger

\n\n

Kubernetes (K8s) ist der De-facto-Standard für die Container-Orchestrierung. Wenn Sie ein PHP-Entwickler sind, werden Sie früher oder später auf die Notwendigkeit stoßen, Ihre Anwendung in einem Cluster bereitzustellen. In diesem Leitfaden werden wir durchgehen, wie Sie eine gewöhnliche PHP-Anwendung in einen vollwertigen Dienst verwandeln, der unter Kubernetes läuft. Sie erfahren, wie Sie ein Docker-Image vorbereiten, Manifeste schreiben und alles in einem lokalen Cluster (z. B. Minikube) ausführen.

\n\n

Wir werden das klassische Setup verwenden: PHP-FPM zur Verarbeitung von PHP-Skripten und NGINX als Webserver. Dies ermöglicht uns eine hohe Leistung und Flexibilität.

\n\n

1. Vorbereitung der PHP-Anwendung und des Docker-Images

\n\n

Der erste Schritt ist das Verpacken Ihres PHP-Codes in einen Docker-Container. Wir werden zwei Images erstellen: eines für PHP-FPM und eines für NGINX (oder wir verwenden ein einzelnes Image mit einem Supervisor, aber für Anfänger ist die Trennung einfacher).

\n\n

Erstellen Sie eine Datei Dockerfile für PHP-FPM:

\n\n
FROM php:8.2-fpm-alpine\n\n# Erweiterungen installieren\nRUN docker-php-ext-install pdo_mysql mysqli opcache\n\n# Anwendungscode kopieren\nCOPY . /var/www/html\n\n# PHP-Einstellungen\nCOPY php.ini /usr/local/etc/php/conf.d/custom.ini\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]
\n\n

Erstellen Sie für NGINX ein separates Dockerfile:

\n\n
FROM nginx:alpine\n\n# Konfiguration kopieren\nCOPY nginx.conf /etc/nginx/nginx.conf\nCOPY default.conf /etc/nginx/conf.d/default.conf\n\n# Statische Dateien (falls vorhanden)\nCOPY public/ /var/www/html/public/\n\nEXPOSE 80\nCMD ["nginx", "-g", "daemon off;"]
\n\n

Vergessen Sie nicht die Datei default.conf für NGINX, die Anfragen an PHP-FPM weiterleitet:

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

Erstellen Sie die Images mit dem Befehl:

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

2. Grundlagen von Kubernetes: Pods, Deployments und Services

\n\n

Bevor wir Manifeste schreiben, lassen Sie uns die grundlegenden K8s-Objekte verstehen:

\n\n
    \n
  • Pod — die kleinste Bereitstellungseinheit, ein oder mehrere Container.
  • \n
  • Deployment — verwaltet Replikate von Pods, ermöglicht Updates und Rollbacks.
  • \n
  • Service — ein stabiler Zugangspunkt zu Pods (innerhalb des Clusters oder von außen).
  • \n
\n\n

Für unsere PHP-Anwendung werden wir zwei Deployments erstellen: eines für PHP-FPM und eines für NGINX. Dann verbinden wir sie über einen internen Service.

\n\n

3. Schreiben der Manifeste für PHP und NGINX

\n\n

Erstellen Sie eine Datei 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"  # Beispiel für eine Umgebungsvariable\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

Erstellen Sie jetzt

Blogs

Buchempfehlungen