Разверните Java-приложение Spring Boot в Kubernetes на Google Kubernetes Engine.

Разверните Java-приложение Spring Boot в Kubernetes на Google Kubernetes Engine.

О практической работе

subjectПоследнее обновление: апр. 22, 2020
account_circleАвтор: сотрудник Google

1. Прежде чем вы начнете

Kubernetes — это проект с открытым исходным кодом, который может работать во многих различных средах, от ноутбуков до многоузловых кластеров с высокой доступностью, от общедоступных облаков до локальных развертываний и от экземпляров виртуальных машин (ВМ) до «голого железа».

В этой лаборатории кода вы развернете простое веб-приложение Spring Boot Java в Kubernetes на GKE с целью запустить свое веб-приложение как реплицированное приложение в Kubernetes. Вы возьмете код, который разработаете на своем компьютере, превратите его в образ контейнера Docker и запустите этот образ в GKE.

Вы будете использовать GKE, полностью управляемый сервис Kubernetes в Google Cloud, чтобы больше сосредоточиться на работе с Kubernetes, а не на настройке базовой инфраструктуры.

Если вы заинтересованы в запуске Kubernetes на своем локальном компьютере, например, на ноутбуке для разработки, обратите внимание на Minikube , который предлагает простую настройку кластера Kubernetes с одним узлом для целей разработки и тестирования. Вы можете использовать Minikube, чтобы пройти лабораторию кода, если хотите.

Лаборатория кода будет использовать пример кода из руководства по созданию приложения с помощью Spring Boot .

Предпосылки

  • Знание языка программирования Java и инструментов
  • Знание стандартных текстовых редакторов Linux, таких как Vim, Emacs и nano.

Что ты будешь делать

  • Упакуйте простое приложение Java в контейнер Docker.
  • Создайте свой кластер Kubernetes на GKE.
  • Разверните свое приложение Java в Kubernetes на GKE.
  • Масштабируйте свой сервис и разверните обновление.
  • Доступ к панели инструментов, пользовательскому веб-интерфейсу Kubernetes.

Что вам понадобится

  • Облачный проект Google
  • Браузер, например Google Chrome

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, ее необходимо создать .)

Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID .

  1. Затем вам нужно включить выставление счетов в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этой лаборатории кода не должно стоить вам больше нескольких долларов, но может быть больше, если вы решите использовать больше ресурсов или оставите их работающими.

Новые пользователи Google Cloud имеют право на бесплатную пробную версию за 300 долларов .

Активировать облачную оболочку

  1. В облачной консоли нажмите « Активировать Cloud Shell ». .

Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба), описывающий, что это такое. Если это так, нажмите « Продолжить » (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:

Подготовка и подключение к Cloud Shell займет всего несколько минут.

Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог размером 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Многое, если не все, из вашей работы в этой кодовой лаборатории можно выполнить просто с помощью браузера или вашего Chromebook.

После подключения к 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`
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. Вы можете запустить приложение Spring Boot в обычном режиме с помощью подключаемого модуля Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
  1. После запуска приложения нажмите « Веб-просмотр ». на панели инструментов Cloud Shell и выберите Preview на порту 8080 .

Вкладка в вашем браузере открывается и подключается к серверу, который вы только что запустили.

5. Упакуйте приложение Java как контейнер Docker

Затем вам нужно подготовить приложение для работы в 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 .

6. Создайте свой кластер

Вы готовы создать свой кластер GKE. Кластер состоит из сервера API Kubernetes, управляемого Google, и набора рабочих узлов. Рабочие узлы — это виртуальные машины Compute Engine.

  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 покажет вам текущую версию команды.

7. Разверните свое приложение в Kubernetes

  1. Развертывание Kubernetes может создавать, управлять и масштабировать несколько экземпляров вашего приложения с помощью созданного вами образа контейнера. Разверните один экземпляр своего приложения в Kubernetes с помощью kubectl run .
$ 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, но вам все еще нужно сделать его доступным для внешнего мира.

8. Разрешить внешний трафик

По умолчанию 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

Флаг, используемый в команде, указывает, что вы будете использовать подсистему балансировки нагрузки, предоставляемую базовой инфраструктурой. Обратите внимание, что вы предоставляете доступ непосредственно к развертыванию, а не к поду. Это приведет к тому, что получившаяся служба будет балансировать нагрузку трафика между всеми подами, управляемыми развертыванием (в данном случае только один под, но позже вы добавите больше реплик).

Kubernetes Master создает балансировщик нагрузки и соответствующие правила переадресации Compute Engine, целевые пулы и правила брандмауэра, чтобы сделать сервис полностью доступным из-за пределов 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-адресом, который виден только внутри вашего виртуального частного облака. Другой — внешний IP-адрес с балансировкой нагрузки. В примере внешний IP-адрес — aaa.bbb.ccc.ddd . Теперь вы сможете получить доступ к службе, указав в браузере адрес 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. Откройте редактор кода, нажав Запустить редактор в меню облачной оболочки.
  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, чтобы убедиться, что он возвращает новый ответ.

11. Откатиться

Ой! Вы ошиблись с новой версией приложения? Возможно, новая версия содержала ошибку и вам нужно быстро ее откатить. С Kubernetes вы можете легко откатить его до предыдущего состояния. Откатите приложение, выполнив следующую команду:

$ kubectl rollout undo deployment/hello-java

12. Поздравления

Вы научились создавать и развертывать новое веб-приложение на основе Java в Kubernetes на GKE.

Учить больше