Tutorial: Implantar um aplicativo Spring Boot no cluster AKS com o Banco de Dados do Azure para MySQL - Servidor flexível em uma rede virtual

APLICA-SE A: Banco de Dados do Azure para MySQL - Servidor Flexível

Neste tutorial, você aprenderá como implantar um aplicativo Spring Boot no cluster do Serviço Kubernetes do Azure (AKS) com o servidor flexível do Banco de Dados do Azure para MySQL no back-end, comunicando-se com segurança entre si em uma rede virtual do Azure.

Nota

Este tutorial pressupõe uma compreensão básica dos conceitos do Kubernetes, Java Spring Boot e MySQL. Para aplicativos Spring Boot, recomendamos o uso do Azure Spring Apps. No entanto, você ainda pode usar os Serviços Kubernetes do Azure como destino. Consulte Java Workload Destination Guidance para obter conselhos.

Pré-requisitos

Criar um Banco de Dados do Azure para o servidor flexível MySQL

Criar um grupo de recursos

Um grupo de recursos do Azure é um grupo lógico, no qual os recursos do Azure são implementados e geridos. Vamos criar um grupo de recursos rg-mysqlaksdemo usando o comando az group create no local eastus .

  1. Abra o prompt de comando.
  2. Inicie sessão na sua conta do Azure.
    az login
    
  3. Escolha a sua subscrição do Azure.
    az account set -s <your-subscription-ID>
    
  4. Crie o grupo de recursos.
    az group create --name rg-mysqlaksdemo --location eastus
    

Criar um Banco de Dados do Azure para instância de servidor flexível do MySQL

Agora criaremos um Banco de Dados do Azure para instância de servidor flexível do MySQL em uma rede virtual (método de conectividade de acesso privado).

  1. Crie uma rede virtual do Azure vnet-mysqlaksdemo para todos os recursos neste tutorial e uma sub-rede subnet-mysql para a instância de servidor flexível do Banco de Dados do Azure para 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. Crie um Banco de Dados do Azure para instância de servidor flexível MySQL-mysqlaksdemo na sub-rede criada acima, usando o comando az mysql flexible-server create . Substitua seus valores para nome de usuário e senha de administrador.

    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
    

    Agora você criou uma instância de servidor flexível do Banco de Dados do Azure para MySQL na região eastus com computação Burstable B1MS, armazenamento de 32 GB, período de retenção de backup de 7 dias e na sub-rede de sub-rede fornecida-mysql. Essa sub-rede não deve ter nenhum outro recurso implantado nela e será delegada a Microsoft.DBforMySQL/flexibleServers.

  3. Configure um novo Banco de Dados do Azure para o banco de dados demo de servidor flexível MySQL a ser usado com o Aplicativo Spring Boot.

    az mysql flexible-server db create \
    --resource-group rg-mysqlaksdemo \
    --server-name mysql-mysqlaksdemo \
    --database-name demo
    

Criar um registo de contentor do Azure

Crie um registo de contentor do Azure privado no grupo de recursos. Este tutorial envia o aplicativo de exemplo como uma imagem do Docker para este registro em etapas posteriores. Substitua mysqlaksdemoregistry por um nome exclusivo para o seu registo.

az acr create --resource-group rg-mysqlaksdemo \
--location eastus \
--name mysqlaksdemoregistry \
--sku Basic

Codificar a aplicação

Nesta seção, codificaremos o aplicativo de demonstração. Se você quiser ir mais rápido, você pode baixar o aplicativo codificado disponível em https://github.com/Azure-Samples/tutorial-springboot-mysql-aks e pular para a próxima seção - Construir a imagem e empurrar para ACR.

  1. Gere o aplicativo usando o 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 -
    

    Um aplicativo base Spring Boot será gerado dentro da springboot-mysql-aks pasta.

    Use seu editor de texto favorito como VSCode ou qualquer IDE para as etapas a seguir.

  2. Configure o Spring Boot para usar o Banco de Dados do Azure para o servidor flexível MySQL.

    Abra o arquivo src/main/resources/application.properties e adicione o trecho abaixo. Esse código está lendo o host do banco de dados, o nome do banco de dados, o nome de usuário e a senha do arquivo de manifesto do 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
    

    Aviso

    A propriedade spring.datasource.initialization-mode=always configuration significa que o Spring Boot gerará automaticamente um esquema de banco de dados, usando o schema.sql arquivo que criaremos mais tarde, cada vez que o servidor for iniciado. Isso é ótimo para testes, mas lembre-se de que isso excluirá seus dados a cada reinicialização, então isso não deve ser usado na produção!

    Nota

    Acrescentámos ?serverTimezone=UTC à propriedade de configuração spring.datasource.url para indicar ao controlador JDBC que utilize o formato de data UTC (Hora Universal Coordenada) quando ligar à base de dados. Caso contrário, o nosso servidor Java não utilizaria o mesmo formato de data que a base de dados, o que resultaria num erro.

  3. Crie o esquema de banco de dados.

    O Spring Boot será executado src/main/resources/schema.sql automaticamente para criar um esquema de banco de dados. Crie esse arquivo, com o seguinte conteúdo:

    DROP TABLE IF EXISTS todo;
    CREATE TABLE todo (id SERIAL PRIMARY KEY, description VARCHAR(255), details VARCHAR(4096), done BOOLEAN);
    
  4. Codifique o aplicativo Java Spring Boot.

    Adicione o código Java que usará JDBC para armazenar e recuperar dados do seu servidor MySQL. Crie uma nova Todo classe Java, ao lado da DemoApplication classe, e adicione o seguinte código:

    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;
        }
    }
    

    Esta classe é um modelo de domínio mapeado na tabela todo que criou anteriormente.

    Precisará de um repositório para gerir essa classe. Defina uma nova interface TodoRepository no mesmo pacote:

    package com.example.springbootmysqlaks;
    
    import org.springframework.data.repository.CrudRepository;
    
    public interface TodoRepository extends CrudRepository<Todo, Long> {
    }
    

    Este repositório é um repositório que o Spring Data JDBC gerencia.

    Conclua o aplicativo criando um controlador que possa armazenar e recuperar dados. Implemente uma classe TodoController no mesmo pacote e adicione o seguinte código:

    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. Crie um novo Dockerfile no diretório base springboot-mysql-aks e copie este trecho de código.

    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. Vá para o arquivo de pom.xml e atualize a <properties> coleção no arquivo pom.xml com o nome do Registro do Registro do Contêiner do Azure e a versão mais recente do jib-maven-plugin. Nota: Se o seu nome ACR contiver caracteres maiúsculos, certifique-se de convertê-los em caracteres minúsculos.

    <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. Atualize a <plugins>coleção no arquivo pom.xml para que haja um <plugin> elemento contendo uma entrada para o jib-maven-plugin, conforme mostrado abaixo. Tenha em atenção que estamos a utilizar uma imagem base do Microsoft Container Registry (MCR), mcr.microsoft.com/java/jdk:8-zulu-alpine, que contém um JDK suportado oficialmente para o Azure. Para outras imagens de base MCR com JDKs oficialmente suportados, consulte o hub 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>
    

Crie a imagem e envie para o ACR

No prompt de comando, navegue até a pasta springboot-mysql-aks e execute os seguintes comandos para primeiro definir o nome padrão para o Registro de Contêiner do Azure (caso contrário, você precisará especificar o nome em az acr login), crie a imagem e envie a imagem para o Registro.

Verifique se o daemon do docker está em execução durante a execução desta etapa.

az config set defaults.acr=mysqlaksdemoregistry
az acr login && mvn compile jib:build

Criar um cluster Kubernetes no AKS

Agora vamos criar um cluster AKS na rede virtual vnet-mysqlaksdemo.

Neste tutorial, usaremos a rede CNI do Azure no AKS. Se você quiser configurar a rede kubenet em vez disso, consulte Usar rede kubenet no AKS.

  1. Crie uma sub-rede-aks para o cluster AKS usar.

    az network vnet subnet create \
    --resource-group rg-mysqlaksdemo \
    --vnet-name vnet-mysqlaksdemo \
    --name subnet-aks \
    --address-prefixes 155.55.2.0/24
    
  2. Obtenha o ID do recurso de sub-rede.

    SUBNET_ID=$(az network vnet subnet show --resource-group rg-mysqlaksdemo --vnet-name vnet-mysqlaksdemo --name subnet-aks --query id -o tsv)
    
  3. Crie um cluster AKS na rede virtual, com o Azure Container Registry (ACR) mysqlaksdemoregistry anexado.

        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
    

    Os seguintes intervalos de endereços IP também são definidos como parte do processo de criação do cluster:

    • O --service-cidr é usado para atribuir serviços internos no cluster AKS um endereço IP. Você pode usar qualquer intervalo de endereços privados que satisfaça os seguintes requisitos:

      • Não deve estar dentro do intervalo de endereços IP da rede virtual do cluster
      • Não deve sobrepor-se a quaisquer outras redes virtuais com as quais os pares de rede virtual do cluster
      • Não deve sobrepor-se a nenhum IPs local
      • Não deve estar dentro dos intervalos 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16 ou 192.0.2.0/24
    • O endereço --dns-service-ip é o endereço IP do serviço DNS do cluster. Este endereço tem de estar dentro do intervalo de endereços do serviço Kubernetes. Não use o primeiro endereço IP no seu intervalo de endereços. O primeiro endereço no intervalo de sub-redes é usado para o endereço kubernetes.default.svc.cluster.local .

    • O --docker-bridge-address é o endereço de rede da ponte do Docker que representa o endereço de rede da ponte docker0 padrão presente em todas as instalações do Docker. Você deve escolher um espaço de endereço que não colida com o resto dos CIDRs em suas redes, incluindo o CIDR de serviço do cluster e o CIDR pod.

Implantar o aplicativo no cluster AKS

  1. Vá para o seu recurso de cluster AKS no portal do Azure.

  2. Selecione Adicionar e Adicionar com YAML em qualquer uma das exibições de recursos (Namespace, Cargas de trabalho, Serviços e entradas, Armazenamento ou Configuração).

    Captura de ecrã que mostra a vista de recursos do Serviço Kubernetes do Azure no portal do Azure.

  3. Cole no seguinte YAML. Substitua seus valores para o Banco de Dados do Azure para MySQL, nome de usuário e senha flexíveis de administrador do servidor.

    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. Selecione Adicionar na parte inferior do editor YAML para implantar o aplicativo.

    Captura de tela que mostra Adicionar com o editor YAML.

  5. Depois que o arquivo YAML é adicionado, o visualizador de recursos mostra seu aplicativo Spring Boot. Anote o endereço IP externo vinculado incluído no serviço externo.

    Captura de ecrã que mostra a vista do portal do Azure do IP externo do serviço de cluster Kubernetes do Azure.

Testar a aplicação

Pode utilizar o cURL para testar a aplicação.

Primeiro, crie um novo item "todo" no banco de dados usando o seguinte comando.

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>

Em seguida, recupere os dados usando uma nova solicitação cURL ou inserindo o IP externo do cluster em seu navegador.

curl http://<AKS-service-external-ip>

Este comando retornará a lista de itens "todo", incluindo o item que você criou.

[{"id":1,"description":"configuration","details":"congratulations, you have deployed your application correctly!","done":true}]

Aqui está uma captura de tela dessas solicitações de cURL: Captura de tela que mostra a saída da linha de comando das solicitações cURL.

Você pode ver uma saída semelhante através do seu navegador: Captura de tela que mostra a saída da solicitação do navegador.

Parabéns! Você implantou com êxito um aplicativo Spring Boot no cluster do Serviço Kubernetes do Azure (AKS) com o Servidor flexível do Banco de Dados do Azure para MySQL no back-end!

Limpar os recursos

Para evitar cobranças do Azure, você deve limpar recursos desnecessários. Quando o cluster já não for necessário, utilize o comando az group delete para remover o grupo de recursos, o serviço de contentores e todos os recursos relacionados.

az group delete --name rg-mysqlaksdemo

Nota

Quando você exclui o cluster, a entidade de serviço do Microsoft Entra usada pelo cluster AKS não é removida. Para obter passos sobre como remover o principal de serviço, consulte Considerações sobre e eliminação do principal de serviço AKS. Se você usou uma identidade gerenciada, a identidade é gerenciada pela plataforma e não requer remoção.

Próximos passos