Bagikan melalui


Tutorial: Menyebarkan aplikasi Spring Boot pada kluster AKS dengan Azure Database for MySQL - Server Fleksibel di VNet

Dalam tutorial ini, Anda akan mempelajari cara menyebarkan aplikasi Spring Boot di kluster Azure Kubernetes Service (AKS) dengan Apa itu Azure Database for MySQL - Server Fleksibel? di backend, berkomunikasi dengan aman satu sama lain dalam jaringan virtual Azure.

Catatan

Tutorial ini mengasumsikan pemahaman dasar tentang konsep Kube, Java Spring Boot dan MySQL. Untuk aplikasi Spring Boot, sebaiknya gunakan Azure Spring Apps. Namun, Anda masih dapat menggunakan Azure Kubernetes Services sebagai tujuan. Lihat Panduan Tujuan Beban Kerja Java untuk saran.

Prasyarat

Membuat Server Fleksibel Azure Database for MySQL

Buat grup sumber daya

Grup sumber daya Azure adalah grup logis tempat sumber daya Azure disebarkan dan dikelola. Mari membuat grup sumber daya rg-mysqlaksdemo menggunakan perintah az group create di lokasi eastus.

  1. Buka perintah.

  2. Masuk menggunakan akun Azure Anda.

    az login
    
  3. Pilih langganan Azure Anda.

    az account set -s <your-subscription-ID>
    
  4. Membuat grup sumber daya.

    az group create --name rg-mysqlaksdemo --location eastus
    

Membuat instans Server Fleksibel Azure Database for MySQL

Sekarang kita akan membuat instans Azure Database for MySQL Flexible Server dalam jaringan virtual (metode konektivitas akses privat).

  1. Buat jaringan virtual Azure vnet-mysqlaksdemo untuk semua sumber daya dalam tutorial ini, dan subnet subnet-mysql untuk instans Azure Database for MySQL Flexible Server.

    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. Buat instans Server Fleksibel Azure Database for MySQL mysql-mysqlaksdemo di subnet yang dibuat di atas, menggunakan perintah az mysql flexible-server create . Ganti nilai Anda untuk kata sandi dan nama pengguna admin.

    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
    

    Anda sekarang telah membuat instans Azure Database for MySQL Flexible Server di wilayah eastus dengan komputasi Burstable B1MS, penyimpanan 32 GB, periode retensi cadangan 7 hari, dan di subnet-mysql subnet yang disediakan. Subnet yang disediakan tidak boleh memiliki sumber daya lain yang disebarkan di dalamnya dan subnet ini akan didelegasikan ke Microsoft.DBforMySQL/flexibleServers.

  3. Konfigurasikan database demo Server Fleksibel Azure Database for MySQL baru untuk digunakan dengan Aplikasi Spring Boot.

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

Membuat Azure container registry

Buat registri kontainer Azure privat di grup sumber daya. Tutorial ini mendorong aplikasi sampel sebagai gambar Docker ke registri ini di langkah selanjutnya. Ganti mysqlaksdemoregistry dengan nama unik untuk registri Anda.

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

Kodekan aplikasi

Pada bagian ini, kita akan mengodekan aplikasi demo. Jika Anda ingin berjalan lebih cepat, Anda dapat mengunduh aplikasi berkode yang tersedia di https://github.com/Azure-Samples/tutorial-springboot-mysql-aks dan melompat ke bagian berikutnya - Membangun gambar dan mendorong ke ACR.

  1. Hasilkan aplikasi menggunakan 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 -
    

    Aplikasi Spring Boot dasar akan dihasilkan di springboot-mysql-aks dalam folder.

    Gunakan editor teks favorit Anda seperti VSCode atau IDE apa pun untuk langkah berikut.

  2. Konfigurasikan Spring Boot untuk menggunakan Server Fleksibel Azure Database for MySQL.

    Buka file src/main/resources/application.properties, dan tambahkan cuplikan di bawah ini. Kode di bawah ini sedang membaca host database, nama database, nama pengguna, dan kata sandi dari file manifes Kube.

    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
    

    Peringatan

    Properti konfigurasi spring.datasource.initialization-mode=always berarti bahwa Spring Boot akan secara otomatis menghasilkan skema database, menggunakan file schema.sql yang akan kita buat nanti, setiap kali server dimulai. Ini bagus untuk pengujian, tetapi ingat ini akan menghapus data Anda di setiap menghidupkan ulang, jadi ini tidak boleh digunakan dalam produksi!

    Catatan

    Kita menambahkan ?serverTimezone=UTC ke properti konfigurasi spring.datasource.url, untuk memberi tahu driver JDBC agar menggunakan format tanggal UTC (atau Waktu Universal Terkoordinasi) saat menghubungkan ke database. Jika tidak, server Java kita tidak akan menggunakan format tanggal yang sama dengan database, yang akan mengakibatkan kesalahan.

  3. Buat skema database.

    Spring Boot akan secara otomatis mengeksekusi src/main/resources/schema.sql untuk membuat skema database. Buat file tersebut dengan konten berikut:

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

    Selanjutnya, tambahkan kode Java yang akan menggunakan JDBC untuk menyimpan dan mengambil data dari server MySQL Anda. Tambahkan kelas Java Todo baru, di samping kelas DemoApplication, dan tambahkan kode berikut:

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

    Kelas ini adalah model domain yang dipetakan pada tabel todo yang Anda buat sebelumnya.

    Untuk mengelola kelas itu, Anda memerlukan repositori. Tentukan TodoRepository antarmuka baru dalam paket yang sama:

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

    Repositori ini adalah repositori yang dikelola Spring Data JDBC.

    Selesaikan aplikasi dengan membuat pengontrol yang dapat menyimpan dan mengambil data. Terapkan kelas TodoController dalam paket yang sama, dan tambahkan kode berikut:

    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. Buat Dockerfile baru di direktori dasar springboot-mysql-aks dan salin cuplikan kode ini.

    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. Buka file pom.xml dan perbarui koleksi <properties> di file pom.xml dengan nama registri untuk Azure Container Registry Anda dan versi terbaru dari jib-maven-plugin. Catatan: Jika nama ACR Anda berisi karakter huruf besar, pastikan untuk mengonversinya menjadi karakter huruf kecil.

    <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. Perbarui koleksi <plugins> dalam file pom.xml sehingga terdapat elemen <plugin> yang berisi entri untuk jib-maven-plugin, seperti yang ditampilkan dalam contoh berikut. Kami menggunakan gambar dasar dari Microsoft Container Registry (MCR): mcr.microsoft.com/java/jdk:8-zulu-alpine, yang berisi JDK yang didukung secara resmi untuk Azure. Untuk gambar dasar MCR lainnya dengan JDK yang didukung secara resmi, lihat 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>
    

Membangun gambar dan mendorong ke ACR

Di perintaht, buka folder springboot-mysql-aks dan jalankan perintah berikut guna terlebih dahulu mengatur nama default untuk Azure Container Registry (jika tidak, Anda harus menentukan nama di az acr login), bangun gambar dan kemudian dorong gambar ke registri.

Pastikan daemon docker Anda berjalan saat menjalankan langkah ini.

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

Membuat kluster Kube di AKS

Kita sekarang akan membuat kluster AKS di jaringan virtual vnet-mysqlaksdemo.

Dalam tutorial ini, kita akan menggunakan jaringan Azure CNI di AKS. Jika Anda ingin mengonfigurasi jaringan kubenet sebagai gantinya, lihat Menggunakan jaringan kubenet di AKS.

  1. Buat subnet subnet-aks untuk digunakan kluster 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. Dapatkan ID sumber daya subnet.

    SUBNET_ID=$(az network vnet subnet show --resource-group rg-mysqlaksdemo --vnet-name vnet-mysqlaksdemo --name subnet-aks --query id -o tsv)
    
  3. Buat klaster AKS di jaringan virtual, dengan Azure Container Registry (ACR) mysqlaksdemoregistry terpasang.

        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
    

    Rentang alamat IP berikut juga ditentukan sebagai bagian dari proses pembuatan kluster:

    • --service-cidr digunakan untuk menetapkan alamat IP pada layanan internal di kluster AKS. Anda dapat menggunakan rentang alamat privat apa pun yang memenuhi persyaratan berikut:

      • Tidak boleh berada dalam rentang alamat IP jaringan virtual kluster Anda
      • Tidak boleh tumpang tindih dengan jaringan virtual lain yang dengannya rekan jaringan virtual kluster
      • Tidak boleh tumpang tindih dengan IP lokal
      • Tidak boleh dalam rentang 169.254.0.0/16, 172.30.0.0/16, 172.31.0.0/16, or 192.0.2.0/24
    • Alamat --dns-service-ip adalah Alamat IP untuk layanan DNS kluster. Alamat ini harus berada dalam rentang alamat layanan Kubernetes. Jangan gunakan alamat IP pertama di rentang alamat Anda. Alamat pertama dalam rentang subnet digunakan untuk alamat kubernetes.default.svc.cluster.local.

    • Alamat --docker-bridge-address adalah Alamat jaringan jembatan Docker mewakili alamat jaringan jembatan docker0 default yang ada di semua instalasi Docker. Anda harus memilih ruang alamat yang tidak bertabrakan dengan CIDR lainnya di jaringan Anda, termasuk CIDR layanan kluster dan CIDR pod.

Menyebarkan aplikasi ke kluster AKS

  1. Buka sumber daya kluster AKS Anda di portal Microsoft Azure.

  2. Pilih Tambahkan dan Tambahkan dengan YAML dari tampilan sumber daya apa pun (Namespace, Beban Kerja, Layanan dan ingress, Penyimpanan, atau Konfigurasi).

    Cuplikan layar yang memperlihatkan tampilan sumber daya Azure Kubernetes Service di portal Microsoft Azure.

  3. Tempelkan di YAML berikut. Ganti nilai Anda untuk nama pengguna dan kata sandi admin Azure Database for MySQL Flexible Server.

    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. Pilih Tambahkan di bagian bawah penyunting YAML untuk menyebarkan aplikasi.

    Cuplikan layar yang menunjukkan Tambahkan dengan editor YAML.

  5. Setelah file YAML ditambahkan, penampil sumber daya menunjukkan aplikasi Spring Boot Anda. Catat alamat IP eksternal tertaut yang disertakan dalam layanan eksternal.

    Cuplikan layar yang memperlihatkan tampilan portal Microsoft Azure dari IP eksternal layanan kluster Azure Kubernetes.

Uji aplikasi

Untuk menguji aplikasi, Anda dapat menggunakan cURL.

Pertama, buat item "todo" baru dalam database menggunakan perintah berikut.

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>

Selanjutnya, ambil data dengan menggunakan permintaan cURL baru, atau dengan memasukkan klaster IP Eksternal di browser Anda.

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

Perintah ini akan menampilkan daftar item "todo", termasuk item yang telah Anda buat.

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

Berikut adalah cuplikan layar permintaan cURL ini: Cuplikan layar yang memperlihatkan output baris perintah permintaan cURL.

Anda dapat melihat output serupa melalui browser Anda: Cuplikan layar yang memperlihatkan output permintaan browser.

Selamat! Anda telah berhasil menyebarkan aplikasi Spring Boot pada kluster Azure Kubernetes Service (AKS) dengan Azure Database for MySQL Flexible Server di backend!

Membersihkan sumber daya

Untuk menghindari biaya Azure, Anda harus membersihkan sumber daya yang tidak diperlukan. Ketika kluster tidak lagi diperlukan, gunakan perintah hapus grup az untuk menghapus grup sumber daya, layanan kontainer, dan semua sumber daya terkait.

az group delete --name rg-mysqlaksdemo

Catatan

Saat Anda menghapus kluster, perwakilan layanan Microsoft Entra yang digunakan oleh kluster AKS tidak dihapus. Untuk langkah tentang cara menghapus perwakilan layanan, lihat Pertimbangan dan penghapusan perwakilan layanan AKS. Jika Anda menggunakan identitas terkelola, identitas dikelola oleh platform dan tidak memerlukan penghapusan.