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

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.
  • Расширьте масштаб своей услуги и внедрите обновление.
  • Access Dashboard — веб-интерфейс пользователя Kubernetes.

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

  • Проект Google Cloud
  • Браузер, например Google Chrome

Настройка среды для самостоятельного обучения

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

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

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

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

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

Активировать Cloud Shell

  1. В консоли Cloud нажмите «Активировать 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].

После запуска 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. После запуска приложения нажмите «Веб-просмотр». на панели инструментов Cloud Shell выберите Предварительный просмотр на порту 8080 .

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

Далее вам необходимо подготовить приложение к работе в Kubernetes. Первым шагом будет определение контейнера и его содержимого.

  1. Создайте JAR-файл для развертывания приложения.
$ ./mvnw -DskipTests package
  1. Включите Реестр контейнеров для сохранения образа контейнера, который вы создадите.
$ 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. Кластер состоит из сервера Kubernetes API, управляемого 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 покажет вам текущую версию команды.

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

По умолчанию модуль доступен только по его внутреннему IP-адресу внутри кластера. Чтобы сделать контейнер hello-java доступным извне виртуальной сети Kubernetes, необходимо предоставить модуль как сервис Kubernetes.

  1. В Cloud Shell вы можете открыть доступ к Pod из публичного интернета с помощью команды kubectl expose с флагом --type=LoadBalancer . Этот флаг необходим для создания IP-адреса, доступного извне.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080

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

Мастер Kubernetes создает балансировщик нагрузки и связанные с ним правила пересылки 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.

Одна из мощных функций 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. Откройте редактор кода, нажав «Запустить редактор». в меню 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

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

Узнать больше