1. قبل از شروع
Kubernetes یک پروژه منبع باز است که میتواند در محیطهای مختلف اجرا شود، از لپتاپ گرفته تا خوشههای چند گرهای با در دسترس بودن بالا، از ابرهای عمومی تا استقرار در محل، و از نمونههای ماشین مجازی (VM) تا فلز خالی.
در این نرم افزار کد، شما یک برنامه وب ساده Spring Boot Java را در Kubernetes در GKE مستقر خواهید کرد، با این هدف که برنامه وب خود را به عنوان یک برنامه تکراری در Kubernetes اجرا کنید. کدی را که روی دستگاه خود توسعه می دهید، دریافت می کنید، آن را به یک تصویر ظرف Docker تبدیل می کنید و تصویر را در GKE اجرا می کنید.
شما از GKE، یک سرویس کاملاً مدیریت شده Kubernetes در Google Cloud استفاده خواهید کرد تا به شما این امکان را می دهد که به جای راه اندازی زیرساخت های زیربنایی، بر روی تجربه Kubernetes تمرکز کنید.
اگر علاقه مند به اجرای Kubernetes بر روی دستگاه محلی خود، مانند یک لپ تاپ توسعه هستید، به Minikube نگاه کنید، که راه اندازی ساده یک خوشه Kubernetes تک گره را برای اهداف توسعه و آزمایش ارائه می دهد. در صورت تمایل میتوانید از Minikube برای مرور کدها استفاده کنید.
نرم افزار Codelab از کد نمونه راهنمای ساخت اپلیکیشن با Spring Boot استفاده می کند.
پیش نیازها
- آشنایی با زبان و ابزارهای برنامه نویسی جاوا
- آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، Emacs و nano
کاری که خواهی کرد
- یک برنامه ساده جاوا را به عنوان یک ظرف Docker بسته بندی کنید.
- خوشه Kubernetes خود را در GKE ایجاد کنید.
- برنامه جاوا خود را در Kubernetes در GKE مستقر کنید.
- خدمات خود را افزایش دهید و ارتقا دهید.
- دسترسی به داشبورد، یک رابط کاربری مبتنی بر وب Kubernetes.
آنچه شما نیاز دارید
- یک پروژه Google Cloud
- یک مرورگر، مانند Google Chrome
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را فعال کنید
- از Cloud Console، روی Activate Cloud Shell کلیک کنید .
اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.
تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.
این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه میکند و در Google Cloud اجرا میشود، که عملکرد و احراز هویت شبکه را بسیار افزایش میدهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.
پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.
- برای تایید احراز هویت، دستور زیر را در Cloud Shell اجرا کنید:
gcloud auth list
خروجی فرمان
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
- دستور زیر را در Cloud Shell اجرا کنید تا تأیید کنید که دستور gcloud از پروژه شما اطلاع دارد:
gcloud config list project
خروجی فرمان
[core] project = <PROJECT_ID>
اگر اینطور نیست، می توانید آن را با این دستور تنظیم کنید:
gcloud config set project <PROJECT_ID>
خروجی فرمان
Updated property [core/project].
3. کد منبع را دریافت کنید
پس از راه اندازی Cloud Shell، می توانید از خط فرمان برای شبیه سازی کد منبع مثال در فهرست اصلی استفاده کنید.
$ git clone https://github.com/spring-guides/gs-spring-boot.git $ cd gs-spring-boot/complete
4. برنامه را به صورت محلی اجرا کنید
- مطمئن شوید JAVA_HOME روی نسخه صحیح تنظیم شده است:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
- می توانید اپلیکیشن Spring Boot را به طور معمول با افزونه Spring Boot راه اندازی کنید.
$ ./mvnw -DskipTests spring-boot:run
- پس از شروع برنامه، روی Web Preview کلیک کنید در نوار ابزار Cloud Shell و Preview در پورت 8080 را انتخاب کنید.
یک برگه در مرورگر شما باز می شود و به سروری که تازه راه اندازی کرده اید متصل می شود.
5. برنامه جاوا را به عنوان یک ظرف Docker بسته بندی کنید
در مرحله بعد، باید برنامه خود را برای اجرا در Kubernetes آماده کنید. اولین قدم این است که ظرف و محتویات آن را تعریف کنید.
- JAR قابل توسعه برای برنامه ایجاد کنید.
$ ./mvnw -DskipTests package
- Artifact Registry API را فعال کنید تا تصویر محفظه ای را که ایجاد می کنید ذخیره کند.
$ gcloud services enable artifactregistry.googleapis.com
- اگر مخزن داکر وجود ندارد، یک مخزن جدید ایجاد کنید . قبل از اینکه بتوانید هر تصویری را به آن فشار دهید، باید یک مخزن ایجاد کنید:
$ gcloud artifacts repositories create codelabrepo --repository-format=docker --location=us-central1
- تصویر شما با فرمت زیر خواهد بود:
{LOCATION}-docker.pkg.dev/{PROJECT-ID}/{REPOSITORY}/{IMAGE-NAME}
به عنوان مثال، اگر مخزن را در موقعیت مکانی us-central1
با نام codelabrepo
ایجاد کرده باشید و بخواهید نام تصویر خود را hello-java:v1
، تصویر به صورت زیر خواهد بود:
us-central1-docker.pkg.dev/{PROJECT-ID}/codelabrepo/hello-java:v1
- از Jib برای ایجاد تصویر ظرف استفاده کنید و آن را به رجیستری Artifact فشار دهید.
$ export GOOGLE_CLOUD_PROJECT=`gcloud config list --format="value(core.project)"` $ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/${GOOGLE_CLOUD_PROJECT}/codelabrepo/hello-java:v1
- شما باید بتوانید با رفتن به صفحه Artifacts Registry Images در Cloud Console، تصویر ظرف فهرست شده در کنسول را ببینید. اکنون یک تصویر Docker در سطح پروژه در دسترس دارید، که Kubernetes میتواند به آن دسترسی داشته باشد و در عرض چند دقیقه آن را هماهنگ کند.
- (اختیاری) پس از تکمیل (دانلود و استخراج همه چیز مدتی طول می کشد)، تصویر را با دستور زیر آزمایش کنید، که یک ظرف Docker را به عنوان یک شبح در پورت 8080 از تصویر ظرف تازه ایجاد شده شما اجرا می کند. اگر با مشکلات مجوز مواجه شدید، ابتدا
gcloud auth configure-docker
us-central1-docker.pkg.dev
را اجرا کنید:
$ docker run -ti --rm -p 8080:8080 \ us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
- باز هم از ویژگی پیش نمایش وب Cloud Shell استفاده کنید.
- شما باید صفحه پیش فرض را در یک تب جدید ببینید. پس از اینکه تأیید کردید که برنامه به صورت محلی در یک ظرف Docker اجرا می شود، می توانید با فشار دادن
Control+C
، کانتینر در حال اجرا را متوقف کنید.
6. خوشه خود را ایجاد کنید
شما آماده ایجاد خوشه GKE خود هستید. یک خوشه از یک سرور API Kubernetes که توسط Google مدیریت می شود و مجموعه ای از گره های کارگر تشکیل شده است. گره های کارگر ماشین های مجازی موتور محاسباتی هستند.
- ابتدا مطمئن شوید که ویژگی های API مربوطه فعال هستند.
$ gcloud services enable compute.googleapis.com container.googleapis.com
- یک خوشه با دو گره
n1-standard-1
ایجاد کنید (تکمیل آن چند دقیقه طول می کشد).
$ gcloud container clusters create hello-java-cluster \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-c
در پایان باید خوشه ایجاد شده را مشاهده کنید.
Creating cluster hello-java-cluster...done. Created [https://container.googleapis.com/v1/projects/...]. kubeconfig entry generated for hello-dotnet-cluster. NAME ZONE MASTER_VERSION hello-java-cluster us-central1-c ...
اکنون باید یک خوشه Kubernetes کاملاً کارآمد با GKE داشته باشید.
اکنون زمان آن است که برنامه کانتینری خود را در خوشه Kubernetes مستقر کنید! از این پس، از خط فرمان kubectl
(که قبلاً در محیط Cloud Shell شما تنظیم شده است) استفاده خواهید کرد. بقیه کدها نیاز دارند که نسخه سرویس گیرنده و سرور Kubernetes 1.2 یا بالاتر باشد. version
kubectl
نسخه فعلی دستور را به شما نشان می دهد.
7. برنامه خود را در Kubernetes مستقر کنید
- استقرار Kubernetes میتواند چندین نمونه از برنامه شما را با استفاده از تصویر ظرفی که ایجاد کردهاید ایجاد، مدیریت و مقیاسبندی کند. با استفاده از دستور
kubectl run
، یک نمونه از برنامه خود را در Kubernetes مستقر کنید.
$ kubectl create deployment hello-java --image=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
- برای مشاهده استقرار ایجاد شده، به سادگی دستور زیر را اجرا کنید:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 1 1 1 1 37s
- برای مشاهده نمونه های برنامه ایجاد شده توسط استقرار، دستور زیر را اجرا کنید:
$ kubectl get pods NAME READY STATUS RESTARTS AGE hello-java-714049816-ztzrb 1/1 Running 0 57s
در این مرحله، شما باید کانتینر خود را تحت کنترل Kubernetes قرار دهید، اما همچنان باید آن را برای دنیای خارج قابل دسترس کنید.
8. اجازه ترافیک خارجی را بدهید
بهطور پیشفرض، Pod فقط با IP داخلی آن در کلاستر قابل دسترسی است. برای اینکه کانتینر hello-java
از خارج از شبکه مجازی Kubernetes قابل دسترسی باشد، باید Pod را به عنوان یک سرویس Kubernetes در معرض دید قرار دهید.
- در Cloud Shell، میتوانید با ایجاد یک سرویس Kubernetes LoadBalancer، Pod را در معرض اینترنت عمومی قرار دهید.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
توجه داشته باشید که شما مستقیماً استقرار را در معرض دید قرار می دهید، نه Pod. این باعث میشود که سرویس بهدستآمده، ترافیک تعادلی را در همه پادهای مدیریت شده توسط استقرار بارگیری کند (در این مورد، فقط یک پاد، اما بعداً کپیهای بیشتری اضافه خواهید کرد).
Kubernetes Master متعادل کننده بار و قوانین ارسال موتور محاسباتی مرتبط، استخرهای هدف و قوانین فایروال را ایجاد می کند تا سرویس را به طور کامل از خارج از Google Cloud در دسترس قرار دهد.
- برای یافتن آدرس IP سرویس در دسترس عموم، به سادگی از
kubectl
درخواست کنید تا تمام خدمات خوشه را فهرست کند.
$ kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-java 10.3.253.62 aaa.bbb.ccc.ddd 8080/TCP 1m kubernetes 10.3.240.1 <none> 443/TCP 5m
- اکنون باید بتوانید با اشاره مرورگر خود به
http://<EXTERNAL_IP>:8080
به سرویس دسترسی پیدا کنید.
9. خدمات خود را مقیاس کنید
یکی از ویژگی های قدرتمند ارائه شده توسط Kubernetes این است که مقیاس کردن برنامه شما چقدر آسان است. فرض کنید که به طور ناگهانی به ظرفیت بیشتری برای برنامه خود نیاز دارید. شما به سادگی می توانید به کنترل کننده تکرار بگویید که تعداد جدیدی از کپی ها را برای نمونه های برنامه شما مدیریت کند.
$ kubectl scale deployment hello-java --replicas=3 deployment "hello-java" scaled $ kubectl get deployment NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 3 3 3 3 22m
به رویکرد اعلامی توجه کنید. به جای شروع یا توقف نمونههای جدید، شما اعلام میکنید که چند نمونه باید همیشه در حال اجرا باشند. حلقه های آشتی Kubernetes به سادگی اطمینان حاصل می کنند که واقعیت با آنچه شما درخواست کرده اید مطابقت دارد و در صورت نیاز اقدام کنید.
10. سرویس خود را ارتقا دهید
در برخی مواقع، برنامه ای که برای تولید مستقر کرده اید به رفع اشکال یا ویژگی های اضافی نیاز دارد. Kubernetes می تواند به شما کمک کند تا یک نسخه جدید را بدون تأثیرگذاری بر کاربران خود به تولید بفرستید.
- با کلیک بر روی Open editor، ویرایشگر کد را باز کنید در منوی Cloud Shell.
- به
src/main/java/com/example/springboot/HelloController.java
بروید و مقدار پاسخ را به روز کنید.
package com.example.springboot;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Google Kubernetes Engine!";
}
}
- از Jib برای ساختن و فشار دادن نسخه جدیدی از تصویر ظرف استفاده کنید. ساختن و فشار دادن تصویر بهروزرسانی شده باید بسیار سریعتر انجام شود، زیرا از حداکثر بهرهگیری از حافظه پنهان استفاده میکنید.
$ ./mvnw -DskipTests package com.google.cloud.tools:jib-maven-plugin:build -Dimage=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2
شما آماده هستید تا Kubernetes به آرامی کنترلر تکرار شما را به نسخه جدید برنامه به روز کند!
- به منظور تغییر برچسب تصویر برای ظرف در حال اجرا خود، باید استقرار
hello-java
موجود را ویرایش کنید و تصویر را ازus-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1
تغییر دهید.
به us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v2
- میتوانید از دستور
kubectl set image
استفاده کنید تا از Kubernetes بخواهید نسخه جدید برنامه شما را به صورت یکبار در کل کلاستر با بهروزرسانیهای متحرک اجرا کند.
$ kubectl set image deployment/hello-java hello-java=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2 deployment "hello-java" image updated
- دوباره
http://EXTERNAL_IP:8080
را بررسی کنید تا ببینید پاسخ جدید را برمیگرداند.
11. به عقب برگردید
اوه! آیا با نسخه جدید برنامه اشتباه کردید؟ شاید نسخه جدید دارای خطایی باشد و باید سریع آن را برگردانید. با Kubernetes، می توانید آن را به راحتی به حالت قبلی برگردانید. با اجرای دستور زیر، برنامه را به عقب برگردانید:
$ kubectl rollout undo deployment/hello-java
وقتی دوباره http://EXTERNAL_IP:8080
بررسی کنید، باید پاسخ قدیمی را ببینید.
12. تبریک می گویم
شما یاد گرفتید که یک برنامه وب جدید مبتنی بر جاوا را در Kubernetes در GKE بسازید و اجرا کنید.
پاک کن
$ gcloud container clusters delete hello-java-cluster --zone us-central1-c $ gcloud container images delete us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1 us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v2