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

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

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

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

شناسه پروژه را به خاطر بسپارید، یک نام منحصر به فرد در تمام پروژه های Google Cloud (نام بالا قبلاً گرفته شده است و برای شما کار نخواهد کرد، متأسفیم!). بعداً در این آزمایشگاه کد به عنوان PROJECT_ID خواهد شد.

  1. در مرحله بعد، برای استفاده از منابع Google Cloud، باید صورت‌حساب را در کنسول Cloud فعال کنید.

گذراندن از طریق این نرم افزار کد نباید بیش از چند دلار هزینه داشته باشد، اما اگر تصمیم به استفاده از منابع بیشتری داشته باشید یا آنها را در حال اجرا رها کنید، ممکن است بیشتر باشد.

کاربران جدید Google Cloud واجد شرایط استفاده آزمایشی رایگان 300 دلاری هستند.

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

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

اگر قبلاً Cloud Shell را راه‌اندازی نکرده‌اید، با یک صفحه میانی (در زیر تاشو) روبرو می‌شوید که آن را توصیف می‌کند. اگر اینطور است، روی Continue کلیک کنید (و دیگر آن را نخواهید دید). این صفحه نمایش یکبار مصرف به این صورت است:

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

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

پس از اتصال به 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`
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. می توانید اپلیکیشن Spring Boot را به طور معمول با افزونه Spring Boot راه اندازی کنید.
$ ./mvnw -DskipTests spring-boot:run
  1. پس از شروع برنامه، روی Web Preview کلیک کنید در نوار ابزار Cloud Shell و Preview در پورت 8080 را انتخاب کنید.

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

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

  1. JAR قابل استقرار را برای برنامه ایجاد کنید.
$ ./mvnw -DskipTests package
  1. Container Registry را فعال کنید تا تصویر محفظه ای که ایجاد می کنید ذخیره شود.
$ gcloud services enable containerregistry.googleapis.com
  1. از Jib برای ایجاد تصویر ظرف استفاده کنید و آن را به رجیستری کانتینر فشار دهید.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \
  -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. اگر همه چیز خوب پیش رفت، باید بتوانید با رفتن به Container Registry > Images ، تصویر کانتینر فهرست شده در کنسول را ببینید. اکنون یک تصویر Docker در سراسر پروژه در دسترس دارید، که Kubernetes می‌تواند به آن دسترسی داشته باشد و آن‌طور که در عرض چند دقیقه خواهید دید، هماهنگ‌سازی کند.
  1. پس از اتمام آن (دانلود و استخراج همه چیز مدتی طول می کشد)، می توانید به صورت محلی تصویر را با دستور زیر آزمایش کنید، که یک ظرف Docker را به عنوان دیمون در پورت 8080 از تصویر کانتینر تازه ایجاد شده شما اجرا می کند:
$ docker run -ti --rm -p 8080:8080 \
  gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
  1. باز هم از ویژگی پیش نمایش وب Cloud Shell استفاده کنید.

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

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

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

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

  1. استقرار Kubernetes می‌تواند چندین نمونه از برنامه شما را با استفاده از تصویر ظرفی که ایجاد کرده‌اید ایجاد، مدیریت و مقیاس‌بندی کند. با استفاده از دستور kubectl run ، یک نمونه از برنامه خود را در Kubernetes قرار دهید.
$ kubectl create deployment hello-java \
  --image=gcr.io/$GOOGLE_CLOUD_PROJECT/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، می‌توانید Pod را با دستور kubectl expose همراه با پرچم --type=LoadBalancer در معرض اینترنت عمومی قرار دهید. پرچم برای ایجاد یک IP قابل دسترسی خارجی مورد نیاز است.
$ 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. توجه داشته باشید که دو آدرس IP برای سرویس شما لیست شده است که هر دو درگاه 8080 را ارائه می دهند. یکی آدرس IP داخلی است که فقط در داخل Virtual Private Cloud شما قابل مشاهده است. دیگری آدرس IP خارجی با بار متعادل است. در مثال، آدرس IP خارجی aaa.bbb.ccc.ddd است. اکنون باید بتوانید با اشاره مرورگر خود به 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 به سادگی اطمینان حاصل می کنند که واقعیت با آنچه شما درخواست کرده اید مطابقت دارد و در صورت نیاز اقدام می کند.

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

  1. با کلیک روی Launch editor ، ویرایشگر کد را باز کنید در منوی Cloud Shell.
  2. به src/main/java/hello/HelloController.java و مقدار پاسخ را به روز کنید.
package hello;

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=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

شما آماده هستید تا Kubernetes به آرامی کنترلر تکرار شما را به نسخه جدید برنامه به روز کند!

  1. به منظور تغییر برچسب تصویر برای ظرف در حال اجرا خود، باید استقرار hello-java موجود را ویرایش کنید و تصویر را از gcr.io/PROJECT_ID/hello-java:v1 به gcr.io/PROJECT_ID/hello-java:v2 تغییر دهید. .
  1. می‌توانید از دستور kubectl set image تا از Kubernetes بخواهید نسخه جدید برنامه شما را به صورت یک‌بار با به‌روزرسانی‌های متحرک در کل خوشه مستقر کند.
$ kubectl set image deployment/hello-java \
  hello-java=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2

deployment "hello-java" image updated
  1. دوباره http://EXTERNAL_IP:8080 را بررسی کنید تا ببینید که پاسخ جدید را برمی‌گرداند.

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

$ kubectl rollout undo deployment/hello-java

شما یاد گرفتید که یک برنامه وب جدید مبتنی بر جاوا را در Kubernetes در GKE بسازید و اجرا کنید.

بیشتر بدانید