نشرح في هذا المقال إنشاء تطبيق مكتوب بلغة بايثون Python على كوبرنتس Kubernetes باستخدام منصة أوكتيتو Okteto التي تسهل عملية تطوير تطبيقات كوبرنتس Kubernetes، فهي تسمح للمطورين ببناء التطبيقات واختبارها مباشرة في عناقيد كوبرنتس Kubernetes clusters دون الحاجة لإعداد بيئات تطوير معقدة، كما توّفر منصة Okteto ميزة التحديثات المباشرة live updates للتطبيقات التي تعمل في عناقيد كوبرنتس مما يسمح للمطورين رؤية التعديلات على الشيفرة في الوقت الفعلي دون الحاجة إلى إعادة بناء التطبيقات أو إعادة نشرها.
المتطلبات الأساسية
لمتابعة خطوات هذا المقال، سنحتاج إلى ما يلي:
- عنقود كوبرنتس النسخة 1.28، وسنستخدم في مقالنا عنقود من منصة DigitalOcean، يحتوي على 3 عقد على الأقل
-
تثبيت واجهة سطر الأوامر
kubectl
وضبطها للتواصل مع عنقود كوبرنتس - حساب على مستودع دوكر هب
- تثبيت دوكر Docker على جهازنا المحلي
- مفتاح ترخيص لاستخدام منصة Okteto، ويمكن التسجيل في الإصدار التجريبي المجاني.
- تثبيت مدير الحزم Helm لتطوير التطبيقات ضمن عناقيد Kubernetes، باتباع الخطوة الأولى من المقال التالي.
-
نطاق Domain مسجَّل ومربوط مع Load Balancer لإدارة حركة مرور التطبيقات، وإنشاء سجل A record باسم
*
وعنوان IP موازن الحِمل.
إنشاء تطبيق بايثون
علينا التأكد أولًا بأن بايثون مثبّت على جهاز يعمل بنظام التشغيل أوبنتو بكتابة الأمر التالي في الطرفية:
python3 --version
إذا كانت حزم بايثون مثبّتة على الجهاز فسيعرضالأمر السابق نسختها، وإلّا نستخدم الأمر التالي لتثبيتها:
sudo apt install python3 python3-venv python3-pip -y
بعدها، ننشئ مجلد لتخزين شيفرة البرنامج وإعداداته:
mkdir my-app
ثم ننشئ بيئة افتراضية داخل مجلد التطبيق لوضع اعتماديات المشروع فيها:
cd my-app python3 -m venv python-env
والآن نفعّل البيئة الافتراضية باستخدام الأمر التالي:
source python-env/bin/activate
ثم ننشئ ملف بايثون لكتابة شيفرة التطبيق فيه:
nano app.py
ونضيف له الشيفرة التالية:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello, This is a simple Python App!" if __name__ == '__main__': app.run(debug=True, host='0.0.0.0')
ثم نثبّت إطار عمل فلاسك Flask:
pip install flask
نشغّل التطبيق الآن باستخدام الأمر التالي:
python3 app.py
سنحصل على هذا الخرج:
Output * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://172.20.10.2:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 311-959-468
أصبح إطار فلاسك Flask يعمل على جهازنا المحلي، نتأكّد من ذلك باستخدام الأمر curl
:
curl -X GET -H "Content-Type: application/json" http://localhost:5000
سنحصل على الرد التالي من تطبيق فلاسك:
Output Hello, This is a simple Python App!
يدل هذا الخرج على أن تطبيق فلاسك قد نُفّذ بنجاح دون أخطاء.
يمكن إيقاف تفعيل البيئة الافتراضية عند الانتهاء من العمل على مشروعنا، باستخدام الأمر التالي:
deactivate
وبهذا تكون أنشأنا تطبيقنا واختبرنا عمله محليًا، وحان وقت الخطوة الثانية لتشغيل هذا التطبيق داخل دوكر Docker.
تشغيل تطبيق بايثون داخل دوكر Docker
يتطلب تشغيل تطبيق بايثون داخل حاوية دوكر إنشاء صورة دوكر Docker image تحتوي على بيئة بايثون والاعتماديات اللازمة لتشغيل التطبيق. ننشئ أولًا ملفًا باسم Dockerfile
في المجلد الأساسي للتطبيق:
nano Dockerfile
ثم نضيف عليه التعليمات التالية:
# Use an official Python runtime as a parent image FROM python:3.8-slim # Set the working directory in the container WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed dependencies specified in requirements.txt RUN pip install flask # Make port 5000 available to the world outside this container EXPOSE 5000 # Define environment variable ENV NAME DockerizedPythonApp # Run app.py when the container launches CMD ["python3", "./app.py"]
فيما يلي شرح تعليمات ملف دوكر السابقة:
-
تحدد التعليمة
FROM python:3.8-slim
الصورة الأساسية التي نحتاجها -
تضبط
WORKDIR /app
المجلد/app
مجلدًا للعمل داخل الحاوية container -
تنسخ التعليمة
ADD . /app
محتوى المجلد الحالي لمجلد حاوية التطبيق/app
-
تثبّت
RUN pip install flask
إطار العمل فلاسك Flask -
تستمع التعليمة
EXPOSE 5000
على المنفذ 5000 للسماح بالاتصال -
يحدد
CMD ["python3", "app.py"]
الأمر الذي سينفذ عند تشغيل الحاوية وهو هنا الأمرapp.py
بعدها سنشغّل الأمر التالي لبناء صورة دوكر وفقًا للتعليمات السابقة:
docker build -t my-app .
نستطيع تشغيل التطبيق الآن في الحاوية باستخدام الصورة التي أنشأناها:
docker run -dit -p 5000:5000 my-app:latest
يُشَغّل الأمر السابق حاوية من الصورة my-app
ويضبط منفذ الحاوية على المنفذ المضيف 5000
. نكتب الأمر التالي للتأكد من عمل الحاوية:
docker ps
وسنحصل على الخرج التالي:
Output CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 761c54c77411 my-app:latest "python3 ./app.py" 3 seconds ago Up 3 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp pedantic_wescoff
نفتح متصفح الويب أو نستعمل موجّه الأوامر curl
للوصول إلى التطبيق باستخدام العنوان http://your-server-ip:5000/
، وستظهر رسالة Hello, This is a simple Python App! التي تشير لأن التطبيق يعمل داخل حاوية دوكر. وبهذا نكون شغّلنا تطبيق بايثون في حاوية دوكر بنجاح.
رفع صورة تطبيق بايثون إلى سجل DockerHub
لتنفيذ هذه الخطوة يجب أن يكون لدينا حساب على موقع دوكر هب DockerHub، بعدها نستخدم الأمر docker login
لتسجيل الدخول، وسيُطلب منا إدخال اسم المستخدم وكلمة المرور.
docker login
سنحصل على الخرج التالي:
Output Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: username@gmail.com Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
يجب وسم الصورة باسم حسابنا ومجلد الاعتمادية المطلوب قبل رفعها push لمستودع دوكر هب:
docker tag my-app yourusername/my-app:latest
يمكن الآن رفع الصورة إلى دوكر هب باستخدام الأمر docker push
:
docker push yourusername/my-app:latest
نتأكّد بعدها أن الصورة أصبحت موجودة بالبحث عنها باستخدام طرفية دوكر هب Docker Hub CLI:
docker search yourusername/my-app
وهكذا أصبحت صورة تطبيقنا مرفوعةً على منصة دوكر هب ويمكن للآخرين سحبها أو نشرها في عدّة بيئات.
إنشاء ملف Kubernetes Manifests لنشر التطبيق
علينا الآن إنشاء ملف Kubernetes Manifests باستخدام منصة Okteto لضبط عملية التطوير والخدمات وموارد Ingressللتطبيق. نكتب الأمر التالي لإنشاء الملف:
nano k8s.yaml
ثم نضيف الإعدادات التالية إليه:
apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - image: yourusername/my-app name: my-app --- apiVersion: v1 kind: Service metadata: name: my-app spec: type: ClusterIP ports: - name: "my-app" port: 5000 selector: app: my-app --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app annotations: dev.okteto.com/generate-host: my-app spec: rules: - http: paths: - backend: service: name: my-app port: number: 5000 path: / pathType: ImplementationSpecific
سينشر الملف السابق تطبيقنا بالاسم my-app
باستخدام منصة Okteto، وسينشره داخليًا عبر خدمة ClusterIP على المنفذ 5000، ثم سيُعدّ مورد Ingress لتوجيه حركة مرور HTTP إلى التطبيق. وهنا استخدمنا التعليقات التوضيحية الخاصة بـمنصة Okteto لتفعيل بعض الميزات التي تقدمها مثل إنشاء اسم المضيف hostname تلقائيًا.
تثبيت Okteto باستخدام مدير الحزم Helm
لتثبيت Okteto باستخدام مدير الحزم Helm علينا أولًا إضافة مستودع Okteto Helm إلى عميل Helm:
helm repo add okteto https://charts.okteto.com
وبعد ذلك علينا تحديث مستودعات مدير الحزم Helm لنضمن أن لدينا معلومات حديثة عن المخططات أو الحزم التي تحتوي على تعريفات موارد Kubernetes اللازمة لتشغيل التطبيق:
helm repo update
ثم ننشئ ملف config.yaml
:
nano config.yaml
ونضيف بعدها مفتاح رخصة استخدام Okteto الخاص بنا، والنطاق الفرعي والإعدادات، كما هو موضح أدناه:
license: INSERTYOURKEYHERE subdomain: okteto.example.com buildkit: persistence: enabled: true registry: storage: filesystem: persistence: enabled: true
ثم نثبّت أحدث نسخة من Okteto باستخدام ملف الإعدادات config.yaml
:
helm install okteto okteto/okteto -f config.yaml --namespace okteto --create-namespace
سنحصل على الخرج التالي عند انتهاء التثبيت:
Output NAME: okteto LAST DEPLOYED: Tue Mar 12 20:27:21 2024 NAMESPACE: okteto STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Congratulations! Okteto is successfully installed! Follow these steps to complete your domain configuration: 1. Create a wildcard A record "*.okteto.example.com", pointing it to the Okteto NGINX ingress controller External-IP: $ kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto 2. Access your Okteto instance at `https://okteto.okteto.example.com/login#token=88f8cc11`
ملاحظة: علينا الاحتفاظ برمز الوصول الشخصي Personal Access Tokens ذو القيمة 88f8cc11
من الشيفرة أعلاه لأننا سنحتاجه لتوثيق حسابنا في Okteto. ننتظر قليلًا ثم نجلب عنوان IP لخادم NGINX Ingress:
kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=okteto
سنحصل على الخرج التالي:
Output NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE okteto-ingress-nginx-controller LoadBalancer 10.101.31.239 45.76.14.191 80:31150/TCP,443:31793/TCP 3m21s
علينا إضافة العنوان الخارجي EXTERNAL-IP
إلى سجل A
تحت الاسم *
في إعدادات بروتوكول DNS. والآن، نفتح المتصفح للوصول إلى Okteto باستخدام الرابط التالي: https://okteto.okteto.example.com/login#token=88f8cc11.
تثبيت وضبط إعدادات واجهة أوامر Okteto
تُتيح لنا واجهة أوامر Okteto مفتوحة المصدر تطوير التطبيقات مباشرة على Kubernetes. بإمكاننا تثبيت واجهة الأوامر على نظامي لينوكس Linux وماك MacOS باستخدام الأمر curl
التالي:
sudo curl https://get.okteto.com -sSfL | sh
نتأكد من تثبيت واجهة أوامر Okteto باستخدام الأمر التالي الذي سيعرض تانسخة المثبّتة على جهازنا
Output okteto version 2.25.2
والآن علينا استخدام رمز الوصول الشخصي Personal Access Tokens للمصادقة:
okteto context use https://okteto.okteto.example.com --token 88f8cc11 --insecure-skip-tls-verify
وسنحصل على الخرج التالي:
Output ✓ Using okteto-admin @ okteto.okteto.example.com
نشغّل الأمر التالي للتأكد من إعدادات واجهة الأوامر:
okteto context list
وسنحصل على الخرج التالي:
Output Name Namespace Builder Registry https://okteto.okteto.example.com * okteto-admin tcp://buildkit.okteto.example.com:443 registry.okteto.example.com vke-4b7aaaa6-78fa-4a19-9fb3-cf7b8c1ec678 default docker -
إنشاء Okteto Manifest
علينا إنشاء ملف Okteto Manifest وضبط إعدادات بيئة التطوير لنتمكن من إنشاء تطبيقات بلغة بايثون. أولًا، ننشئ ملف okteto.yaml
مخصص لتطبيق بايثون بسيط.
nano okteto.yaml
ثم نضيف الإعدادات التالية:
deploy: - kubectl apply -f k8s.yaml dev: my-app: command: bash environment: - FLASK_ENV=development sync: - .:/app reverse: - 9000:9000 volumes: - /root/.cache/pip
فيما يلي شرح الأوامر السابقة:
يتضمن القسم deploy
إعدادات النشر. وعند تشغيل الأمر okteto up
أو okteto deploy
يُنَفَّذ الأمر kubectl apply -f k8s.yaml
الذي ينشر موارد Kubernetes الموجودة في الملف k8s.yaml
، ويُتيح ذلك فصل إعدادات النشر عن إعدادات التطوير.
يُحدد command: bash
الأمر الذي يجب تشغيله عند بدء تشغيل بيئة التطوير ويحدد environment
متغيرات البيئة التي يجب أن تكون في بيئة التطوير. وهنا صرّحنا أن متغيرات فلاسك FLASK_ENV
يجب أن تكون في بيئة التطوير FLASK_ENV=development
.
يحدد القسم sync
القسم الملفات التي يجب مزامنتها من جهازنا المحلي مع ملفات بيئة التطوير، إذ يجب مزامنة المجلد (.)
مع المجلد /app
من بيئة التطوير. ويوّضح reverse
قواعد توجيه المنافذ بين بيئة التطوير وجهازك المحلي. وفي مثالنا، يوجّه المنفذ 9000 من بيئة التطوير إلى المنفذ 9000 على جهازنا المحلي.
أخيرًا يوّضح v
وحدات التخزين الإضافية التي ستُضاف إلى بيئة التطوير. وهنا سنضيف المجلد /root/.cache/pip
، لنستخدمه لتخزين حزم pip
في بيئة التطوير مؤقتًا.
الآن علينا نشر تطبيق بايثون إلى عنقود كوبرنيتس باستخدام الأمر التالي:
okteto deploy
وسنحصل على الخرج التالي عند نجاح عملية النشر:
Output deployment.apps/my-app created service/my-app created ingress.networking.k8s.io/my-app created i There are no available endpoints for 'Okteto'. Follow this link to know more about how to create public endpoints for your application: https://www.okteto.com/docs/cloud/ssl/ ✓ Development environment 'Okteto' successfully deployed i Run 'okteto up' to activate your development container
ثم نحدّث لوحة تحكم Okteto من المتصفح لتعاين التطبيق بعد نشره:
كما يمكننا الوصول إلى التطبيق من الرابط التالي: https://my-app-okteto-admin.okteto.example.com.
تطوير تطبيق بايثون في منصة كوبرنتس مباشرة
سنستخدم الأمر okteto up
لنشر التطبيق مباشرةً على كوبرنتس، إذ يزامن هذا الأمر الشيفرة المحلية مع بيئة التطوير. وبإمكاننا تعديل الشيفرة باستخدام أي بيئة تطوير أو محرر أكواد على جهازنا، وستجري مزامنة التغييرات تلقائيًا مع بيئة التطوير في كوبرنيتس.
علينا أولًا تشغيل بيئة التطوير باستخدام Okteto:
okteto up
يُنشئ هذا الأمر بيئة تطوير وفقًا للإعدادات الموجودة في ملف okteto.yaml
:
Output i Using okteto-admin @ okteto.okteto.example.com as context i 'Okteto' was already deployed. To redeploy run 'okteto deploy' or 'okteto up --deploy' i Build section is not defined in your okteto manifest ✓ Persistent volume successfully attached ✓ Images successfully pulled ✓ Files synchronized Context: okteto.okteto.example.com Namespace: okteto-admin Name: my-app Reverse: 9000 <- 9000 root@my-app-okteto-7767588c8d-ndzj7:/app#
نشغّل بعدها تطبيق بايثون:
python3 app.py
وسنحصل على الخرج التالي:
* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5000 * Running on http://10.244.97.92:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 126-620-675
ثم نعدّل ملف التطبيق app.py
:
nano app.py
وعدّل السطر التالي:
return "Hello, This is a simple Python App Deployed on Kubernetes"
نحفظ الملف ثم نغلقه، وستٌطبَق التعديلات على الشيفرة البرمجية تلقائيًا في كوبرنتس. ثم نعيد تحميل صفحة التطبيق من متصفح الويب لتعاين التطبيق بعد التعديل.
الخاتمة
تعلمنا في هذا المقال كيفية إنشاء تطبيق بايثون بسيط وكيفية نشرته ضمن عناقيد كوبرنتس باستخدام منصة Okteto التي تتيح خاصية مزامنة التعديلات على الشيفرة المحلية مع بيئة التطوير، كما تسمح لنا بالتركيز على بناء تطبيقات بايثون عالية الجودة دون القلق حيال بنية كوبرنتس المعقّدة.
ترجمة -وبتصرّف- للمقال How to Deploy Python Application on Kubernetes with Okteto لكاتبيه hitjethva وEasha Abid.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.