داکرسرورکوبرنتیزلینوکس

آموزش توسعه اپلیکیشن‌ها روی کوبرنیتیز با Okteto

مقدمه رابط خط فرمان 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) خود بروید:

bash
cd ~

اکنون یک دایرکتوری جدید به نام hello_world ایجاد کرده و وارد آن شوید:

bash
mkdir hello_world
cd hello_world

یک فایل جدید به نام main.go با IDE یا ویرایشگر متن دلخواه خود ایجاد و باز کنید:

bash
nano main.go

فایل main.go یک وب‌سرور Go خواهد بود که پیام Hello world! را برمی‌گرداند. بنابراین، از کد زیر استفاده می‌کنیم:

main.go

go
package main
import (
“fmt”
“net/http”
)
func main() {
fmt.Println(“Starting hello-world server…”)
http.HandleFunc(“/”, helloServer)
if err := http.ListenAndServe(“:8080”, nil); err != nil {
panic(err)
}
}
func helloServer(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “Hello world!”)
}

کد موجود در main.go کارهای زیر را انجام می‌دهد:

  • اولین دستور در یک فایل سورس Go باید نام پکیج باشد. دستورات اجرایی همیشه باید از package main استفاده کنند.
  • بخش import نشان می‌دهد که کد به کدام پکیج‌ها وابسته است. در این حالت از fmt برای دستکاری رشته‌ها و از net/http برای وب‌سرور HTTP استفاده می‌شود.
  • تابع main نقطه ورود به باینری شماست. متد http.HandleFunc برای پیکربندی سرور استفاده می‌شود تا هنگام دریافت درخواستی برای مسیر /، تابع helloServer را فراخوانی کند. http.ListenAndServe یک سرور HTTP را راه‌اندازی می‌کند که روی تمام رابط‌های شبکه و در پورت 8080 گوش می‌دهد.
  • تابع helloServer حاوی منطق پردازشگر درخواست شماست. در این حالت، Hello world! را به عنوان پاسخ به درخواست می‌نویسد.

شما باید یک ایمج داکر بسازید و آن را به رجیستری داکر خود پوش (Push) کنید تا کوبرنیتیز بتواند آن را Pull کرده و سپس اپلیکیشن را اجرا کند.

یک فایل جدید به نام Dockerfile باز کنید:

bash
nano Dockerfile

این فایل شامل دستورات مورد نیاز برای ساخت کانتینر داکر اپلیکیشن شماست. (برای سریع‌تر شدن پروسه_build از میرور پارمین کلود استفاده شده است):

Dockerfile

dockerfile
FROM hub.cr.parmincloud.ir/golang:alpine as builder
RUN apk –update –no-cache add bash
WORKDIR /app
ADD . .
RUN go build -o app
FROM hub.cr.parmincloud.ir/alpine as prod
WORKDIR /app
COPY –from=builder /app/app /app/app
EXPOSE 8080
CMD [“./app”]

این Dockerfile دارای دو مرحله (Stage) است: builder و prod:

  • مرحله builder شامل ابزارهای بیلد Go است. این مرحله مسئول کپی کردن فایل‌ها و ساخت باینری Go است.
  • مرحله prod ایمج نهایی است. این مرحله فقط شامل یک سیستم‌عامل سبک شده و باینری اپلیکیشن خواهد بود.

ایmj کانتینر را بسازید (به جای your_DockerHub_username نام کاربری داکر هاب خود را وارد کنید):

bash
docker build -t hub.cr.parmincloud.ir/your_DockerHub_username/hello-world:latest

اکنون آن را به Docker Hub پوش کنید:

bash
docker push hub.cr.parmincloud.ir/your_DockerHub_username/hello-world:latest

سپس، یک پوشه جدید برای مانیفست‌های کوبرنیتیز ایجاد کنید:

bash
mkdir k8s

هنگامی که از یک مانیفست کوبرنیتیز استفاده می‌کنید، به کوبرنیتیز می‌گویید که می‌خواهید اپلیکیشن شما چگونه اجرا شود. این بار، یک شیء Deployment ایجاد خواهید کرد. بنابراین، یک فایل جدید به نام deployment.yaml ایجاد کنید:

bash
nano k8s/deployment.yaml

محتوای زیر یک شیء Deployment کوبرنیتیز را توصیف می‌کند که ایمج داکر hello-world:latest را اجرا می‌کند. این محتوا را به فایل جدید خود اضافه کنید، اما در مورد شما، your_DockerHub_username را با نام کاربری داکر هاب خود جایگزین کنید:

~/hello_world/k8s/deployment.yaml

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-world
spec:
selector:
matchLabels:
app: hello-world
replicas: 1
template:
metadata:
labels:
app: hello-world
spec:
containers:
name: hello-world
image: hub.cr.parmincloud.ir/your_DockerHub_username/hello-world:latest
ports:
containerPort: 8080

مانیفست Deployment دارای سه بخش اصلی است:

  • metadata نام Deployment شما را تعریف می‌کند.
  • replicas تعیین می‌کند که چند کپی از آن را در حال اجرا می‌خواهید.
  • template به کوبرنیتیز می‌گوید که چه چیزی را استقرار دهد و چه برچسب‌هایی (Labels) را اضافه کند. در این حالت، یک کانتینر واحد با ایمج hello-world:latest که روی پورت 8080 گوش می‌دهد و دارای برچسب app: hello-world است.

اکنون به روشی برای دسترسی به اپلیکیشن خود نیاز دارید. می‌توانید با ایجاد یک شیء Service، یک اپلیکیشن را در کوبرنیتیز در معرض دید قرار دهید. یک فایل جدید به نام service.yaml ایجاد کنید:

bash
nano k8s/service.yaml

محتوای زیر یک Service را توصیف می‌کند که Deployment مربوط به hello-world را در معرض دید قرار می‌دهد و در پس‌زمینه از یک Load Balancer پارمین کلود استفاده خواهد کرد:

k8s/service.yaml

yaml
apiVersion: v1
kind: Service
metadata:
name: hello-world
spec:
type: LoadBalancer
ports:
– protocol: TCP
port: 80
targetPort: 8080
name: http
selector:
app: hello-world

مانیفست Service دارای چهار بخش اصلی است:

  • metadata به کوبرنیتیز می‌گوید که سرویس شما را چگونه نام‌گذاری کند.
  • type به کوبرنیتیز می‌گوید که چگونه می‌خواهید سرویس خود را در معرض دید قرار دهید. در این حالت، این سرویس به صورت خارجی از طریق یک Load Balancer پارمین کلود در معرض دید قرار می‌گیرد.
  • برچسب ports به کوبرنیتیز می‌گوید که کدام پورت‌ها را می‌خواهید در معرض دید قرار دهید و چگونه آن‌ها را به Deployment خود نگاشت کنید. در این حالت، پورت 80 را به صورت خارجی در معرض دید قرار می‌دهید و آن را به پورت 8080 در Deployment خود هدایت می‌کنید.
  • selector به کوبرنیتیز می‌گوید که ترافیک را چگونه هدایت کند. در این حالت، هر Pod با برچسب app: hello-world ترافیک را دریافت خواهد کرد.

اکنون همه چیز برای استقرار اپلیکیشن “Hello World” خود روی کوبرنیتیز آماده است.


مرحله ۲ — استقرار اپلیکیشن Hello World

در این مرحله، اپلیکیشن “Hello World” خود را روی کوبرنیتیز مستقر می‌کنید و سپس اعتبارسنجی می‌کنید که به درستی کار می‌کند.

ابتدا اپلیکیشن خود را روی کوبرنیتیز مستقر کنید:

bash
kubectl apply -f k8s

خروجی زیر را خواهید دید:

text
Output
deployment.apps “hello-world” created
service “hello-world” created

پس از حدود یک دقیقه، می‌توانید IP اپلیکیشن خود را بازیابی کنید. برای بررسی سرویس خود از این دستور kubectl استفاده کنید:

bash
kubectl get service hello-world

خروجی مشابه زیر را خواهید دید که اشیاء سرویس کوبرنیتیز شما را لیست می‌کند. به IP اپلیکیشن خود در ستون EXTERNAL-IP توجه کنید:

text
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-world ClusterIP your_cluster_ip your_external_ip 8080/TCP 37s

مرورگر خود را باز کرده و به your_external_ip لیست شده برای اپلیکیشن “Hello World” خود بروید. قبل از ادامه مرحله بعد، تایید کنید که اپلیکیشن شما بالا و در حال اجرا است.

تا این لحظه، شما مسیری کاملاً سنتی را برای توسعه اپلیکیشن‌ها با کوبرنیتیز دنبال کرده‌اید. از این به بعد، هر بار که بخواهید کد اپلیکیشن خود را تغییر دهید، باید یک ایمج داکر جدید بسازید و آن را پوش کنید و سپس آن ایمج را در کوبرنیتیز Pull کنید. این فرآیند می‌تواند زمان زیادی ببرد. Okteto برای ساده‌سازی این چرخه درونی توسعه (Inner-loop) طراحی شده است.


مرحله ۳ — نصب Okteto CLI

شما اکنون بهره‌وری توسعه کوبرنیتیز خود را با نصب Okteto CLI بهبود می‌بخشید. رابط خط فرمان Okteto یک پروژه متن‌باز است که به شما اجازه می‌دهد تغییرات کد اپلیکیشن را با اپلیکیشن در حال اجرا روی کوبرنیتیز همگام کنید. می‌توانید به استفاده از IDE، دیباگرها یا کامپایلرهای دلخواه خود ادامه دهید بدون اینکه نیازی به Commit، Build، Push یا استقرار مجدد کانتینرها برای تست اپلیکیشن داشته باشید.

برای نصب Okteto CLI روی ماشین مک یا لینوکس، دستور زیر را اجرا کنید:

bash
curl https://get.okteto.com -sSfL | sh

اگر از ویندوز استفاده می‌کنید، می‌توانید فایل را از طریق مرورگر وب خود دانلود کرده و به صورت دستی به $PATH خود اضافه کنید.

پس از نصب Okteto CLI، آماده هستید تا اپلیکیشن “Hello World” خود را در حالت توسعه قرار دهید.


مرحله ۴ — قرار دادن اپلیکیشن در حالت توسعه

Okteto CLI طوری طراحی شده است که اپلیکیشن در حال اجرا روی یک کلاستر کوبرنیتیز را با کدی که روی ماشین خود دارید جایگزین کند. برای انجام این کار، Okteto از اطلاعاتی که از یک فایل مانیفست Okteto دریافت می‌کند استفاده می‌کند.

یک فایل جدید به نام okteto.yaml ایجاد کنید:

bash
nano okteto.yaml

یک مانیفست اولیه بنویسید که در آن نام شیء Deployment، ایمج پایه داکر و یک شل (Shell) را تعریف می‌کنید. از محتوای نمونه زیر استفاده کنید:

okteto.yaml

yaml
name: hello-world
image: hub.cr.parmincloud.ir/okteto/golang:1
workdir: /app
command: [“bash”]

با اجرای دستور زیر، اپلیکیشن خود را برای ورود به حالت توسعه آماده کنید:

bash
okteto up
text
Output
✓ Development environment activated
✓ Files synchronized
Namespace: default
Name: hello-world
Welcome to your development environment. Happy coding!
default:hello-world /app>

دستور okteto up اپلیکیشن “Hello World” را با یک محیط توسعه جایگزین می‌کند، به این معنی که:

  • کانتینر اپلیکیشن با ایمج داکر okteto/golang:1 به‌روزرسانی می‌شود. این ایمج شامل ابزارهای توسعه مورد نیاز برای ساخت، تست، دیباگ و اجرای اپلیکیشن است.
  • یک سرویس همگام‌سازی فایل برای حفظ به‌روز بودن تغییرات بین فایل‌سیستم محلی شما و Podهای اپلیکیشن ایجاد می‌شود.
  • یک شل ریموت در محیط توسعه شما شروع می‌شود. اکنون می‌توانید اپلیکیشن خود را بسازید، تست کنید و اجرا کنید.

هر پردازشی را که در شل ریموت اجرا کنید، ترافیک ورودی یکسانی دریافت خواهد کرد و همان متغیرهای محیطی، Volumeها یا Secretهای اپلیکیشن اصلی را خواهد داشت. این امر یک محیط توسعه بسیار واقع‌گرایانه و شبیه‌سازی‌شده پروداکشن به شما می‌دهد.

در همان کنسول، اپلیکیشن را به صورت معمول اجرا کنید:

bash
go run main.go
text
Output
Starting hello-world server…

برای اولین بار که اپلیکیشن را اجرا می‌کنید، Go وابستگی‌های شما را دانلود کرده و اپلیکیشن را کامپایل می‌کند. منتظر بمانید تا این فرآیند تمام شود و سپس با باز کردن مرورگر و رفرش کردن صفحه اپلیکیشن خود، آن را تست کنید.


مرحله ۵ — توسعه مستقیم روی کوبرنیتیز

بیایید تغییراتی در اپلیکیشن “Hello World” ایجاد کنیم و ببینیم این تغییرات چگونه در کوبرنیتیز منعکس می‌شوند.

فایل main.go را باز کنید و پیام پاسخ خود را به Hello world from Parmin Cloud! تغییر دهید:

main.go

go
package main
import (
“fmt”
“net/http”
)
func main() {
fmt.Println(“Starting hello-world server…”)
http.HandleFunc(“/”, helloServer)
if err := http.ListenAndServe(“:8080”, nil); err != nil {
panic(err)
}
}
func helloServer(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, “Hello world from Parmin Cloud!”)
}

اینجاست که جریان کاری (Workflow) شما تغییر می‌کند. به جای ساخت ایمج‌ها و استقرار مجدد کانتینرها، Okteto تغییرات شما را با محیط توسعه روی کوبرنیتیز همگام می‌کند.

از کنسولی که دستور okteto up را در آن اجرا کرده بودید، اجرای go run main.go را با فشردن CTRL + C لغو کنید. اکنون اپلیکیشن را دوباره اجرا کنید:

bash
default:hello-world /app> go run main.go

به مرورگر برگردید و صفحه اپلیکیشن خود را رفرش کنید. تغییرات کد شما بلافاصله روی کوبرنیتیز اعمال شد و همه اینها بدون نیاز به هیچ Commit، Build یا Pushی انجام شد.

نتیجه‌گیری Okteto کلاستر کوبرنیتیز شما را با یک کلیک به یک پلتفرم توسعه کامل تبدیل می‌کند. در این آموزش، شما Okteto CLI را نصب و پیکربندی کردید تا تغییرات کد خود را به سرعت تایپ کدنویسی، مستقیماً روی کوبرنیتیز اعمال کنید. اکنون می‌توانید برای مشاهده نحوه استفاده از Okteto با زبان‌های برنامه‌نویسی مختلف و دیباگرها، به مخزن نمونه‌های Okteto مراجعه کنید.

از همراهی شما با پارمین کلود سپاسگزاریم.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا