یک برنامه Spring Boot Java را در Kubernetes در Google Kubernetes Engine اجرا کنید

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. راه اندازی و الزامات

تنظیم محیط خود به خود

  1. به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
  • شناسه پروژه در تمام پروژه‌های Google Cloud منحصربه‌فرد است و تغییرناپذیر است (پس از تنظیم نمی‌توان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام PROJECT_ID شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، می‌توانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند.
  • برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
  1. در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورت‌حساب فراتر از این آموزش، می‌توانید منابعی را که ایجاد کرده‌اید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.

Cloud Shell را فعال کنید

  1. از Cloud Console، روی Activate Cloud Shell کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

اگر این اولین باری است که Cloud Shell را راه اندازی می کنید، با یک صفحه میانی روبرو می شوید که آن را توصیف می کند. اگر با یک صفحه میانی مواجه شدید، روی Continue کلیک کنید.

9c92662c6a846a5c.png

تهیه و اتصال به Cloud Shell فقط باید چند لحظه طول بکشد.

9f0e51b578fecce5.png

این ماشین مجازی با تمام ابزارهای توسعه مورد نیاز بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی ارائه می‌کند و در Google Cloud اجرا می‌شود، که عملکرد و احراز هویت شبکه را بسیار افزایش می‌دهد. بسیاری از کارهای شما، اگر نه همه، در این کد لبه با مرورگر قابل انجام است.

پس از اتصال به Cloud Shell، باید ببینید که احراز هویت شده اید و پروژه به ID پروژه شما تنظیم شده است.

  1. برای تایید احراز هویت، دستور زیر را در 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`
  1. دستور زیر را در 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. برنامه را به صورت محلی اجرا کنید

  1. مطمئن شوید JAVA_HOME روی نسخه صحیح تنظیم شده است:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
  1. می توانید اپلیکیشن Spring Boot را به طور معمول با افزونه Spring Boot راه اندازی کنید.
$ ./mvnw -DskipTests spring-boot:run
  1. پس از شروع برنامه، روی Web Preview کلیک کنید 1a94d5bd10bfc072.png در نوار ابزار Cloud Shell و Preview در پورت 8080 را انتخاب کنید.

6252b94905f3f7bd.png

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

9b6c29059957bd0.jpeg

5. برنامه جاوا را به عنوان یک ظرف Docker بسته بندی کنید

در مرحله بعد، باید برنامه خود را برای اجرا در Kubernetes آماده کنید. اولین قدم این است که ظرف و محتویات آن را تعریف کنید.

  1. JAR قابل توسعه برای برنامه ایجاد کنید.
$ ./mvnw -DskipTests package
  1. Artifact Registry API را فعال کنید تا تصویر محفظه ای را که ایجاد می کنید ذخیره کند.
$ gcloud services enable artifactregistry.googleapis.com
  1. اگر مخزن داکر وجود ندارد، یک مخزن جدید ایجاد کنید . قبل از اینکه بتوانید هر تصویری را به آن فشار دهید، باید یک مخزن ایجاد کنید:
$ gcloud artifacts repositories create codelabrepo     --repository-format=docker --location=us-central1 
  1. تصویر شما با فرمت زیر خواهد بود:

{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

  1. از 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
  1. شما باید بتوانید با رفتن به صفحه Artifacts Registry Images در Cloud Console، تصویر ظرف فهرست شده در کنسول را ببینید. اکنون یک تصویر Docker در سطح پروژه در دسترس دارید، که Kubernetes می‌تواند به آن دسترسی داشته باشد و در عرض چند دقیقه آن را هماهنگ کند.
  2. (اختیاری) پس از تکمیل (دانلود و استخراج همه چیز مدتی طول می کشد)، تصویر را با دستور زیر آزمایش کنید، که یک ظرف 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
  1. باز هم از ویژگی پیش نمایش وب Cloud Shell استفاده کنید.

6252b94905f3f7bd.png

  1. شما باید صفحه پیش فرض را در یک تب جدید ببینید. پس از اینکه تأیید کردید که برنامه به صورت محلی در یک ظرف Docker اجرا می شود، می توانید با فشار دادن Control+C ، کانتینر در حال اجرا را متوقف کنید.

6. خوشه خود را ایجاد کنید

شما آماده ایجاد خوشه GKE خود هستید. یک خوشه از یک سرور API Kubernetes که توسط Google مدیریت می شود و مجموعه ای از گره های کارگر تشکیل شده است. گره های کارگر ماشین های مجازی موتور محاسباتی هستند.

  1. ابتدا مطمئن شوید که ویژگی های API مربوطه فعال هستند.
$ gcloud services enable compute.googleapis.com container.googleapis.com
  1. یک خوشه با دو گره 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 داشته باشید.

758c7fca14f70623.png

اکنون زمان آن است که برنامه کانتینری خود را در خوشه Kubernetes مستقر کنید! از این پس، از خط فرمان kubectl (که قبلاً در محیط Cloud Shell شما تنظیم شده است) استفاده خواهید کرد. بقیه کدها نیاز دارند که نسخه سرویس گیرنده و سرور Kubernetes 1.2 یا بالاتر باشد. version kubectl نسخه فعلی دستور را به شما نشان می دهد.

7. برنامه خود را در Kubernetes مستقر کنید

  1. استقرار Kubernetes می‌تواند چندین نمونه از برنامه شما را با استفاده از تصویر ظرفی که ایجاد کرده‌اید ایجاد، مدیریت و مقیاس‌بندی کند. با استفاده از دستور kubectl run ، یک نمونه از برنامه خود را در Kubernetes مستقر کنید.
$ kubectl create deployment hello-java --image=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/hello-java:v1
  1. برای مشاهده استقرار ایجاد شده، به سادگی دستور زیر را اجرا کنید:
$ kubectl get deployments

NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-java   1         1         1            1           37s
  1. برای مشاهده نمونه های برنامه ایجاد شده توسط استقرار، دستور زیر را اجرا کنید:
$ 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 در معرض دید قرار دهید.

  1. در Cloud Shell، می‌توانید با ایجاد یک سرویس Kubernetes LoadBalancer، Pod را در معرض اینترنت عمومی قرار دهید.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

توجه داشته باشید که شما مستقیماً استقرار را در معرض دید قرار می دهید، نه Pod. این باعث می‌شود که سرویس به‌دست‌آمده، ترافیک تعادلی را در همه پادهای مدیریت شده توسط استقرار بارگیری کند (در این مورد، فقط یک پاد، اما بعداً کپی‌های بیشتری اضافه خواهید کرد).

Kubernetes Master متعادل کننده بار و قوانین ارسال موتور محاسباتی مرتبط، استخرهای هدف و قوانین فایروال را ایجاد می کند تا سرویس را به طور کامل از خارج از Google Cloud در دسترس قرار دهد.

  1. برای یافتن آدرس 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
  1. اکنون باید بتوانید با اشاره مرورگر خود به 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 می تواند به شما کمک کند تا یک نسخه جدید را بدون تأثیرگذاری بر کاربران خود به تولید بفرستید.

  1. با کلیک بر روی Open editor، ویرایشگر کد را باز کنید 2109d75686c889a.png در منوی Cloud Shell.
  2. به 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!";
    }
}
  1. از 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 به آرامی کنترلر تکرار شما را به نسخه جدید برنامه به روز کند!

  1. به منظور تغییر برچسب تصویر برای ظرف در حال اجرا خود، باید استقرار hello-java موجود را ویرایش کنید و تصویر را از us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1 تغییر دهید.

به us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v2

  1. می‌توانید از دستور 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
  1. دوباره 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

بیشتر بدانید