نشر PHP على Kubernetes: دليل أساسي عملي

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا ننشر 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=10000


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


2.2. ConfigMap لمتغيرات البيئة



تستخدم تطبيقات PHP غالبًا متغيرات البيئة (مثلاً للاتصال بقاعدة البيانات):



apiVersion: v1kind: ConfigMapmetadata:  name: php-config  namespace: php-appdata:  APP_ENV: production  APP_DEBUG: "false"  DB_HOST: mysql-service


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

المدونات

توصيات الكتب