Руководство. Развертывание приложения Spring Boot в кластере AKS с помощью База данных Azure для MySQL — гибкий сервер в виртуальной сети
ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для MySQL — гибкий сервер
В этом руководстве вы узнаете, как развернуть приложение Spring Boot в кластере Служба Azure Kubernetes (AKS) с База данных Azure для MySQL гибким сервером в серверной части, безопасно взаимодействуя друг с другом в виртуальной сети Azure.
Примечание.
В этом материале предполагается, что у вас есть базовое представление о понятиях Kubernetes, Spring Boot Java и MySQL. Для приложений Spring Boot рекомендуется использовать Azure Spring Apps. Однако вы по-прежнему можете использовать Служба Azure Kubernetes в качестве назначения. Рекомендации по назначению рабочей нагрузки Java см. в руководстве по назначению рабочей нагрузки Java.
Необходимые компоненты
- Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись Azure, прежде чем начинать работу. В настоящее время с бесплатной учетной записью Azure можно попробовать База данных Azure для MySQL — гибкий сервер бесплатно в течение 12 месяцев. Дополнительные сведения см. в разделе База данных Azure для MySQL — гибкий сервер бесплатно.
- Интерфейс командной строки Azure (CLI).
- Поддерживаемый пакет средств разработки Java (JDK) версии 8 (включена в Azure Cloud Shell).
- Средство сборки Apache Maven.
- Клиент Git.
- Клиент Docker.
Создание гибкого сервера Базы данных Azure для MySQL
Создание или изменение группы ресурсов
Группа ресурсов Azure — это логическая группа, в которой развертываются и управляются ресурсы Azure. Давайте создадим группу ресурсов rg-mysqlaksdemo с помощью команды az group create в расположении eastus.
- Откройте командную строку.
- Войдите в свою учетную запись Azure.
az login
- Выберите подписку Azure.
az account set -s <your-subscription-ID>
- Создание группы ресурсов.
az group create --name rg-mysqlaksdemo --location eastus
Создание гибкого экземпляра сервера База данных Azure для MySQL
Теперь мы создадим гибкий экземпляр сервера База данных Azure для MySQL в виртуальной сети (метод подключения к частному доступу).
Создайте виртуальную сеть Azure-mysqlaksdemo для всех ресурсов, приведенных в этом руководстве, и подсеть подсети mysql для экземпляра гибкого сервера База данных Azure для MySQL.
az network vnet create \ --resource-group rg-mysqlaksdemo \ --name vnet-mysqlaksdemo \ --address-prefixes 155.55.0.0/16 \ --subnet-name subnet-mysql \ --subnet-prefix 155.55.1.0/24
Создайте гибкий экземпляр сервера База данных Azure для MySQL mysql-mysqlaksdemo в приведенной выше подсети, используя команду az mysql flexible-server create. Замените значения для имени пользователя и пароля администратора.
az mysql flexible-server create \ --name mysql-mysqlaksdemo \ --resource-group rg-mysqlaksdemo \ --location eastus \ --admin-user <your-admin-username> \ --admin-password <your-admin-password> \ --vnet vnet-mysqlaksdemo \ --subnet subnet-mysql
Теперь вы создали База данных Azure для MySQL гибкий экземпляр сервера в регионе eastus с возможностью ускорения вычислений B1MS, 32 ГБ хранилища, 7 дней хранения резервных копий и в предоставленной подсети подсети mysql. В этой подсети не должно быть другого развернутого ресурса, она будет делегирована в Microsoft.DBforMySQL/flexibleServers.
Настройте новую База данных Azure для MySQL гибкую базу данных
demo
сервера для использования с приложением Spring Boot.az mysql flexible-server db create \ --resource-group rg-mysqlaksdemo \ --server-name mysql-mysqlaksdemo \ --database-name demo
Создание реестра контейнеров Azure
Создайте частный реестр контейнеров Azure в группе ресурсов. Позднее в руководстве пример принудительно отправляется в этот реестр как образ Docker. Замените mysqlaksdemoregistry
уникальным именем для реестра.
az acr create --resource-group rg-mysqlaksdemo \
--location eastus \
--name mysqlaksdemoregistry \
--sku Basic
Добавление кода приложения
В этом разделе мы создадим код демонстрационного приложения. Если вы хотите ускорить работу, можно скачать закодированное приложение, доступное по адресу https://github.com/Azure-Samples/tutorial-springboot-mysql-aks, и перейти к следующему разделу: Сборка образа и отправка в ACR.
Создание приложения с помощью Spring Initializr.
curl https://start.spring.io/starter.tgz \ -d dependencies=web,data-jdbc,mysql \ -d baseDir=springboot-mysql-aks \ -d bootVersion=2.5.6.RELEASE \ -d artifactId=springboot-mysql-aks \ -d description="Spring Boot on AKS connecting to Azure DB for MySQL" \ -d javaVersion=1.8 | tar -xzvf -
Базовое приложение Spring Boot будет создано в папке
springboot-mysql-aks
.Используйте любой текстовый редактор, например, VSCode, или любую интегрированную среду разработки, чтобы выполнить следующие действия.
Настройте Spring Boot для использования гибкого сервера База данных Azure для MySQL.
Откройте файл src/main/resources/application.properties и добавьте следующий фрагмент кода. Данный код позволяет получить сведения об узле базы данных, имя базы данных, имя пользователя и пароль из файла манифеста Kubernetes.
logging.level.org.springframework.jdbc.core=DEBUG spring.datasource.url=jdbc:mysql://${DATABASE_HOST}:3306/${DATABASE_NAME}?serverTimezone=UTC spring.datasource.username=${DATABASE_USERNAME} spring.datasource.password=${DATABASE_PASSWORD} spring.datasource.initialization-mode=always
Предупреждение
Свойство конфигурации
spring.datasource.initialization-mode=always
означает, что Spring Boot при каждом запуске сервера будет автоматически создавать схему базы данных на основе файлаschema.sql
, который вы создадите позднее. Это очень удобно для тестирования, но при каждой перезагрузке все данные будут удаляться, поэтому не следует использовать этот подход в рабочей среде.Примечание.
Мы добавляем
?serverTimezone=UTC
к свойству конфигурацииspring.datasource.url
, чтобы драйвер JDBC при соединении с базой данных использовал UTC в качестве формата даты. В противном случае сервер Java и база данных будут использовать разные форматы даты, что неизбежно приведет к ошибке.Создание схемы базы данных.
Spring Boot будет автоматически выполнять
src/main/resources/schema.sql
для создания схемы базы данных. Создайте такой файл со следующим содержимым:DROP TABLE IF EXISTS todo; CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
Создайте код для приложения Java Spring Boot.
Добавьте код Java, который будет использовать JDBC для сохранения и извлечения данных на сервере MySQL. Создайте новый класс Java
Todo
рядом с классомDemoApplication
и добавьте следующий код:package com.example.springbootmysqlaks; import org.springframework.data.annotation.Id; public class Todo { public Todo() { } public Todo(String description, String details, boolean done) { this.description = description; this.details = details; this.done = done; } @Id private Long id; private String description; private String details; private boolean done; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getDetails() { return details; } public void setDetails(String details) { this.details = details; } public boolean isDone() { return done; } public void setDone(boolean done) { this.done = done; } }
Этот класс является моделью предметной области, сопоставленной с таблицей
todo
, созданной ранее.Для управления этим классом потребуется репозиторий. Определите новый интерфейс
TodoRepository
в том же пакете:package com.example.springbootmysqlaks; import org.springframework.data.repository.CrudRepository; public interface TodoRepository extends CrudRepository<Todo, Long> { }
Этим репозиторием управляет Spring Data JDBC.
Завершите работу приложения, создав контроллер, который может хранить и извлекать данные. Реализуйте класс
TodoController
в том же пакете и добавьте следующий код:package com.example.springbootmysqlaks; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/") public class TodoController { private final TodoRepository todoRepository; public TodoController(TodoRepository todoRepository) { this.todoRepository = todoRepository; } @PostMapping("/") @ResponseStatus(HttpStatus.CREATED) public Todo createTodo(@RequestBody Todo todo) { return todoRepository.save(todo); } @GetMapping("/") public Iterable<Todo> getTodos() { return todoRepository.findAll(); } }
Создайте новый Dockerfile в базовом каталоге springboot-mysql-aks и скопируйте этот фрагмент кода.
FROM openjdk:8-jdk-alpine RUN addgroup -S spring && adduser -S spring -G spring USER spring:spring ARG DEPENDENCY=target/dependency COPY ${DEPENDENCY}/BOOT-INF/lib /app/lib COPY ${DEPENDENCY}/META-INF /app/META-INF COPY ${DEPENDENCY}/BOOT-INF/classes /app ENTRYPOINT ["java","-cp","app:app/lib/*","com.example.springbootmysqlaks.DemoApplication"]
Перейдите к файлу pom.xml и обновите коллекцию
<properties>
в файле pom.xml, добавив имя для своего реестра в Реестре контейнеров Azure и последнюю версиюjib-maven-plugin
. Примечание. Если имя записи контроля доступа содержит символы в верхнем регистре, обязательно преобразуйте их в символы нижнего регистра.<properties> <docker.image.prefix>mysqlaksdemoregistry.azurecr.io</docker.image.prefix> <jib-maven-plugin.version>3.1.4</jib-maven-plugin.version> <java.version>1.8</java.version> </properties>
Обновите коллекцию
<plugins>
в файле pom.xml, чтобы присутствовал элемент<plugin>
, содержащий запись дляjib-maven-plugin
, как показано ниже. Обратите внимание, что мы используем базовый образ из Реестра контейнеров Майкрософт (MCR):mcr.microsoft.com/java/jdk:8-zulu-alpine
, который содержит официально поддерживаемый пакет JDK для Azure. Другие базовые образы MCR с официально поддерживаемыми JDK см. в центре Docker.<plugin> <artifactId>jib-maven-plugin</artifactId> <groupId>com.google.cloud.tools</groupId> <version>${jib-maven-plugin.version}</version> <configuration> <from> <image>mcr.microsoft.com/java/jdk:8-zulu-alpine</image> </from> <to> <image>${docker.image.prefix}/${project.artifactId}</image> </to> </configuration> </plugin>
Сборка образа и отправка его в ACR
В командной строке перейдите в папку springboot-mysql-aks и выполните следующие команды, чтобы сначала задать имя по умолчанию для Реестра контейнеров Azure (в противном случае необходимо указать имя в az acr login
), создать образ и отправить его в реестр.
Убедитесь, что управляющая программа Docker запущена во время выполнения этого шага.
az config set defaults.acr=mysqlaksdemoregistry
az acr login && mvn compile jib:build
Создать кластер Kubernetes в AKS
Теперь мы создадим кластер AKS в виртуальной сети vnet-mysqlaksdemo.
В этом руководстве мы будем использовать сеть Azure CNI в AKS. Если вы хотите настроить сеть kubenet, см. статью Использование сети kubenet в AKS.
Создайте подсеть subnet-aks для используемого кластера AKS.
az network vnet subnet create \ --resource-group rg-mysqlaksdemo \ --vnet-name vnet-mysqlaksdemo \ --name subnet-aks \ --address-prefixes 155.55.2.0/24
Получите идентификатор ресурса подсети.
SUBNET_ID=$(az network vnet subnet show --resource-group rg-mysqlaksdemo --vnet-name vnet-mysqlaksdemo --name subnet-aks --query id -o tsv)
Создайте кластер AKS в виртуальной сети с прикрепленным mysqlaksdemoregistry Реестра контейнеров Azure (ACR).
az aks create \ --resource-group rg-mysqlaksdemo \ --name aks-mysqlaksdemo \ --network-plugin azure \ --service-cidr 10.0.0.0/16 \ --dns-service-ip 10.0.0.10 \ --docker-bridge-address 172.17.0.1/16 \ --vnet-subnet-id $SUBNET_ID \ --attach-acr mysqlaksdemoregistry \ --dns-name-prefix aks-mysqlaksdemo \ --generate-ssh-keys
Приведенные ниже диапазоны IP-адресов также определяются в процессе создания кластера:
--service-cidr используется для назначения IP-адреса внутренним службам в кластере AKS. Можно использовать любой диапазон частных адресов, который отвечает следующим требованиям:
- Должен быть за пределами диапазона IP-адресов виртуальной сети вашего кластера.
- Не должен пересекаться с диапазоном других виртуальных сетей, с которыми связан кластер виртуальной сети.
- не должен перекрываться с какими-либо локальными IP-адресами.
- Не должен находиться в диапазонах: 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24
Адрес --dns-service-ip — IP-адрес службы DNS кластера. Этот адрес должен находиться в пределах диапазона адресов службы Kubernetes. Не используйте первый IP-адрес своего диапазона адресов. Первый адрес в диапазоне подсети используется для адреса kubernetes.default.svc.cluster.local.
--docker-bridge-address — сетевой адрес моста Docker представляет собой сетевой адрес моста по умолчанию docker0, который присутствует во всех установленных экземплярах Docker. Нужно выбрать диапазон адресов, который не конфликтует с остальными адресами CIDR в ваших сетях, включая CIDR службы кластера и CIDR модуля pod.
Развертывание приложения в кластере AKS
Перейдите к ресурсу кластера AKS на портале Azure.
Выберите Добавить и Добавить с помощью YAML из любого представления ресурсов (пространство имен, рабочие нагрузки, службы и входящий трафик, хранилище или конфигурация).
Вставьте следующий код YAML. Замените значения для База данных Azure для MySQL имени пользователя и пароля администратора гибкого сервера.
apiVersion: apps/v1 kind: Deployment metadata: name: springboot-mysql-aks spec: replicas: 1 selector: matchLabels: app: springboot-mysql-aks template: metadata: labels: app: springboot-mysql-aks spec: containers: - name: springboot-mysql-aks image: mysqlaksdemoregistry.azurecr.io/springboot-mysql-aks:latest env: - name: DATABASE_HOST value: "mysql-mysqlaksdemo.mysql.database.azure.com" - name: DATABASE_USERNAME value: "<your-admin-username>" - name: DATABASE_PASSWORD value: "<your-admin-password>" - name: DATABASE_NAME value: "demo" --- apiVersion: v1 kind: Service metadata: name: springboot-mysql-aks spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: springboot-mysql-aks
Выберите Добавить в нижней части редактора YAML, чтобы развернуть приложение.
После добавления файла YAML в средстве просмотра ресурсов вы увидите свое приложение Spring Boot. Запишите связанный внешний IP-адрес, который входит во внешнюю службу.
Тестирование приложения
Чтобы протестировать приложение, можно использовать cURL.
Сначала создайте новый элемент todo в базе данных с помощью следующей команды.
curl --header "Content-Type: application/json" \
--request POST \
--data '{"description":"configuration","details":"congratulations, you have deployed your application correctly!","done": "true"}' \
http://<AKS-service-external-ip>
Затем извлеките данные с помощью нового запроса cURL или введите в браузере внешний IP-адрес кластера.
curl http://<AKS-service-external-ip>
Эта команда вернет список элементов todo, включая созданный вами элемент.
[{"id":1,"description":"configuration","details":"congratulations, you have deployed your application correctly!","done":true}]
Ниже приведен снимок экрана с этими запросами cURL:
Вы можете просмотреть аналогичные выходные данные в браузере:
Поздравляем! Вы успешно развернули приложение Spring Boot в кластере Служба Azure Kubernetes (AKS) с гибким сервером База данных Azure для MySQL!
Очистка ресурсов
Чтобы избежать расходов за использование Azure, необходимо удалить ненужные ресурсы. Чтобы удалить ненужные кластер, группу ресурсов, службу контейнеров и все связанные с ней ресурсы, выполните команду az group delete.
az group delete --name rg-mysqlaksdemo
Примечание.
При удалении кластера субъект-служба Microsoft Entra, используемая кластером AKS, не удаляется. Инструкции по удалению субъекта-службы см. в разделе с дополнительными замечаниями. Управляемые удостоверения администрируются платформой, и их не нужно удалять.