مقدمة: لماذا ننشر PHP على Kubernetes؟
لا تزال PHP واحدة من أكثر اللغات شيوعًا لتطوير الويب. ومع ذلك، مع زيادة الحمل وتعقيد المشاريع (Laravel، Symfony، Bitrix)، لم يعد مكدس LAMP التقليدي قادرًا على التعامل معها. يقدم Kubernetes (K8s) حلاً: التوسع التلقائي، تحمل الأعطال، النشر بدون توقف (zero-downtime)، وإدارة التكوينات.
في هذا الدليل، سنشرح عمليًا دورة النشر الكاملة لتطبيق PHP على Kubernetes: بدءًا من إنشاء صورة Docker وحتى إعداد Ingress. ستتعلم كيفية إعداد المانيفستات، وإدارة متغيرات البيئة، وضمان عمل PHP-FPM في الكتلة.
1. إعداد تطبيق PHP وصورة Docker
1.1. هيكل مشروع PHP
للنشر، سنحتاج إلى تطبيق PHP بسيط. لنأخذ ملف index.php الكلاسيكي:
<?php// index.phpecho "Hello from Kubernetes! PHP version: " . phpversion();سنقوم أيضًا بإنشاء ملف composer.json (إذا كنت تستخدم إطار عمل):
{ "require": { "php": "^8.1" }}1.2. Dockerfile لـ PHP-FPM
نقطة أساسية: في Kubernetes، يعمل PHP عبر PHP-FPM، بينما يقوم Nginx بتقديم الملفات الثابتة. لننشئ Dockerfile:
FROM php:8.2-fpm-alpine
# تثبيت الإضافات الضروريةRUN docker-php-ext-install pdo_mysql mysqli opcache
# نسخ كود التطبيقCOPY . /var/www/html
# صلاحيات الوصولRUN chown -R www-data:www-data /var/www/html
# إعدادات PHPCOPY php.ini /usr/local/etc/php/conf.d/custom.ini
WORKDIR /var/www/html
EXPOSE 9000CMD ["php-fpm"]للإنتاج، أضف opcache:
; php.iniopcache.enable=1opcache.memory_consumption=128opcache.max_accelerated_files=100001.3. Dockerfile لـ Nginx
سيعمل Nginx كوكيل عكسي لطلبات PHP-FPM:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/conf.d/default.confCOPY public/ /var/www/html/public
EXPOSE 80مثال على 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. إنشاء مانيفستات Kubernetes
2.1. Namespace
لعزل تطبيقنا:
apiVersion: v1kind: Namespacemetadata: name: php-app2.2. ConfigMap لمتغيرات البيئة
تستخدم تطبيقات PHP غالبًا متغيرات البيئة (مثلاً للاتصال بقاعدة البيانات):
apiVersion: v1kind: ConfigMapmetadata: name: php-config namespace: php-appdata: APP_ENV: production APP_DEBUG: "false" DB_HOST: mysql-service2.3. Secret للبيانات الحساسة
نخزن كلمات المرور والمفاتيح في Secret:
apiVersion: v1kind: Secretmetadata: name: php-secrets namespace: php-apptype: Opaquedata: DB_PASSWORD: cGFzc3dvcmQxMjM= # base64 "password123"2.4. Deployment لـ PHP-FPM
المكون الرئيسي — 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