مقدمه
Okteto یک پلت فرم توسعه است که برای ساده کردن فرآیند توسعه برنامه های Kubernetes استفاده می شود. این به توسعه دهندگان اجازه می دهد تا برنامه های خود را مستقیماً در خوشه های Kubernetes بدون راه اندازی محیط های توسعه محلی پیچیده بسازند و آزمایش کنند. Okteto بهروزرسانیهای زنده برنامههای در حال اجرا در خوشههای Kubernetes را فعال میکند و به توسعهدهندگان این امکان را میدهد تا تغییرات کد خود را در زمان واقعی بدون نیاز به بازسازی یا استقرار مجدد برنامههای خود مشاهده کنند.
در این آموزش، شما یک اپلیکیشن پایتون ایجاد کرده و با استفاده از Okteto آن را در Kubernetes مستقر خواهید کرد.
پیش نیازها
- یک خوشه Kubernetes 1.28
- kubectl برای ارتباط با خوشه شما نصب و پیکربندی شده باشد.
- یک حساب Docker Hub
- داکر در دستگاه محلی شما در حال اجرا باشد.
- مجوز برای استفاده از Okteto الزامی است. برای دریافت کلید مجوز، در آزمایشی رایگان 30 روزه Okteto ثبت نام کنید.
- مدیریت بسته Helm بر روی دستگاه محلی شما نصب شده است.
- یک نام دامنه کاملاً ثبت شده که به Load Balancer استفاده شده توسط Nginx Ingress اشاره دارد. شما باید یک رکورد A با نام * و Load Balancer 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
اکنون برنامه پایتون خود را با استفاده از دستور زیر اجرا کنید.
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
در این مرحله، شما یک برنامه پایتون ایجاد کرده اید و آن را به صورت محلی تست کرده اید.
مرحله 2 – برنامه پایتون را Dockerize کنید
داکر کردن یک برنامه پایتون شامل ایجاد یک تصویر داکر است که حاوی محیط پایتون و وابستگی های مورد نیاز برای اجرای برنامه است.
ابتدا یک فایل به نام 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: تصویر پایه مورد استفاده را مشخص می کند. شما از یک تصویر رسمی پایتون با نصب پایتون 3.8 استفاده می کنید.
- WORKDIR /app: دایرکتوری کاری داخل کانتینر را روی /app تنظیم می کند.
- اضافه کردن . /app: محتویات دایرکتوری فعلی را در پوشه /app ظرف کپی می کند.
- RUN pip install flask: Frask frame را نصب می کند.
- EXPOSE 5000: پورت 5000 را برای اجازه دادن به اتصالات ورودی در معرض دید قرار می دهد.
- CMD [“python3″، “app.py”]: دستوری را مشخص میکند که هنگام شروع کانتینر اجرا شود. در این مورد، برنامه app.py را اجرا می کند.
اکنون دستور زیر را اجرا کنید تا تصویر را بر اساس دستورالعمل های موجود در Dockerfile خود بسازید.
docker build -t my-app .
پس از ساختن تصویر داکر، می توانید برنامه خود را در یک کانتینر با استفاده از تصویر ساخته شده اجرا کنید:
docker run -dit -p 5000:5000 my-app:latest
این دستور یک کانتینر را از تصویر my-app اجرا می کند و پورت کانتینر را به پورت میزبان 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 برای دسترسی به برنامه با استفاده از URL http://your-server-ip:5000 استفاده کنید. باید پیام Hello, This is a simple Python App را ببینید! نشان می دهد که برنامه پایتون شما در داخل کانتینر داکر اجرا می شود.
تاکنون با موفقیت برنامه پایتون خود را داکر کرده اید.
مرحله 3 – تصویر Python Docker را به رجیستری DockerHub فشار دهید
ابتدا باید یک حساب DockerHub داشته باشید. اگر ندارید، می توانید آن را در وب سایت DockerHub ایجاد کنید.
برای ورود به داکر هاب از دستور ورود به سیستم داکر استفاده کنید. از شما خواسته می شود نام کاربری و رمز عبور 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 tag my-app yourusername/my-app:latest
اکنون می توانید تصویر Docker خود را با استفاده از دستور docker push به Docker Hub فشار دهید.
docker push yourusername/my-app:latest
پس از فشار دادن تصویر، می توانید با جستجوی آن با استفاده از Docker Hub CLI تأیید کنید که در Docker Hub موجود است.
docker search yourusername/my-app
تصویر Docker برنامه پایتون شما اکنون در Docker Hub در دسترس است و می تواند توسط دیگران کشیده شود یا در محیط های مختلف مستقر شود.
مرحله 4 – مانیفست های Kubernetes را برای استقرار برنامه پایتون ایجاد کنید
اکنون باید با استفاده از Okteto یک فایل مانیفست Kubernetes ایجاد کنید تا منابع استقرار، سرویس و ورودی برنامه ای به نام 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 برای فعال کردن برخی ویژگی های ارائه شده توسط 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
شما باید آدرس EXTERNAL-IP را بگیرید و آن را به DNS خود برای دامنه ای که انتخاب کرده اید اضافه کنید. این کار با ایجاد یک رکورد A با نام * انجام می شود.
اکنون، مرورگر وب خود را باز کنید و به نمونه Okteto خود در https://okteto.okteto.example.com/login#token=88f8cc11 دسترسی پیدا کنید.
مرحله 6 – Okteto CLI را نصب و پیکربندی کنید
Okteto CLI یک ابزار خط فرمان منبع باز است که به شما امکان می دهد برنامه های خود را مستقیماً در Kubernetes توسعه دهید.
می توانید Okteto CLI را روی لینوکس و 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 خود را ایجاد کنید
برای شروع توسعه برنامه پایتون، باید یک فایل مانیفست Okteto ایجاد کنید و پیکربندی را برای محیط توسعه خود تعریف کنید.
بیایید یک فایل 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 را اجرا می کنید، Okteto دستور kubectl application -f k8s.yaml را برای استقرار منابع Kubernetes تعریف شده در فایل k8s.yaml اجرا می کند. این به شما امکان می دهد پیکربندی استقرار خود را جدا از پیکربندی محیط توسعه خود مشخص کنید.
- command: bash: دستوری را مشخص می کند که هنگام شروع محیط توسعه اجرا شود.
- Environment: متغیرهای محیطی را برای تنظیم در محیط توسعه مشخص می کند. در این مورد، FLASK_ENV را روی توسعه تنظیم می کند.
- SYNC: پوشه هایی را برای همگام سازی بین ماشین محلی شما و محیط توسعه مشخص می کند. دایرکتوری فعلی (.) را با /app در داخل محیط توسعه همگام می کند.
- Reverse: قوانین حمل و نقل پورت را مشخص می کند تا پورت ها را از محیط توسعه در معرض دستگاه محلی شما قرار دهد. در این حالت، پورت 9000 را از محیط توسعه به پورت 9000 در دستگاه محلی شما فوروارد می کند.
- volumes: حجم های اضافی را برای نصب در محیط توسعه مشخص می کند. در این مورد، دایرکتوری /root/.cache/pip را که ممکن است برای کش بستههای پیپ استفاده شود، در محیط توسعه نصب میکند.
اکنون برنامه پایتون خود را با استفاده از دستور زیر در خوشه 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 را بازخوانی کنید. برنامه مستقر شده خود را خواهید دید:
همچنین می توانید با استفاده از URL https://my-app-okteto-admin.okteto.example.com به برنامه پایتون خود دسترسی پیدا کنید.
مرحله 8 – برنامه پایتون را مستقیماً در 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#
بعد، برنامه پایتون خود را اجرا کنید:
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 اعمال می کند.
به مرورگر وب خود برگردید و صفحه را برای برنامه پایتون خود بارگیری مجدد کنید. برنامه اصلاح شده خود را در صفحه زیر مشاهده خواهید کرد.
نتیجه
در این آموزش، شما یک برنامه پایتون پایه ایجاد کرده اید و با استفاده از Okteto آن را در خوشه Kubernetes مستقر کرده اید. توانایی Okteto برای همگام سازی تغییرات کد محلی با محیط توسعه در زمان واقعی امکان تکرار سریع توسعه و بازخورد فوری در مورد تغییرات کد را فراهم می کند. به طور کلی، Okteto به توسعه دهندگان این امکان را می دهد تا بدون نگرانی در مورد پیچیدگی های زیرساخت Kubernetes بر ساخت برنامه های پایتون با کیفیت بالا تمرکز کنند.