نحوه توسعه برنامه ها در Kubernetes با Okteto

Okteto CLI یک پروژه منبع باز است که تجربه توسعه محلی را برای برنامه های در حال اجرا در Kubernetes فراهم می کند. با استفاده از آن می توانید کد خود را بر روی IDE محلی خود بنویسید و به محض ذخیره یک فایل ، تغییرات را می توان به خوشه Kubernetes خود وارد کرد و برنامه شما فوراً بروزرسانی خواهد شد. کل این فرآیند بدون نیاز به ساخت تصاویر Docker یا اعمال مانیفست های Kubernetes اتفاق می افتد ، که می تواند زمان قابل توجهی طول بکشد.در این آموزش ، شما از Okteto برای بهبود بهره وری در هنگام تهیه یک برنامه بومی Kubernetes استفاده خواهید کرد. ابتدا ، یک خوشه Kubernetes ایجاد می کنید و از آن برای اجرای یک برنامه استاندارد “Hello World” استفاده می کنید. سپس از Okteto برای توسعه و به روز کردن خودکار برنامه خود بدون نیاز به نصب محلی استفاده خواهید کرد.پیش نیازهاقبل از شروع این آموزش ، موارد زیر را نیاز خواهید داشت:⦁ خوشه Kubernetes 1.12+ . در این آموزش ، از یک خوشه vpsgol Kubernetes با سه گره استفاده می شود ، اما شما می توانید با استفاده از یک روش دیگر ، خوشه ایجاد کنید.⦁ kubectl و doctl برای برقراری ارتباط با خوشه شما نصب و تنظیم شده باشند.⦁ یک حساب کاربری Docker Hub⦁ Docker در حال اجرا بر روی دستگاه محلی شما.مرحله 1 – ایجاد برنامه Hello Worldبرنامه “hello world” یک سنت قدیمی در توسعه وب است. در این حالت ، یک سرویس وب ساده است که به هر درخواست با ” hello world” پاسخ می دهد. اکنون که خوشه Kubernetes خود را ایجاد کرده اید ، اجازه دهید یک برنامه “Hello World” را در Golang و مانیفیستی که برای استقرار آن در Kubernetes استفاده خواهید کرد ، ایجاد کنیم.اولین به دایرکتوری هوم خود سوییچ کنید:⦁ $ cd ~⦁اکنون یک دایرکتوری جدید به نام hello_world تهیه کرده و به داخل آن بروید:⦁ $ mkdir hello_world⦁⦁ $ cd hello_worldبا IDE یا ویرایشگر متن مورد علاقه خود ، فایل جدیدی را با نام main.go ایجاد و باز کنید:⦁ $ nano main.go⦁main.go یک وب سرور مجازی Golang خواهد بود که پیام hello world را به شما باز می گرداند !. بنابراین ، اجازه دهید از کد زیر استفاده کنیم:main.gopackage mainimport (“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 استفاده کنند.⦁ بخش ورودی نشان می دهد کد بسته به چه مواردی بستگی دارد. در این حالت از fmt برای دستکاری رشته و net / http برای سرور مجازی HTTP استفاده می کند.⦁ تابع main نقطه ورود به باینری شماست. از روش http.HandleFunc برای پیکربندی سرور مجازی جهت فراخوانی helloServer در هنگام دریافت درخواست به مسیر / استفاده می شود. http.ListenAndServe یک سرور مجازی HTTP را شروع می کند که در تمام رابط های شبکه به پورت 8080 گوش می دهد.⦁ عملکرد helloServer شامل منطق کنترل کننده درخواست شما است. در این حالت ، hello world! را به عنوان پاسخ به درخواست خواهد نوشت.شما باید یک تصویر Docker ایجاد کرده و آن را به سمت رجیستری Docker خود هدایت کنید تا Kubernetes بتواند آن را دریافت و سپس برنامه را اجرا کند.یک فایل جدید با نام Dockerfile را با IDE یا ویرایشگر متن مورد علاقه خود باز کنید:⦁ $ nano Dockerfile⦁Dockerfile شامل دستورات لازم برای ساخت کانتینر Docker برنامه شما می باشد. اجازه دهید از کد زیر استفاده کنیم:DockerfileFROM golang:alpine as builderRUN apk –update –no-cache add bashWORKDIR /appADD . .RUN go build -o appFROM alpine as prodWORKDIR /appCOPY –from=builder /app/app /app/appEXPOSE 8080CMD [“./app”]CopyDockerfile شامل دو مرحله است builder و prod:• مرحله builder شامل ابزارهای ساخت Go است. که مسئول کپی کردن فایل ها و ساخت باینری Go است.• مرحله prod تصویر نهایی است. فقط شامل یک سیستم تهی و باینری برنامه خواهد بود.این یک تمرین خوب میباشد. کانتینر تولید شما را کوچکتر و ایمن تر می کند زیرا تنها شامل برنامه شما و دقیقاً آنچه برای اجرای آن لازم است می باشد.تصویر کانتینر را بسازید (نام_DockerHub_usus را با نام کاربری داکر هاب خود جایگزین کنید):⦁ $ docker build -t your_DockerHub_username/hello-world:latest⦁اکنون آن را به Docker Hub وارد کنید:⦁ $ docker push your_DockerHub_username/hello-world:latest⦁سپس ، یک پوشه جدید برای مانیفست Kubernetes ایجاد کنید:⦁ $ mkdir k8s⦁وقتی از مانیفست Kubernetes استفاده می کنید ، به Kubernetes می گویید که چگونه برنامه شما اجرا می شود. این بار ، یک شیء استقرار ایجاد می کنید. بنابراین ، یک فایل جدید deployment.yaml را با IDE یا ویرایشگر متن مورد علاقه خود ایجاد کنید:⦁ $ nano k8s/deployment.yaml⦁مطالب زیر یک شیء استقرار Kubernetes را شرح می دهد که تصویر داکر okteto/hello-world:latest را اجرا میکند. این محتوا را به فایل جدید خود اضافه کنید ، اما در مورد شما okteto ذکر شده بعد از برچسب image را با your_DockerHub_username جایگزین کنید:~/hello_world/k8s/deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: hello-worldspec:selector:matchLabels:app: hello-worldreplicas: 1template:metadata:labels:app: hello-worldspec:containers:– name: hello-worldimage: your_DockerHub_username/hello-world:latestports:– containerPort: 8080مانیفست استقرار دارای سه بخش اصلی است:⦁ metadata نام استقرار شما را مشخص می کند.⦁ replicas مشخص می کند که چند نسخه از آن را می خواهید اجرا کنید.⦁ template به Kubernetes می گوید که چه چیزی را مستقر کند و چه برچسب هایی را اضافه نماید. در این حالت ، یک کانتینر واحد ، با تصویر okteto/hello-world:latest ، که به پورت 8080 گوش میدهد، و با برچسب app: hello-world همراه است. توجه داشته باشید که این برچسب همان مورد استفاده در بخش selector است.اکنون به راهی برای دسترسی به برنامه خود نیاز دارید. می توانید با ایجاد یک شیء سرویس ، برنامه ای را در Kubernetes قرار دهید. بیایید با استفاده از مانیفست این کار را انجام دهیم. با IDE یا ویرایشگر متن مورد علاقه خود فایل جدیدی به نام service.yaml ایجاد کنید:⦁ nano k8s/service.yaml⦁محتوای زیر سرویس هایی را نشان می دهد که شیء استقرار hello world را در معرض دید شما قرار می دهد:k8s/service.yamlapiVersion: v1kind: Servicemetadata:name: hello-worldspec:type: LoadBalancerports:– protocol: TCPport: 80targetPort: 8080name: httpselector:app: hello-worldمانیفست سرویس چهار بخش اصلی دارد:⦁ metadata به Kubernetes می گوید كه چگونه سرویس خود را نامگذاری كنند.⦁ type به Kubernetes می گوید چگونه می خواهید سرویس خود را در معرض دید قرار دهید.⦁ برچسب ports به Kubernetes می گوید كه كدام پورت را می خواهید در معرض دید قرار دهید ، و چگونه می توانید آنها را برای استقرار خود نگاشت كنید. در این حالت ، پورت 80 را به صورت خارجی در معرض دید قرار می دهید و آن را به پورت 8080 در محل استقرار خود هدایت می کنید.⦁ selector به Kubernetes می گوید که چگونه ترافیک را هدایت کند. در این حالت ، هر پوسته با برچسب app: hello-world ترافیک دریافت می کند.اکنون شما همه چیز را برای استقرار برنامه “hello world” خود در Kubernetes دارید. در ادامه کار استقرار را انجام خواهیم داد.مرحله 2 – استفاده از برنامه Hello World شمادر این مرحله برنامه “Hello World” خود را در Kubernetes مستقر می کنید ، سپس تأیید می کنید که درست کار می کند.با استقرار برنامه خود در Kubernetes کار را شروع کنید:⦁ $ kubectl apply -f k8s⦁خروجی زیر را مشاهده خواهید کرد:Outputdeployment.apps “hello-world” createdservice “hello-world” createdبعد از گذشت حدود یک دقیقه یا بیشتر ، می توانید IP برنامه خود را بازیابی کنید. برای بررسی سرویس خود از این دستور kubectl استفاده کنید:⦁ $ kubectl get service hello-world⦁خروجی مانند این را مشاهده خواهید کرد که اشیاء سرویس Kubernetes را لیست میکند. به IP برنامه خود در ستون EXTERNAL-IP توجه کنید:OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEhello-world ClusterIP your_cluster_ip your_external_ip 8080/TCP 37sمرورگر خود را باز کنید و به برنامه your_external_ip که برای برنامه “Hello World” ذکر شده است بروید. قبل از ادامه مرحله بعدی تأیید کنید که برنامه شما در حال اجرا است.تا این لحظه ، شما یک مسیر نسبتاً سنتی را برای توسعه برنامه ها با Kubernetes دنبال کرده اید. در ادامه ، هر زمان که می خواهید کد را در برنامه خود تغییر دهید ، باید یک تصویر جدید Docker بسازید و وارد کنید و سپس آن تصویر را از Kubernetes بیرون بکشید. این روند می تواند مدتی طول بکشد. Okteto برای ساده تر ساختن این حلقه درونی طراحی شده است. بیایید به Okteto CLI نگاهی بیندازیم و ببینیم چگونه می تواند کمک کند.مرحله 3 – نصب Okteto CLIاکنون با نصب Okteto CLI ، بهره وری توسعه Kubernetes را بهبود می بخشید. رابط خط فرمان Okteto یک پروژه منبع باز است که به شما امکان می دهد تغییرات کد برنامه را با برنامه های Kubernetes همزمان کنید. شما می توانید با استفاده از IDE ، اشکال زداگر یا کامپایلرهای مورد علاقه خود استفاده کنید بدون اینکه برای تست برنامه خود مجبور به تعهد ، ساخت ، ارائه یا استقرار مجدد کانتینرها باشید – همانطور که در مراحل قبلی انجام دادید.برای نصب Okteto CLI در دستگاه macOS یا Linux ، دستور زیر را اجرا کنید:⦁ $ curl https://get.okteto.com -sSfL | sh⦁بیایید نگاهی دقیق تر به این دستور بیاندازیم:⦁ از دستور curl برای انتقال داده به سرور مجازی استفاده می شود.⦁ پرچم -s هر خروجی را سرکوب می کند.⦁ پرچم -S خطاها را نشان می دهد.⦁ پرچم -f باعث عدم موفقیت درخواست در HTTP می شود.⦁ پرچم -L باعث می شود درخواست از تغییر مسیر پیروی کند.⦁ عملگر | این خروجی را به دستور sh پایپ می کند ، که آخرین باینری okteto را در دستگاه محلی شما دانلود و نصب می کند.اگر ویندوز را اجرا می کنید ، می توانید فایل را بطور متناوب از طریق مرورگر وب خود دانلود کرده و به صورت دستی آن را به PATH $ خود اضافه کنید.پس از نصب Okteto CLI ، آماده هستید تا برنامه “hello world” را در حالت توسعه قرار دهید.مرحله 4 – قرار دادن برنامه Hello world در حالت توسعهOkteto CLI به منظور جابجایی برنامه در حال اجرا بر روی خوشه Kubernetes با کد موجود در دستگاه شما طراحی شده است. برای این کار ، Okteto از اطلاعات ارائه شده از یک فایل مانیفست Okteto استفاده می کند. این فایل شیء استقرار Kubernetes را که با کد محلی شما تعویض می شود ، اعلام می کند.با IDE یا ویرایشگر متن مورد علاقه خود فایل جدیدی به نام okteto.yaml ایجاد کنید:⦁ $ nano okteto.yaml⦁بیایید یک مانیفست پایه بنویسیم که در آن می توانید نام شیء استقرار ، تصویر پایه Docker برای استفاده و یک پوسته را تعریف کنید. بعداً به این اطلاعات برمی گردیم. از فایل محتوای نمونه زیر استفاده کنید:okteto.yamlname: hello-worldimage: okteto/golang:1workdir: /appcommand: [“bash”]با اجرای دستور زیر آماده شوید تا برنامه خود را در حالت توسعه قرار دهید:⦁ $ okteto up⦁Output✓ Development environment activated✓ Files synchronizedNamespace: defaultName: hello-worldWelcome to your development environment. Happy coding!default:hello-world /app>دستور okteto up برنامه “hello world” را در یک محیط توسعه عوض می کند ، این بدان معنی است که:⦁ کانتینر برنامه Hello World با تصویرداکر okteto/golang:1 به روز می شود. این تصویر شامل ابزارهای لازم برای ساخت ، آزمایش ، اشکال زدایی و اجرای برنامه “Hello World” است.⦁ یک سرویس همگام سازی فایل ایجاد شده است تا تغییرات شما بین سیستم فایل محلی و غلاف برنامه تان را به روز نگه دارد.⦁ یک پوسته از راه دور در محیط توسعه شما شروع می شود. اکنون می توانید برنامه خود را بگونه ای که در دستگاه محلی خود هستید ، بسازید ، آزمایش و اجرا کنید.⦁ هر پردازشی که در پوسته از راه دور اجرا می کنید ، همان ترافیک ورودی ، همان متغیرهای محیط ، والیوم یا رمزها را به عنوان غلافهای اصلی برنامه “Hello World” دریافت خواهد کرد. این به نوبه خود ، یک محیط توسعه کاملاً واقع بینانه و شبیه تولید را به شما می دهد.در همان کنسول ، اکنون برنامه را طبق معمول اجرا کنید (بدون ساختن و ارائه تصویر Docker) ، مانند این:⦁ Okteto> go run main.go⦁OutputStarting hello-world server…اولین باری که برنامه را اجرا می کنید ، Go متعلقات شما را دانلود و برنامه را کامپایل می کند. صبر کنید تا این فرآیند کامل شود و با باز کردن مرورگر و ریفرش صفحه برنامه خود ، دقیقاً مانند گذشته ، برنامه خود را تست کنید.اکنون آماده هستید تا توسعه را مستقیماً روی Kubernetes شروع کنید.مرحله 5 – توسعه مستقیم روی Kubernetesبیایید شروع به ایجاد تغییراتی در برنامه “hello world” کنیم و سپس ببینیم که چگونه در Kubernetes بازتاب می یابند.فایل main.go را با IDE یا ویرایشگر متن مورد علاقه خود باز کنید. به عنوان مثال ، یک کنسول جداگانه باز کنید و دستور زیر را اجرا کنید:⦁ $ nano main.go⦁سپس ، پیام پاسخ خود را به Hello world from vpsgol! تغییر دهید!:main.gopackage mainimport (“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 vpsgol!”)}اینجاست که گردش کار شما تغییر می کند. Okteto به جای ساختن تصاویر و استفاده مجدد از کانتینر برای به روزرسانی برنامه “hello world” ، تغییرات شما را در محیط توسعه خود در Kubernetes همگام سازی می کند.از کنسولی که فرمان okteto up را اجرا کردید ، با فشار دادن CTRL + C، اجرای go run main.go را لغو کنید. اکنون برنامه را دوباره اجرا کنید:⦁ Okteto> default:hello-world /app> go run main.go⦁OutputStarting hello-world server…به مرورگر برگردید و صفحه برنامه “Hello World” خود را مجدد لود کنید.تغییرات کد شما بلافاصله و همه بدون نیاز به تعهد ، ایجاد یا ارائه در Kubernetes اعمال شد .نتیجهOkteto با کلیک روی یک دکمه ، خوشه Kubernetes را به یک پلت فرم توسعه کاملاً برجسته تبدیل می کند. در این آموزش شما Okteto CLI را نصب و پیکربندی کرده اید تا کدهای خود را مستقیماً بر روی Kubernetes تغییر دهید تا بتوانید کد را سریعاً تایپ کنید. اکنون می توانید به مخزن نمونه Okteto بروید تا نحوه استفاده از Okteto با زبان های مختلف برنامه نویسی و اشکال زدایی را ببینید.همچنین ، اگر یک خوشه Kubernetes را با تیم خود به اشتراک می گذارید ، میتوانید به هر یک از اعضا یک فضای نام Kubernetes ارائه دهید که به گونه ای پیکربندی شده که از سایر توسعه دهندگان که بر روی همان خوشه کار میکنند، جدا باشد. این قابلیت عالی توسط اپلیکیشن Okteto در بازار Kubernetes vpsgol نیز ارائه شده است.