Разверните Java-приложение Spring Boot в Kubernetes на Google Kubernetes Engine.
О практической работе
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. Настройка и требования
Самостоятельная настройка среды
- Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, ее необходимо создать .)
Запомните идентификатор проекта, уникальное имя для всех проектов Google Cloud (имя выше уже занято и не будет работать для вас, извините!). Позже в этой кодовой лаборатории он будет упоминаться как PROJECT_ID
.
- Затем вам нужно включить выставление счетов в Cloud Console, чтобы использовать ресурсы Google Cloud.
Выполнение этой лаборатории кода не должно стоить вам больше нескольких долларов, но может быть больше, если вы решите использовать больше ресурсов или оставите их работающими.
Новые пользователи Google Cloud имеют право на бесплатную пробную версию за 300 долларов .
Активировать облачную оболочку
- В облачной консоли нажмите « Активировать Cloud Shell ».
.
Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба), описывающий, что это такое. Если это так, нажмите « Продолжить » (и вы больше никогда его не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займет всего несколько минут.
Эта виртуальная машина загружена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог размером 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Многое, если не все, из вашей работы в этой кодовой лаборатории можно выполнить просто с помощью браузера или вашего Chromebook.
После подключения к Cloud Shell вы должны увидеть, что вы уже прошли аутентификацию и что для проекта уже задан идентификатор вашего проекта.
- Выполните следующую команду в 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. Локально запустить приложение
- Вы можете запустить приложение Spring Boot в обычном режиме с помощью подключаемого модуля Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
- После запуска приложения нажмите « Веб-просмотр ».
на панели инструментов Cloud Shell и выберите Preview на порту 8080 .
Вкладка в вашем браузере открывается и подключается к серверу, который вы только что запустили.
5. Упакуйте приложение Java как контейнер Docker
Затем вам нужно подготовить приложение для работы в Kubernetes. Первым шагом является определение контейнера и его содержимого.
- Создайте развертываемый файл JAR для приложения.
$ ./mvnw -DskipTests package
- Включите Container Registry для хранения образа контейнера, который вы создадите.
$ gcloud services enable containerregistry.googleapis.com
- Используйте Jib, чтобы создать образ контейнера и отправить его в реестр контейнеров.
$ ./mvnw -DskipTests com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- Если все пойдет хорошо, вы сможете увидеть образ контейнера, указанный в консоли, перейдя в Container Registry > Images . Теперь у вас есть доступный образ Docker для всего проекта, к которому Kubernetes может получить доступ и организовать, как вы увидите через несколько минут.
- После завершения (для загрузки и извлечения всего потребуется некоторое время) вы можете локально протестировать образ с помощью следующей команды, которая запустит контейнер Docker в качестве демона на порту 8080 из вашего только что созданного образа контейнера:
$ docker run -ti --rm -p 8080:8080 \ gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- Опять же, воспользуйтесь функцией веб-предварительного просмотра Cloud Shell.
- Вы должны увидеть страницу по умолчанию в новой вкладке. Убедившись, что приложение работает локально в контейнере Docker, вы можете остановить работающий контейнер, нажав
Control+C
.
6. Создайте свой кластер
Вы готовы создать свой кластер GKE. Кластер состоит из сервера API Kubernetes, управляемого Google, и набора рабочих узлов. Рабочие узлы — это виртуальные машины Compute Engine.
- Во-первых, убедитесь, что соответствующие функции API включены.
$ gcloud services enable compute.googleapis.com container.googleapis.com Operation "operations/..." finished successfully
- Создайте кластер с двумя узлами
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
- Развертывание Kubernetes может создавать, управлять и масштабировать несколько экземпляров вашего приложения с помощью созданного вами образа контейнера. Разверните один экземпляр своего приложения в Kubernetes с помощью
kubectl run
.
$ kubectl create deployment hello-java \ --image=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v1
- Чтобы просмотреть созданное вами развертывание, просто выполните следующую команду:
$ kubectl get deployments NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-java 1 1 1 1 37s
- Чтобы просмотреть экземпляры приложения, созданные развертыванием, выполните следующую команду:
$ 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.
- В Cloud Shell вы можете открыть Pod для общедоступного Интернета с помощью команды
kubectl expose
в сочетании с--type=LoadBalancer
. Флаг необходим для создания IP-адреса, доступного извне.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
Флаг, используемый в команде, указывает, что вы будете использовать подсистему балансировки нагрузки, предоставляемую базовой инфраструктурой. Обратите внимание, что вы предоставляете доступ непосредственно к развертыванию, а не к поду. Это приведет к тому, что получившаяся служба будет балансировать нагрузку трафика между всеми подами, управляемыми развертыванием (в данном случае только один под, но позже вы добавите больше реплик).
Kubernetes Master создает балансировщик нагрузки и соответствующие правила переадресации Compute Engine, целевые пулы и правила брандмауэра, чтобы сделать сервис полностью доступным из-за пределов Google Cloud.
- Чтобы найти общедоступный 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
- Обратите внимание, что для вашей службы указаны два 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 может помочь вам развернуть новую версию в рабочей среде, не затрагивая ваших пользователей.
- Откройте редактор кода, нажав Запустить редактор
в меню облачной оболочки.
- Перейдите к
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!";
}
}
- Используйте Jib для создания и отправки новой версии образа контейнера.
$ ./mvnw -DskipTests package \ com.google.cloud.tools:jib-maven-plugin:build \ -Dimage=gcr.io/$GOOGLE_CLOUD_PROJECT/hello-java:v2
Вы готовы к тому, что Kubernetes плавно обновит ваш контроллер репликации до новой версии приложения!
- Чтобы изменить метку изображения для работающего контейнера, вам необходимо отредактировать существующее развертывание
hello-java
и изменить образ сgcr.io/PROJECT_ID/hello-java:v1
наgcr.io/PROJECT_ID/hello-java:v2
.
- Вы можете использовать команду
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
- Снова проверьте http://EXTERNAL_IP:8080, чтобы убедиться, что он возвращает новый ответ.
11. Откатиться
Ой! Вы ошиблись с новой версией приложения? Возможно, новая версия содержала ошибку и вам нужно быстро ее откатить. С Kubernetes вы можете легко откатить его до предыдущего состояния. Откатите приложение, выполнив следующую команду:
$ kubectl rollout undo deployment/hello-java
12. Поздравления
Вы научились создавать и развертывать новое веб-приложение на основе Java в Kubernetes на GKE.