نشر PHP على Kubernetes: دليل أساسي للمبتدئين
\n\nأصبح Kubernetes (K8s) المعيار الفعلي لتنسيق الحاويات. إذا كنت مطور PHP، فستواجه عاجلاً أم آجلاً الحاجة إلى نشر تطبيقك في عنقود. في هذا الدليل، سنشرح كيفية تحويل تطبيق PHP عادي إلى خدمة متكاملة تعمل تحت إدارة Kubernetes. ستتعلم كيفية تحضير صورة Docker، كتابة المانيفستات، وتشغيل كل ذلك في عنقود محلي (مثل Minikube).
\n\nسنستخدم التركيبة الكلاسيكية: PHP-FPM لمعالجة نصوص PHP و NGINX كخادم ويب. سيسمح لنا ذلك بتحقيق أداء عالٍ ومرونة.
\n\n1. تحضير تطبيق PHP وصورة Docker
\n\nالخطوة الأولى هي حزم كود PHP الخاص بك في حاوية Docker. سننشئ صورتين: واحدة لـ PHP-FPM، والثانية لـ NGINX (أو استخدام صورة واحدة مع مشرف، ولكن للمبتدئين من الأسهل الفصل بينهما).
\n\nأنشئ ملف Dockerfile لـ PHP-FPM:
FROM php:8.2-fpm-alpine\n\n# تثبيت الإضافات\nRUN docker-php-ext-install pdo_mysql mysqli opcache\n\n# نسخ كود التطبيق\nCOPY . /var/www/html\n\n# إعدادات PHP\nCOPY php.ini /usr/local/etc/php/conf.d/custom.ini\n\nWORKDIR /var/www/html\n\nEXPOSE 9000\nCMD ["php-fpm"]\n\nلـ NGINX، أنشئ Dockerfile منفصل:
FROM nginx:alpine\n\n# نسخ الإعدادات\nCOPY nginx.conf /etc/nginx/nginx.conf\nCOPY default.conf /etc/nginx/conf.d/default.conf\n\n# الملفات الثابتة (إن وجدت)\nCOPY public/ /var/www/html/public/\n\nEXPOSE 80\nCMD ["nginx", "-g", "daemon off;"]\n\nلا تنس ملف default.conf لـ NGINX الذي يقوم بتوجيه الطلبات إلى PHP-FPM:
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; # اسم الخدمة في K8s\n fastcgi_index index.php;\n fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n include fastcgi_params;\n }\n}\n\nقم ببناء الصور باستخدام الأمر:
\n\ndocker build -t my-php-app:latest -f Dockerfile.php .\ndocker build -t my-nginx:latest -f Dockerfile.nginx .\n\n2. أساسيات Kubernetes: Pods و Deployments و Services
\n\nقبل كتابة المانيفستات، دعنا نفهم الكائنات الأساسية في K8s:
\n\n- \n
- Pod — أصغر وحدة نشر، تحتوي على حاوية واحدة أو أكثر. \n
- Deployment — يدير نسخ Pods، ويوفر التحديثات والتراجع. \n
- Service — نقطة وصول ثابتة إلى Pods (داخل العنقود أو خارجه). \n
لتطبيق PHP الخاص بنا، سننشئ اثنين من Deployments: واحد لـ PHP-FPM والثاني لـ NGINX. ثم سنربطهما عبر Service داخلي.
\n\n3. كتابة المانيفستات لـ PHP و NGINX
\n\nأنشئ ملف php-deployment.yaml:
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" # مثال لمتغير بيئة\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الآن قم بإنشا