1. Прежде чем начать
Kubernetes — это проект с открытым исходным кодом, который может работать в самых разных средах: от ноутбуков до высокодоступных многоузловых кластеров, от публичных облаков до локальных развертываний, от экземпляров виртуальных машин (VM) до физических серверов.
В этом практическом занятии вы развернете простое веб-приложение 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
2. Настройка и требования
Настройка среды для самостоятельного обучения
- Войдите в консоль Google Cloud и создайте новый проект или используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .



- Название проекта — это отображаемое имя участников данного проекта. Это строка символов, не используемая API Google. Вы всегда можете его изменить.
- Идентификатор проекта уникален для всех проектов Google Cloud и является неизменяемым (его нельзя изменить после установки). Консоль Cloud автоматически генерирует уникальную строку; обычно вам неважно, какая она. В большинстве практических заданий вам потребуется указать идентификатор вашего проекта (обычно обозначается как
PROJECT_ID). Если сгенерированный идентификатор вас не устраивает, вы можете сгенерировать другой случайный идентификатор. В качестве альтернативы вы можете попробовать свой собственный и посмотреть, доступен ли он. После этого шага его нельзя изменить, и он сохраняется на протяжении всего проекта. - К вашему сведению, существует третье значение — номер проекта , которое используется некоторыми API. Подробнее обо всех трех значениях можно узнать в документации .
- Далее вам потребуется включить оплату в консоли Cloud для использования ресурсов/API Cloud. Выполнение этого практического задания не потребует больших затрат, если вообще потребует. Чтобы отключить ресурсы и избежать дополнительных расходов после завершения этого урока, вы можете удалить созданные ресурсы или удалить проект. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .
Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.

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

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

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.
После подключения к 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`
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
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. Запустите приложение локально.
- Убедитесь, что переменная JAVA_HOME установлена на правильную версию:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
- Приложение Spring Boot можно запустить обычным способом с помощью плагина Spring Boot.
$ ./mvnw -DskipTests spring-boot:run
- После запуска приложения нажмите «Веб-предварительный просмотр» .
В панели инструментов Cloud Shell выберите «Предварительный просмотр на порту 8080» .

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

5. Упакуйте Java-приложение в контейнер Docker.
Далее вам необходимо подготовить ваше приложение для работы в Kubernetes. Первым шагом является определение контейнера и его содержимого.
- Создайте JAR-файл, который можно развернуть для приложения.
$ ./mvnw -DskipTests package
- Включите API реестра артефактов для сохранения создаваемого вами образа контейнера.
$ gcloud services enable artifactregistry.googleapis.com
- Создайте новый репозиторий Docker, если его еще нет. Необходимо создать репозиторий, прежде чем вы сможете загружать в него какие-либо образы.
$ gcloud artifacts repositories create codelabrepo --repository-format=docker --location=us-central1
- Ваше изображение будет иметь следующий формат:
{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
- Используйте 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
- Вы сможете увидеть образ контейнера в консоли, перейдя на страницу «Образы реестра артефактов» в Cloud Console. Теперь у вас есть доступный образ Docker для всего проекта, к которому Kubernetes может получить доступ и управлять им, как вы увидите через несколько минут.
- (Необязательно) После завершения (загрузка и распаковка всего займет некоторое время) протестируйте образ с помощью следующей команды, которая запустит контейнер Docker в качестве демона на порту 8080 из созданного вами образа контейнера. Если у вас возникнут проблемы с правами доступа, сначала выполните
gcloud auth configure-dockerus-central1-docker.pkg.dev:
$ docker run -ti --rm -p 8080:8080 \ us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/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
- Создайте кластер из двух узлов
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=us-central1-docker.pkg.dev/$GOOGLE_CLOUD_PROJECT/codelabrepo/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 доступным из общедоступного интернета, создав службу Kubernetes LoadBalancer.
$ kubectl create service loadbalancer hello-java --tcp=8080:8080
Обратите внимание, что вы напрямую предоставляете доступ к развертыванию, а не к Pod. Это приведет к тому, что результирующий сервис будет распределять трафик между всеми Pod, управляемыми развертыванием (в данном случае только одним Pod, но позже вы добавите больше реплик).
Главный узел Kubernetes создает балансировщик нагрузки и связанные с ним правила переадресации 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
- Теперь вы сможете получить доступ к сервису, перейдя в браузере по адресу
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 может помочь вам развернуть новую версию в продакшене без ущерба для пользователей.
- Откройте редактор кода, нажав кнопку «Открыть редактор».
в меню Cloud Shell. - Перейдите в
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!";
}
}
- Используйте Jib для сборки и отправки новой версии образа контейнера. Сборка и отправка обновленного образа должны происходить гораздо быстрее, поскольку вы в полной мере используете преимущества кэширования.
$ ./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 без проблем обновил ваш контроллер репликации до новой версии приложения!
- Чтобы изменить метку образа для запущенного контейнера, необходимо отредактировать существующее развертывание
hello-javaи изменить образ сus-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v1
к us-central1-docker.pkg.dev/PROJECT_ID/codelabrepo/hello-java:v2
- С помощью команды
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
- Проверьте еще раз
http://EXTERNAL_IP:8080чтобы убедиться, что он возвращает новый ответ.
11. Откат назад
Ой! Вы допустили ошибку в новой версии приложения? Возможно, в новой версии обнаружилась ошибка, и вам нужно быстро откатить её. С Kubernetes это можно легко сделать. Откатите приложение, выполнив следующую команду:
$ kubectl rollout undo deployment/hello-java
При повторной проверке по http://EXTERNAL_IP:8080 вы должны увидеть старый ответ.
12. Поздравляем!
Вы научились создавать и развертывать новое веб-приложение на Java в 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