اذهب إلى المحتوى

نشرح في هذا المقال إنشاء تطبيق مكتوب بلغة بايثون 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 dashboard

تثبيت وضبط إعدادات واجهة أوامر 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 من المتصفح لتعاين التطبيق بعد نشره:

python app on okteto dashboard

كما يمكننا الوصول إلى التطبيق من الرابط التالي: https://my-app-okteto-admin.okteto.example.com.

python application

تطوير تطبيق بايثون في منصة كوبرنتس مباشرة

سنستخدم الأمر 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"

نحفظ الملف ثم نغلقه، وستٌطبَق التعديلات على الشيفرة البرمجية تلقائيًا في كوبرنتس. ثم نعيد تحميل صفحة التطبيق من متصفح الويب لتعاين التطبيق بعد التعديل.

modified python application

الخاتمة

تعلمنا في هذا المقال كيفية إنشاء تطبيق بايثون بسيط وكيفية نشرته ضمن عناقيد كوبرنتس باستخدام منصة Okteto التي تتيح خاصية مزامنة التعديلات على الشيفرة المحلية مع بيئة التطوير، كما تسمح لنا بالتركيز على بناء تطبيقات بايثون عالية الجودة دون القلق حيال بنية كوبرنتس المعقّدة.

ترجمة -وبتصرّف- للمقال How to Deploy Python Application on Kubernetes with Okteto لكاتبيه hitjethva وEasha Abid.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...