مقدمة
Okteto هي منصة تطوير تُستخدم لتبسيط عملية تطوير تطبيقات Kubernetes. تتيح للمطورين بناء تطبيقاتهم واختبارها مباشرةً على مجموعات Kubernetes دون الحاجة إلى إعداد بيئات تطوير محلية معقدة. تُمكّن Okteto من إجراء تحديثات مباشرة للتطبيقات التي تعمل على مجموعات Kubernetes، مما يسمح للمطورين برؤية التغييرات في أكوادهم فورًا دون الحاجة إلى إعادة بناء تطبيقاتهم أو إعادة نشرها.
في هذا البرنامج التعليمي، سوف تقوم بإنشاء تطبيق Python ونشره على Kubernetes باستخدام Okteto.
المتطلبات الأساسية
- مجموعة Kubernetes 1.28
- تم تثبيت kubectl وتكوينه للتواصل مع المجموعة الخاصة بك.
- حساب Docker Hub
- يتم تشغيل Docker على جهازك المحلي.
- يتطلب استخدام Okteto ترخيصًا. للحصول على مفتاح ترخيص، اشترك في نسخة تجريبية مجانية لمدة 30 يومًا من Okteto.
- تم تثبيت مدير حزمة Helm على جهازك المحلي.
- اسم نطاق مسجل بالكامل يشير إلى مُوازن التحميل الذي يستخدمه Nginx Ingress. يجب إنشاء سجل A باسم * وعنوان IP لمُوازن التحميل.
الخطوة 1 - إنشاء برنامج بايثون
أولاً، تأكد من تثبيت بايثون على نظام أوبونتو. يمكنك التحقق من ذلك بفتح نافذة الأوامر وكتابة الأمر التالي:
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بعد ذلك، أنشئ ملف بايثون جديد لتطبيقك. على سبيل المثال، أنشئ ملف app.py بسيطًا:
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الآن قم بتشغيل برنامج Python الخاص بك باستخدام الأمر التالي.
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يجب أن تحصل على الاستجابة التالية من تطبيق Flask.
OutputHello, This is a simple Python App!بمجرد الانتهاء من العمل على مشروعك، يمكنك إلغاء تنشيط البيئة الافتراضية عن طريق تشغيل الأمر التالي:
deactivateفي هذه المرحلة، قمت بإنشاء برنامج Python واختباره محليًا.
الخطوة 2 - Dockerize تطبيق Python
تتضمن عملية Dockering لتطبيق Python إنشاء صورة Docker تحتوي على بيئة Python والتبعيات اللازمة لتشغيل التطبيق.
أولاً، قم بإنشاء ملف يسمى Dockerfile في الدليل الجذر لتطبيق Python الخاص بك.
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"]في هذا Dockerfile:
- من بايثون:3.8-slim: يُحدد الصورة الأساسية المُراد استخدامها. أنت تستخدم صورة بايثون رسمية مُثبّت عليها بايثون 3.8.
- WORKDIR /app: تعيين دليل العمل داخل الحاوية إلى /app.
- إضافة . /app: نسخ محتويات الدليل الحالي إلى مجلد /app الخاص بالحاوية.
- تشغيل pip install flask: يقوم بتثبيت إطار عمل Flask.
- EXPOSE 5000: يعرض المنفذ 5000 للسماح بالاتصالات الواردة.
- CMD ["python3″، "app.py"]: يُحدد أمرًا لتشغيله عند بدء تشغيل الحاوية. في هذه الحالة، يُشغّل تطبيق app.py.
الآن قم بتشغيل الأمر التالي لبناء الصورة استنادًا إلى الإرشادات الموجودة في ملف Dockerfile الخاص بك.
docker build -t my-app .بعد إنشاء صورة Docker، يمكنك تشغيل تطبيقك في حاوية باستخدام الصورة المبنية:
docker run -dit -p 5000:5000 my-app:latestيقوم هذا الأمر بتشغيل حاوية من صورة التطبيق الخاص بي ويقوم بتعيين منفذ الحاوية إلى منفذ المضيف 5000.
يمكنك التحقق من حاوية التطبيق قيد التشغيل باستخدام الأمر docker ps.
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. ستظهر لك رسالة "مرحبًا، هذا تطبيق بايثون بسيط!"، مما يشير إلى أن تطبيق بايثون الخاص بك يعمل داخل حاوية Docker.
لقد قمت الآن بدمج تطبيق Python الخاص بك بنجاح.
الخطوة 3 - ادفع صورة Python Docker إلى سجل DockerHub
أولاً، يجب أن يكون لديك حساب DockerHub. إذا لم يكن لديك حساب، يمكنك إنشاء واحد على موقع DockerHub.
لتسجيل الدخول إلى Docker Hub، استخدم أمر تسجيل الدخول docker. سيُطلب منك إدخال اسم المستخدم وكلمة المرور الخاصين بـ Docker Hub.
docker loginسيكون إخراج هذا الأمر على النحو التالي:
OutputLogin 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: [email protected]
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قبل دفع الصورة إلى Docker Hub، يجب عليك أيضًا وضع علامة عليها باسم مستخدم Docker Hub واسم المستودع المطلوب.
docker tag my-app yourusername/my-app:latestيمكنك الآن دفع صورة Docker الخاصة بك إلى Docker Hub باستخدام أمر docker push.
docker push yourusername/my-app:latestبعد دفع الصورة، يمكنك التحقق من أنها متوفرة على Docker Hub من خلال البحث عنها باستخدام Docker Hub CLI.
docker search yourusername/my-appأصبحت صورة Docker لتطبيق Python الخاص بك متاحة الآن على Docker Hub ويمكن للآخرين سحبها أو نشرها في بيئات مختلفة.
الخطوة 4 - إنشاء بيانات Kubernetes لنشر تطبيق Python
الآن، تحتاج إلى إنشاء ملف بيان Kubernetes باستخدام Okteto لتحديد موارد النشر والخدمة والإدخال لتطبيق يسمى my-app.
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 لتفعيل بعض ميزاته، مثل إنشاء اسم المضيف تلقائيًا.
الخطوة 5 – تثبيت Okteto باستخدام Helm
أولاً، يتعين عليك إضافة مستودع Okteto Helm إلى عميل Helm الخاص بك.
helm repo add okteto https://charts.okteto.comبمجرد إضافة مستودع Okteto Helm، ستحتاج إلى تحديث مستودعات Helm الخاصة بك للتأكد من حصولك على أحدث المعلومات حول المخططات المتاحة:
helm repo updateثم قم بإنشاء config.yaml لـ Okteto.
nano config.yamlأضف مفتاح ترخيص Okteto والنطاق الفرعي والإعدادات الأخرى كما هو موضح أدناه:
license: FT7YCAYBAEDUY2LDMVXHGZIB76BAAAIDAECEIYLUMEAQUAABAFJAD74EAAAQCUYB76CAAAAABL7YGBIBAL7YMAAAAD77N74CAH7YU6ZCOZSXE43JN5XCEORSFQRGK3LBNFWCEORCNBUXIZLTNBVGK5DIOZQUA3DJNZ2XQYTVPIXGG33NEIWCEY3PNVYGC3TZEI5CE3DJNZ2XQYTVPIRCYITTMVQXI4ZCHIZTALBCORUWK4RCHIRHGY3BNRSSELBCORZGSYLMEI5HI4TVMUWCEZLOMQRDUIRSGAZDILJQGQWTCMCUGA2TUMJUHI2DQWRCPUATCAWDZA5DGNLGYAT25X6NRCJVJNWBQMG2LD7DWY36ZYXOZ7X5B37HZOBHXYV7OSCZ5HKH4G4EOIHJ7XOACMICRENEMSP5CHENLAE2XHXY44AMKKMHR5LB6IEWXNF56KJE6RGDVSGM2JW63F7DNP5ZS6REKK55RYIBMAA=
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بعد تثبيت Okteto، سوف تحصل على النتيجة التالية.
OutputNAME: 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`انتظر لفترة من الوقت ثم قم بتعيين عنوان IP الذي قام DigitalOcean بتعيينه بشكل ديناميكي إلى NGINX Ingress الذي قمت بتثبيته وتكوينه للتو كجزء من Okteto:
kubectl get service -l=app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/component=controller --namespace=oktetoسوف ترى الناتج التالي.
OutputNAME 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يجب عليك أخذ عنوان IP الخارجي وإضافته إلى خادم DNS للنطاق الذي اخترته. يتم ذلك بإنشاء سجل A باسم *.
الآن، افتح متصفح الويب الخاص بك وقم بالوصول إلى مثيل Okteto الخاص بك على https://okteto.okteto.example.com/login#token=88f8cc11.

الخطوة 6 - تثبيت وتكوين Okteto CLI
Okteto CLI هي أداة سطر أوامر مفتوحة المصدر تتيح لك تطوير تطبيقاتك مباشرة على Kubernetes.
يمكنك تثبيت Okteto CLI على نظامي Linux وmacOS باستخدام curl. افتح نافذة الأوامر وشغّل الأمر التالي:
sudo curl https://get.okteto.com -sSfL | shبمجرد اكتمال التثبيت، يمكنك التحقق من تثبيت Okteto CLI بشكل صحيح عن طريق تشغيل الأمر التالي:
okteto versionيعرض هذا الأمر إصدار Okteto CLI المثبت على نظامك.
Outputokteto version 2.25.2بعد ذلك، ستحتاج إلى استخدام رموز الوصول الشخصية الخاصة بك للمصادقة باستخدام Okteto CLI.
/* okteto context use https://okteto.okteto.example.com --token 88f8cc11 --insecure-skip-tls-verifycode... */سيكون الناتج:
Output ✓ Using okteto-admin @ okteto.okteto.example.comثم قم بتشغيل الأمر التالي للتأكد من تكوين Okteto CLI الخاص بك.
okteto context listوهذا يعطي الناتج التالي:
OutputName 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 -الخطوة 7 - إنشاء بيان Okteto الخاص بك
لبدء تطوير تطبيق Python، تحتاج إلى إنشاء ملف بيان Okteto وتحديد التكوين لبيئة التطوير الخاصة بك.
لنقم بإنشاء ملف okteto.yaml لتطبيق Python بسيط.
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في الملف أعلاه:
- النشر: يُحدد هذا القسم إعدادات النشر. عند تشغيل okteto up أو okteto deploy، يُشغّل Okteto الأمر kubectl application -f k8s.yaml لنشر موارد Kubernetes المُعرّفة في ملف k8s.yaml. يتيح لك هذا تحديد إعدادات النشر بشكل منفصل عن إعدادات بيئة التطوير.
- الأمر: bash: يحدد الأمر الذي سيتم تنفيذه عند بدء تشغيل بيئة التطوير.
- البيئة: تُحدد متغيرات البيئة التي سيتم ضبطها في بيئة التطوير. في هذه الحالة، يتم ضبط FLASK_ENV على التطوير.
- مزامنة: يُحدد المجلدات المطلوب مزامنتها بين جهازك المحلي وبيئة التطوير. يُزامن الدليل الحالي (.) مع /app داخل بيئة التطوير.
- عكسي: يُحدد قواعد إعادة توجيه المنافذ لعرض المنافذ من بيئة التطوير على جهازك المحلي. في هذه الحالة، يُعيد توجيه المنفذ 9000 من بيئة التطوير إلى المنفذ 9000 على جهازك المحلي.
- المجلدات: يُحدد مجلدات إضافية لتثبيتها في بيئة التطوير. في هذه الحالة، يُثبّت الدليل /root/.cache/pip، الذي يُمكن استخدامه لتخزين حزم pip مؤقتًا في بيئة التطوير.
قم الآن بنشر تطبيق Python الخاص بك على مجموعة Kubernetes باستخدام الأمر التالي.
okteto deployبعد النشر الناجح، سوف ترى الناتج التالي.
Outputdeployment.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 الخاص بك باستخدام عنوان URL https://my-app-okteto-admin.okteto.example.com.

الخطوة 8 - تطوير تطبيق Python مباشرة في Kubernetes
في هذا القسم، ستستخدم أمر okteto up لنشر تطبيق بايثون مباشرةً على Kubernetes. سيُزامن هذا الأمر شيفرتك المحلية مع بيئة التطوير. يمكنك تعديل الشيفرة باستخدام بيئة التطوير المتكاملة (IDE) أو محرر النصوص المفضل لديك على جهازك المحلي، وستُزامن التغييرات تلقائيًا مع بيئة التطوير في Kubernetes.
لنبدأ بيئة التطوير باستخدام 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#بعد ذلك، قم بتشغيل برنامج Python الخاص بك:
python3 app.pyسوف ترى الناتج التالي.
Output * 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 تلقائيًا تغييرات الكود ويطبقها على Kubernetes فورًا.
ارجع إلى متصفح الويب وأعد تحميل صفحة برنامج بايثون. سترى برنامجك المعدّل في الصفحة أدناه.

نتيجة
في هذا البرنامج التعليمي، أنشأتَ تطبيق بايثون أساسيًا ونشرتَه على مجموعة Kubernetes باستخدام Okteto. تُمكّن قدرة Okteto على مزامنة تغييرات الكود المحلية مع بيئة التطوير آنيًا من تكرارات تطوير سريعة وتلقي ملاحظات فورية حول تغييرات الكود. بشكل عام، يُتيح Okteto للمطورين التركيز على بناء تطبيقات بايثون عالية الجودة دون القلق بشأن تعقيدات بنية Kubernetes التحتية.













