
مقدمه رابط خط فرمان Okteto (Okteto CLI) یک پروژه متنباز است که تجربه توسعه محلی (Local Development) را برای اپلیکیشنهایی که روی کوبرنیتیز (Kubernetes) اجرا میشوند فراهم میکند. با استفاده از این ابزار، میتوانید کد خود را در IDE محلی خود بنویسید و به محض ذخیره یک فایل، تغییرات به کلاستر کوبرنیتیز شما ارسال شده و اپلیکیشن بلافاصله بهروزرسانی میشود. این کل فرآیند بدون نیاز به ساخت (Build) ایمجهای داکر یا اعمال (Apply) مانیفستهای کوبرنیتیز انجام میشود که میتواند زمان قابلتوجهی را صرفهجویی کند.
در این آموزش، شما از Okteto برای بهبود بهرهوری خود هنگام توسعه یک اپلیکیشن بومی کوبرنیتیز (Kubernetes-native) استفاده خواهید کرد. ابتدا، یک کلاستر کوبرنیتیز ایجاد کرده و از آن برای اجرای یک اپلیکیشن استاندارد “Hello World” استفاده میکنید. سپس از Okteto برای توسعه و بهروزرسانی خودکار اپلیکیشن خود بدون نیاز به نصب هیچچیز به صورت محلی استفاده خواهید کرد.
پیشنیازها پیش از شروع این آموزش، به موارد زیر نیاز دارید:
- یک کلاستر کوبرنیتیز نسخه 1.12 به بالا. در این آموزش، راهاندازی از یک کلاستر کوبرنیتیز پارمین کلود (Parmin Cloud) با سه نود استفاده میکند، اما شما میتوانید از روش دیگری برای ایجاد کلاستر استفاده کنید.
- ابزارهای
kubectlوdoctlنصب شده و برای ارتباط با کلاستر شما پیکربندی شده باشند. - یک حساب کاربری در Docker Hub.
- داکر روی ماشین محلی شما در حال اجرا باشد.
مرحله ۱ — ایجاد اپلیکیشن Hello World
برنامه “Hello World” یک سنت دیرینه در توسعه وب است. در این حالت، این یک سرویس وب ساده است که به هر درخواست، پیام “Hello World” را پاسخ میدهد. اکنون که کلاستر کوبرنیتیز خود را ایجاد کردهاید، بیایید یک اپلیکیشن “Hello World” به زبان Go (Golang) بنویسیم و مانیفستهایی را ایجاد کنیم که از آنها برای استقرار (Deploy) روی کوبرنیتیز استفاده خواهید کرد.
ابتدا به دایرکتوری خانه (Home) خود بروید:
اکنون یک دایرکتوری جدید به نام hello_world ایجاد کرده و وارد آن شوید:
یک فایل جدید به نام main.go با IDE یا ویرایشگر متن دلخواه خود ایجاد و باز کنید:
فایل main.go یک وبسرور Go خواهد بود که پیام Hello world! را برمیگرداند. بنابراین، از کد زیر استفاده میکنیم:
main.go
کد موجود در main.go کارهای زیر را انجام میدهد:
- اولین دستور در یک فایل سورس Go باید نام پکیج باشد. دستورات اجرایی همیشه باید از
package mainاستفاده کنند. - بخش
importنشان میدهد که کد به کدام پکیجها وابسته است. در این حالت ازfmtبرای دستکاری رشتهها و ازnet/httpبرای وبسرور HTTP استفاده میشود. - تابع
mainنقطه ورود به باینری شماست. متدhttp.HandleFuncبرای پیکربندی سرور استفاده میشود تا هنگام دریافت درخواستی برای مسیر/، تابعhelloServerرا فراخوانی کند.http.ListenAndServeیک سرور HTTP را راهاندازی میکند که روی تمام رابطهای شبکه و در پورت 8080 گوش میدهد. - تابع
helloServerحاوی منطق پردازشگر درخواست شماست. در این حالت،Hello world!را به عنوان پاسخ به درخواست مینویسد.
شما باید یک ایمج داکر بسازید و آن را به رجیستری داکر خود پوش (Push) کنید تا کوبرنیتیز بتواند آن را Pull کرده و سپس اپلیکیشن را اجرا کند.
یک فایل جدید به نام Dockerfile باز کنید:
این فایل شامل دستورات مورد نیاز برای ساخت کانتینر داکر اپلیکیشن شماست. (برای سریعتر شدن پروسه_build از میرور پارمین کلود استفاده شده است):
Dockerfile
این Dockerfile دارای دو مرحله (Stage) است: builder و prod:
- مرحله
builderشامل ابزارهای بیلد Go است. این مرحله مسئول کپی کردن فایلها و ساخت باینری Go است. - مرحله
prodایمج نهایی است. این مرحله فقط شامل یک سیستمعامل سبک شده و باینری اپلیکیشن خواهد بود.
ایmj کانتینر را بسازید (به جای your_DockerHub_username نام کاربری داکر هاب خود را وارد کنید):
اکنون آن را به Docker Hub پوش کنید:
سپس، یک پوشه جدید برای مانیفستهای کوبرنیتیز ایجاد کنید:
هنگامی که از یک مانیفست کوبرنیتیز استفاده میکنید، به کوبرنیتیز میگویید که میخواهید اپلیکیشن شما چگونه اجرا شود. این بار، یک شیء Deployment ایجاد خواهید کرد. بنابراین، یک فایل جدید به نام deployment.yaml ایجاد کنید:
محتوای زیر یک شیء Deployment کوبرنیتیز را توصیف میکند که ایمج داکر hello-world:latest را اجرا میکند. این محتوا را به فایل جدید خود اضافه کنید، اما در مورد شما، your_DockerHub_username را با نام کاربری داکر هاب خود جایگزین کنید:
~/hello_world/k8s/deployment.yaml
مانیفست Deployment دارای سه بخش اصلی است:
metadataنام Deployment شما را تعریف میکند.replicasتعیین میکند که چند کپی از آن را در حال اجرا میخواهید.templateبه کوبرنیتیز میگوید که چه چیزی را استقرار دهد و چه برچسبهایی (Labels) را اضافه کند. در این حالت، یک کانتینر واحد با ایمجhello-world:latestکه روی پورت 8080 گوش میدهد و دارای برچسبapp: hello-worldاست.
اکنون به روشی برای دسترسی به اپلیکیشن خود نیاز دارید. میتوانید با ایجاد یک شیء Service، یک اپلیکیشن را در کوبرنیتیز در معرض دید قرار دهید. یک فایل جدید به نام service.yaml ایجاد کنید:
محتوای زیر یک Service را توصیف میکند که Deployment مربوط به hello-world را در معرض دید قرار میدهد و در پسزمینه از یک Load Balancer پارمین کلود استفاده خواهد کرد:
k8s/service.yaml
مانیفست Service دارای چهار بخش اصلی است:
metadataبه کوبرنیتیز میگوید که سرویس شما را چگونه نامگذاری کند.typeبه کوبرنیتیز میگوید که چگونه میخواهید سرویس خود را در معرض دید قرار دهید. در این حالت، این سرویس به صورت خارجی از طریق یک Load Balancer پارمین کلود در معرض دید قرار میگیرد.- برچسب
portsبه کوبرنیتیز میگوید که کدام پورتها را میخواهید در معرض دید قرار دهید و چگونه آنها را به Deployment خود نگاشت کنید. در این حالت، پورت 80 را به صورت خارجی در معرض دید قرار میدهید و آن را به پورت 8080 در Deployment خود هدایت میکنید. selectorبه کوبرنیتیز میگوید که ترافیک را چگونه هدایت کند. در این حالت، هر Pod با برچسبapp: hello-worldترافیک را دریافت خواهد کرد.
اکنون همه چیز برای استقرار اپلیکیشن “Hello World” خود روی کوبرنیتیز آماده است.
مرحله ۲ — استقرار اپلیکیشن Hello World
در این مرحله، اپلیکیشن “Hello World” خود را روی کوبرنیتیز مستقر میکنید و سپس اعتبارسنجی میکنید که به درستی کار میکند.
ابتدا اپلیکیشن خود را روی کوبرنیتیز مستقر کنید:
خروجی زیر را خواهید دید:
پس از حدود یک دقیقه، میتوانید IP اپلیکیشن خود را بازیابی کنید. برای بررسی سرویس خود از این دستور kubectl استفاده کنید:
خروجی مشابه زیر را خواهید دید که اشیاء سرویس کوبرنیتیز شما را لیست میکند. به IP اپلیکیشن خود در ستون EXTERNAL-IP توجه کنید:
مرورگر خود را باز کرده و به your_external_ip لیست شده برای اپلیکیشن “Hello World” خود بروید. قبل از ادامه مرحله بعد، تایید کنید که اپلیکیشن شما بالا و در حال اجرا است.
تا این لحظه، شما مسیری کاملاً سنتی را برای توسعه اپلیکیشنها با کوبرنیتیز دنبال کردهاید. از این به بعد، هر بار که بخواهید کد اپلیکیشن خود را تغییر دهید، باید یک ایمج داکر جدید بسازید و آن را پوش کنید و سپس آن ایمج را در کوبرنیتیز Pull کنید. این فرآیند میتواند زمان زیادی ببرد. Okteto برای سادهسازی این چرخه درونی توسعه (Inner-loop) طراحی شده است.
مرحله ۳ — نصب Okteto CLI
شما اکنون بهرهوری توسعه کوبرنیتیز خود را با نصب Okteto CLI بهبود میبخشید. رابط خط فرمان Okteto یک پروژه متنباز است که به شما اجازه میدهد تغییرات کد اپلیکیشن را با اپلیکیشن در حال اجرا روی کوبرنیتیز همگام کنید. میتوانید به استفاده از IDE، دیباگرها یا کامپایلرهای دلخواه خود ادامه دهید بدون اینکه نیازی به Commit، Build، Push یا استقرار مجدد کانتینرها برای تست اپلیکیشن داشته باشید.
برای نصب Okteto CLI روی ماشین مک یا لینوکس، دستور زیر را اجرا کنید:
اگر از ویندوز استفاده میکنید، میتوانید فایل را از طریق مرورگر وب خود دانلود کرده و به صورت دستی به $PATH خود اضافه کنید.
پس از نصب Okteto CLI، آماده هستید تا اپلیکیشن “Hello World” خود را در حالت توسعه قرار دهید.
مرحله ۴ — قرار دادن اپلیکیشن در حالت توسعه
Okteto CLI طوری طراحی شده است که اپلیکیشن در حال اجرا روی یک کلاستر کوبرنیتیز را با کدی که روی ماشین خود دارید جایگزین کند. برای انجام این کار، Okteto از اطلاعاتی که از یک فایل مانیفست Okteto دریافت میکند استفاده میکند.
یک فایل جدید به نام okteto.yaml ایجاد کنید:
یک مانیفست اولیه بنویسید که در آن نام شیء Deployment، ایمج پایه داکر و یک شل (Shell) را تعریف میکنید. از محتوای نمونه زیر استفاده کنید:
okteto.yaml
با اجرای دستور زیر، اپلیکیشن خود را برای ورود به حالت توسعه آماده کنید:
دستور okteto up اپلیکیشن “Hello World” را با یک محیط توسعه جایگزین میکند، به این معنی که:
- کانتینر اپلیکیشن با ایمج داکر
okteto/golang:1بهروزرسانی میشود. این ایمج شامل ابزارهای توسعه مورد نیاز برای ساخت، تست، دیباگ و اجرای اپلیکیشن است. - یک سرویس همگامسازی فایل برای حفظ بهروز بودن تغییرات بین فایلسیستم محلی شما و Podهای اپلیکیشن ایجاد میشود.
- یک شل ریموت در محیط توسعه شما شروع میشود. اکنون میتوانید اپلیکیشن خود را بسازید، تست کنید و اجرا کنید.
هر پردازشی را که در شل ریموت اجرا کنید، ترافیک ورودی یکسانی دریافت خواهد کرد و همان متغیرهای محیطی، Volumeها یا Secretهای اپلیکیشن اصلی را خواهد داشت. این امر یک محیط توسعه بسیار واقعگرایانه و شبیهسازیشده پروداکشن به شما میدهد.
در همان کنسول، اپلیکیشن را به صورت معمول اجرا کنید:
برای اولین بار که اپلیکیشن را اجرا میکنید، Go وابستگیهای شما را دانلود کرده و اپلیکیشن را کامپایل میکند. منتظر بمانید تا این فرآیند تمام شود و سپس با باز کردن مرورگر و رفرش کردن صفحه اپلیکیشن خود، آن را تست کنید.
مرحله ۵ — توسعه مستقیم روی کوبرنیتیز
بیایید تغییراتی در اپلیکیشن “Hello World” ایجاد کنیم و ببینیم این تغییرات چگونه در کوبرنیتیز منعکس میشوند.
فایل main.go را باز کنید و پیام پاسخ خود را به Hello world from Parmin Cloud! تغییر دهید:
main.go
اینجاست که جریان کاری (Workflow) شما تغییر میکند. به جای ساخت ایمجها و استقرار مجدد کانتینرها، Okteto تغییرات شما را با محیط توسعه روی کوبرنیتیز همگام میکند.
از کنسولی که دستور okteto up را در آن اجرا کرده بودید، اجرای go run main.go را با فشردن CTRL + C لغو کنید. اکنون اپلیکیشن را دوباره اجرا کنید:
به مرورگر برگردید و صفحه اپلیکیشن خود را رفرش کنید. تغییرات کد شما بلافاصله روی کوبرنیتیز اعمال شد و همه اینها بدون نیاز به هیچ Commit، Build یا Pushی انجام شد.
نتیجهگیری Okteto کلاستر کوبرنیتیز شما را با یک کلیک به یک پلتفرم توسعه کامل تبدیل میکند. در این آموزش، شما Okteto CLI را نصب و پیکربندی کردید تا تغییرات کد خود را به سرعت تایپ کدنویسی، مستقیماً روی کوبرنیتیز اعمال کنید. اکنون میتوانید برای مشاهده نحوه استفاده از Okteto با زبانهای برنامهنویسی مختلف و دیباگرها، به مخزن نمونههای Okteto مراجعه کنید.
از همراهی شما با پارمین کلود سپاسگزاریم.



