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

۱. قبل از شروع

کوبرنتیز یک پروژه متن‌باز است که می‌تواند در محیط‌های مختلفی اجرا شود، از لپ‌تاپ‌ها گرفته تا کلاسترهای چندگره‌ای با دسترسی بالا، از ابرهای عمومی گرفته تا استقرارهای درون سازمانی و از نمونه‌های ماشین مجازی (VM) گرفته تا سخت‌افزارهای فیزیکی.

در این آزمایشگاه کد، شما یک برنامه وب ساده Spring Boot Java را روی Kubernetes روی GKE مستقر خواهید کرد، با این هدف که برنامه وب خود را به عنوان یک برنامه تکثیر شده روی Kubernetes اجرا کنید. شما کدی را که روی دستگاه خود توسعه می‌دهید، به یک تصویر کانتینر Docker تبدیل می‌کنید و تصویر را روی GKE اجرا می‌کنید.

شما از GKE، یک سرویس Kubernetes کاملاً مدیریت‌شده روی Google Cloud، استفاده خواهید کرد تا به شما امکان دهد بیشتر بر روی تجربه Kubernetes تمرکز کنید، نه راه‌اندازی زیرساخت‌های اساسی.

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

آزمایشگاه کد از نمونه کد موجود در راهنمای « ساخت یک برنامه با Spring Boot» استفاده خواهد کرد.

پیش‌نیازها

  • آشنایی با زبان برنامه نویسی جاوا و ابزارهای آن
  • آشنایی با ویرایشگرهای متن استاندارد لینوکس مانند Vim، Emacs و nano

کاری که انجام خواهید داد

  • یک برنامه ساده جاوا را به عنوان یک کانتینر داکر بسته‌بندی کنید.
  • کلاستر Kubernetes خود را روی GKE ایجاد کنید.
  • برنامه جاوا خود را روی Kubernetes روی GKE مستقر کنید.
  • خدمات خود را گسترش دهید و یک ارتقاء ارائه دهید.
  • داشبورد دسترسی، یک رابط کاربری مبتنی بر وب Kubernetes.

آنچه نیاز دارید

۲. تنظیمات و الزامات

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

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

فعال کردن پوسته ابری

  1. از کنسول ابری، روی فعال کردن پوسته ابری کلیک کنید 853e55310c205094.png .

55efc1aaa7a4d3ad.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

این ماشین مجازی مجهز به تمام ابزارهای توسعه مورد نیاز است. این ماشین یک دایرکتوری خانگی پایدار ۵ گیگابایتی ارائه می‌دهد و در فضای ابری گوگل اجرا می‌شود که عملکرد شبکه و احراز هویت را تا حد زیادی افزایش می‌دهد. بخش عمده‌ای از کار شما در این آزمایشگاه کد، اگر نگوییم همه، را می‌توان با یک مرورگر انجام داد.

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

  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].

۳. دریافت کد منبع

پس از راه‌اندازی Cloud Shell، می‌توانید از خط فرمان برای کپی کردن کد منبع نمونه در دایرکتوری خانگی استفاده کنید.

$ git clone https://github.com/spring-guides/gs-spring-boot.git
$ cd gs-spring-boot/complete

۴. اجرای محلی برنامه

  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. پس از شروع برنامه، روی پیش‌نمایش وب کلیک کنید ۱a۹۴d۵bd۱۰bfc۰۷۲.png در نوار ابزار Cloud Shell کلیک کنید و پیش‌نمایش را روی پورت ۸۰۸۰ انتخاب کنید.

6252b94905f3f7bd.png

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

9b6c29059957bd0.jpeg

۵. بسته‌بندی برنامه جاوا به عنوان یک کانتینر داکر

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

  1. JAR قابل استقرار برای برنامه را ایجاد کنید.
$ ./mvnw -DskipTests package
  1. API مربوط به رجیستری Artifact را برای ذخیره تصویر کانتینری که ایجاد خواهید کرد، فعال کنید.
$ 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 برای ایجاد تصویر کانتینر و ارسال آن به رجیستری مصنوعات استفاده کنید.
$ 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. (اختیاری) پس از اتمام (دانلود و استخراج همه چیز کمی طول می‌کشد)، ایمیج را با دستور زیر آزمایش کنید، که یک کانتینر داکر را به عنوان یک سرویس (daemon) روی پورت ۸۰۸۰ از ایمیج کانتینر تازه ایجاد شده شما اجرا می‌کند. اگر با مشکل مجوزها مواجه شدید، ابتدا 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. شما باید صفحه پیش‌فرض را در یک تب جدید مشاهده کنید. پس از اینکه تأیید کردید که برنامه به صورت محلی در یک کانتینر داکر در حال اجرا است، می‌توانید با فشردن Control+C کانتینر در حال اجرا را متوقف کنید.

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

شما آماده ایجاد کلاستر GKE خود هستید. یک کلاستر شامل یک سرور Kubernetes API است که توسط گوگل مدیریت می‌شود و مجموعه‌ای از گره‌های کارگر. گره‌های کارگر، ماشین‌های مجازی Compute Engine هستند.

  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 نسخه فعلی دستور را به شما نشان می‌دهد.

۷. برنامه خود را روی 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 اجرا کنید، اما هنوز باید آن را برای دنیای خارج قابل دسترسی کنید.

۸. اجازه دادن به ترافیک خارجی

به طور پیش‌فرض، Pod فقط از طریق IP داخلی خود در داخل کلاستر قابل دسترسی است. برای اینکه بتوانید کانتینر hello-java را از خارج از شبکه مجازی Kubernetes نیز قابل دسترسی کنید، باید Pod را به عنوان یک سرویس Kubernetes در معرض نمایش قرار دهید.

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

توجه داشته باشید که شما مستقیماً پیاده‌سازی را در معرض دید قرار می‌دهید، نه Pod را. این باعث می‌شود سرویس حاصل، ترافیک را در تمام Podهایی که توسط پیاده‌سازی مدیریت می‌شوند، متعادل کند (در این مورد، فقط یک 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 در مرورگر خود به این سرویس دسترسی پیدا کنید.

۹. خدمات خود را گسترش دهید

یکی از ویژگی‌های قدرتمند ارائه شده توسط 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 به سادگی اطمینان حاصل می‌کنند که واقعیت با آنچه شما درخواست کرده‌اید مطابقت دارد و در صورت نیاز اقدام می‌کنند.

۱۰. خدمات خود را ارتقا دهید

در برهه‌ای از زمان، برنامه‌ای که به محیط عملیاتی منتقل کرده‌اید، نیاز به رفع اشکالات یا ویژگی‌های اضافی خواهد داشت. کوبرنتیز می‌تواند به شما کمک کند تا نسخه جدیدی را بدون تأثیر بر کاربران، به محیط عملیاتی منتقل کنید.

  1. با کلیک روی «باز کردن ویرایشگر»، ویرایشگر کد را باز کنید. 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 برای ساخت و ارسال نسخه جدیدی از تصویر کانتینر استفاده کنید. ساخت و ارسال تصویر به‌روز شده باید بسیار سریع‌تر باشد زیرا از قابلیت ذخیره‌سازی (caching) به طور کامل بهره می‌برید.
$ ./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 را بررسی کنید تا ببینید آیا پاسخ جدید را برمی‌گرداند یا خیر.

۱۱. عقب گرد

اوه! آیا در نسخه جدید برنامه اشتباه کردید؟ شاید نسخه جدید حاوی خطایی باشد و باید سریع آن را به حالت قبل برگردانید. با Kubernetes، می‌توانید به راحتی آن را به حالت قبل برگردانید. با اجرای دستور زیر، برنامه را به حالت قبل برگردانید:

$ kubectl rollout undo deployment/hello-java

وقتی دوباره http://EXTERNAL_IP:8080 را بررسی کنید، باید پاسخ قدیمی را ببینید.

۱۲. تبریک

شما یاد گرفتید که یک برنامه وب جدید مبتنی بر جاوا را روی 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

بیشتر بدانید