Руководство. Развертывание приложения 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 для MySQL

Создание или изменение группы ресурсов

Группа ресурсов Azure — это логическая группа, в которой развертываются и управляются ресурсы Azure. Давайте создадим группу ресурсов rg-mysqlaksdemo с помощью команды az group create в расположении eastus.

  1. Откройте командную строку.
  2. Войдите в свою учетную запись Azure.
    az login
    
  3. Выберите подписку Azure.
    az account set -s <your-subscription-ID>
    
  4. Создание группы ресурсов.
    az group create --name rg-mysqlaksdemo --location eastus
    

Создание гибкого экземпляра сервера База данных Azure для MySQL

Теперь мы создадим гибкий экземпляр сервера База данных Azure для MySQL в виртуальной сети (метод подключения к частному доступу).

  1. Создайте виртуальную сеть 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 
    
  2. Создайте гибкий экземпляр сервера База данных 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.

  3. Настройте новую База данных 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.

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

  2. Настройте 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 и база данных будут использовать разные форматы даты, что неизбежно приведет к ошибке.

  3. Создание схемы базы данных.

    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);
    
  4. Создайте код для приложения 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();
        }
    }
    
  5. Создайте новый 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"]
    
  6. Перейдите к файлу 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>
    
  7. Обновите коллекцию <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.

  1. Создайте подсеть 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
    
  2. Получите идентификатор ресурса подсети.

    SUBNET_ID=$(az network vnet subnet show --resource-group rg-mysqlaksdemo --vnet-name vnet-mysqlaksdemo --name subnet-aks --query id -o tsv)
    
  3. Создайте кластер 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

  1. Перейдите к ресурсу кластера AKS на портале Azure.

  2. Выберите Добавить и Добавить с помощью YAML из любого представления ресурсов (пространство имен, рабочие нагрузки, службы и входящий трафик, хранилище или конфигурация).

    Снимок экрана: представление ресурсов Служба Azure Kubernetes на портал Azure.

  3. Вставьте следующий код 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
    
  4. Выберите Добавить в нижней части редактора YAML, чтобы развернуть приложение.

    Снимок экрана: добавление с редактором YAML.

  5. После добавления файла YAML в средстве просмотра ресурсов вы увидите свое приложение Spring Boot. Запишите связанный внешний IP-адрес, который входит во внешнюю службу.

    Снимок экрана: портал Azure представление внешнего IP-адреса службы кластера Azure Kubernetes.

Тестирование приложения

Чтобы протестировать приложение, можно использовать 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: Снимок экрана: выходные данные командной строки запросов cURL.

Вы можете просмотреть аналогичные выходные данные в браузере: Снимок экрана: выходные данные запроса браузера.

Поздравляем! Вы успешно развернули приложение Spring Boot в кластере Служба Azure Kubernetes (AKS) с гибким сервером База данных Azure для MySQL!

Очистка ресурсов

Чтобы избежать расходов за использование Azure, необходимо удалить ненужные ресурсы. Чтобы удалить ненужные кластер, группу ресурсов, службу контейнеров и все связанные с ней ресурсы, выполните команду az group delete.

az group delete --name rg-mysqlaksdemo

Примечание.

При удалении кластера субъект-служба Microsoft Entra, используемая кластером AKS, не удаляется. Инструкции по удалению субъекта-службы см. в разделе с дополнительными замечаниями. Управляемые удостоверения администрируются платформой, и их не нужно удалять.

Следующие шаги