Bagikan melalui


Menyebarkan aplikasi Java dengan Quarkus pada kluster Azure Kubernetes Service

Artikel ini menunjukkan cara menyebarkan Red Hat Quarkus dengan cepat di Azure Kubernetes Service (AKS) dengan aplikasi CRUD sederhana. Aplikasi ini adalah "daftar tugas" dengan front end JavaScript dan titik akhir REST. Server Fleksibel Azure Database for PostgreSQL menyediakan lapisan persistensi untuk aplikasi. Artikel ini menunjukkan kepada Anda cara menguji aplikasi secara lokal dan menyebarkannya ke AKS.

Prasyarat

  • Jika Anda tidak memiliki Langganan Azure, buat Akun gratis Azure sebelum memulai.
  • Siapkan komputer lokal dengan sistem operasi seperti Unix yang terinstal - misalnya, Ubuntu, macOS, atau Subsistem Windows untuk Linux.
  • Instal implementasi Java SE versi 17 atau yang lebih baru - misalnya, Microsoft build OpenJDK.
  • Instal Maven, versi 3.9.8 atau yang lebih tinggi.
  • Pasang Docker untuk OS Anda.
  • Pasang jq.
  • Instal cURL.
  • Instal Quarkus CLI, versi 3.12.1 atau yang lebih tinggi.
  • Azure CLI untuk lingkungan seperti Unix. Artikel ini hanya memerlukan varian Bash dari Azure CLI.
    • Pengembang harus menginstal Azure CLI dan masuk secara interaktif dengan perintah az login untuk masuk ke Azure sebelum menggunakan DefaultAzureCredential dalam kode.
      az login
      
    • Artikel ini memerlukan setidaknya Azure CLI versi 2.61.0.

Membuat proyek aplikasi

Gunakan perintah berikut untuk mengkloning sampel proyek Java untuk artikel ini. Sampelnya ada di GitHub.

git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2024-12-16
cd aks-quarkus

Jika Anda melihat pesan tentang berada dalam status HEAD yang terlepas, pesan ini aman untuk diabaikan. Karena artikel ini tidak memerlukan penerapan apa pun, status HEAD yang dilepas sesuai.

Uji aplikasi Quarkus Anda secara lokal

Langkah-langkah di bagian ini menunjukkan kepada Anda cara menjalankan aplikasi secara lokal.

Quarkus mendukung provisi otomatis layanan yang tidak dikonfigurasi dalam mode pengembangan dan pengujian. Quarkus menyebut kemampuan ini sebagai layanan dev. Katakanlah Anda menyertakan fitur Quarkus, seperti menyambungkan ke layanan database. Anda ingin menguji aplikasi, tetapi belum sepenuhnya mengonfigurasi koneksi ke database nyata. Quarkus secara otomatis memulai versi stub kontainer dari layanan yang relevan dan menghubungkan aplikasi Anda ke dalamnya. Untuk informasi selengkapnya, lihat Gambaran Umum Dev Services dalam dokumentasi Quarkus.

Pastikan lingkungan kontainer Anda berjalan dan gunakan perintah berikut untuk memasuki mode dev Quarkus:

quarkus dev

Alih-alih quarkus dev, Anda dapat mencapai hal yang sama dengan Maven dengan menggunakan mvn quarkus:dev.

Anda mungkin ditanya apakah Anda ingin mengirim telemetri penggunaan mode dev Quarkus Anda. Jika demikian, jawab sesuai keinginan Anda.

Mode dev Quarkus memungkinkan pemuatan ulang langsung dengan kompilasi latar belakang. Jika Anda memodifikasi aspek kode sumber aplikasi dan merefresh browser, Anda dapat melihat perubahannya. Jika ada masalah dengan kompilasi atau penyebaran, halaman kesalahan memberi tahu Anda. Mode dev Quarkus mendengarkan debugger pada port 5005. Jika Anda ingin menunggu debugger dilampirkan sebelum berjalan, teruskan -Dsuspend pada baris perintah. Jika Anda tidak ingin debugger sama sekali, Anda dapat menggunakan -Ddebug=false.

Output akan terlihat seperti contoh berikut:

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
INFO  [io.quarkus] (Quarkus Main Thread) quarkus-todo-demo-app-aks 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.2.0.Final) started in 3.377s. Listening on: http://localhost:8080

INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, hibernate-validator, jdbc-postgresql, narayana-jta, resteasy-reactive, resteasy-reactive-jackson, smallrye-context-propagation, vertx]

--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>

Tekan w pada terminal tempat mode dev Quarkus berjalan. Kunci w membuka browser web default Anda untuk menampilkan Todo aplikasi. Anda juga dapat mengakses GUI http://localhost:8080 aplikasi secara langsung.

Cuplikan layar aplikasi sampel Todo.

Coba pilih beberapa item todo di daftar todo. UI menunjukkan pilihan dengan gaya teks coretan. Anda juga dapat menambahkan item todo baru ke daftar todo dengan mengetik Verifikasi aplikasi Todo dan menekan Enter, seperti yang ditunjukkan pada cuplikan layar berikut:

Cuplikan layar aplikasi sampel Todo dengan item baru ditambahkan.

Akses RESTful API (/api) untuk mendapatkan semua item todo yang disimpan di database PostgreSQL lokal:

curl --verbose http://localhost:8080/api | jq .

Output akan terlihat seperti contoh berikut:

* Connected to localhost (127.0.0.1) port 8080 (#0)
> GET /api HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 664
< Content-Type: application/json;charset=UTF-8
<
{ [664 bytes data]
100   664  100   664    0     0  13278      0 --:--:-- --:--:-- --:--:-- 15441
* Connection #0 to host localhost left intact
[
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": false,
    "order": 0,
    "url": null
  },
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Verify Todo apps",
    "completed": false,
    "order": 5,
    "url": null
  }
]

Tekan q untuk keluar dari mode dev Quarkus.

Membuat sumber daya Azure untuk menjalankan aplikasi Quarkus

Langkah-langkah di bagian ini memperlihatkan kepada Anda cara membuat sumber daya Azure berikut untuk menjalankan aplikasi sampel Quarkus:

  • Server Fleksibel Azure Database for PostgreSQL
  • Azure Container Registry
  • Azure Kubernetes Service (AKS)

Catatan

Artikel ini menonaktifkan autentikasi PostgreSQL untuk mengilustrasikan praktik terbaik keamanan. ID Microsoft Entra digunakan untuk mengautentikasi koneksi ke server. Jika Anda perlu mengaktifkan autentikasi PostgreSQL, lihat Mulai Cepat: Menggunakan Java dan JDBC dengan Azure Database for PostgreSQL - Server Fleksibel dan pilih tab Kata Sandi .

Beberapa sumber daya ini harus memiliki nama unik dalam cakupan langganan Azure. Untuk memastikan keunikan ini, Anda dapat menggunakan inisial, urutan, tanggal, pola akhiran . Untuk menerapkan pola ini, beri nama sumber daya Anda dengan mencantumkan inisial Anda, beberapa nomor urutan, tanggal hari ini, dan beberapa jenis akhiran spesifik sumber daya - misalnya, rg untuk "grup sumber daya". Variabel lingkungan berikut menggunakan pola ini. Ganti nilai UNIQUE_VALUE tempat penampung dan LOCATION dengan nilai Anda sendiri lalu jalankan perintah berikut di terminal Anda:

export UNIQUE_VALUE=<your unique value, such as ejb010717>
export RESOURCE_GROUP_NAME=${UNIQUE_VALUE}rg
export LOCATION=<your desired Azure region for deploying your resources - for example, northeurope>
export REGISTRY_NAME=${UNIQUE_VALUE}reg
export DB_SERVER_NAME=${UNIQUE_VALUE}db
export DB_NAME=demodb
export CLUSTER_NAME=${UNIQUE_VALUE}aks
export AKS_NS=${UNIQUE_VALUE}ns

Membuat Server Fleksibel Azure Database for PostgreSQL

Server Fleksibel (Pratinjau) Azure Database for PostgreSQL adalah layanan database terkelola sepenuhnya yang dirancang untuk memberikan kontrol dan fleksibilitas yang lebih terperinci atas fungsi manajemen database dan pengaturan konfigurasi. Bagian ini memperlihatkan kepada Anda cara membuat instans Azure Database for PostgreSQL Flexible Server menggunakan Azure CLI.

Pertama, buat grup sumber daya untuk berisi server database dan sumber daya lainnya dengan menggunakan perintah berikut:

az group create \
    --name $RESOURCE_GROUP_NAME \
    --location $LOCATION

Selanjutnya, buat instans server fleksibel Azure Database for PostgreSQL dengan menggunakan perintah berikut:

az postgres flexible-server create \
    --name $DB_SERVER_NAME \
    --database-name $DB_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --public-access 0.0.0.0 \
    --sku-name Standard_B1ms \
    --tier Burstable \
    --active-directory-auth Enabled \
    --yes

Dibutuhkan beberapa menit untuk membuat server, database, pengguna admin, dan aturan firewall. Jika perintah berhasil, output terlihat mirip dengan contoh berikut:

{
  "connectionString": "postgresql://REDACTED@ejb011212qdb.postgres.database.azure.com/demodb?sslmode=require",
  "databaseName": "demodb",
  "firewallName": "AllowAllAzureServicesAndResourcesWithinAzureIps_2024-12-12_14-30-22",
  "host": "ejb011212qdb.postgres.database.azure.com",
  "id": "/subscriptions/c7844e91-b11d-4a7f-ac6f-996308fbcdb9/resourceGroups/ejb011211sfi/providers/Microsoft.DBforPostgreSQL/flexibleServers/ejb011212qdb",
  "location": "East US 2",
  "password": "REDACTED",
  "resourceGroup": "ejb011211sfi",
  "skuname": "Standard_B1ms",
  "username": "sorrycamel2",
  "version": "16"
}

Menguji aplikasi secara lokal dengan Server Fleksibel Azure Database for PostgreSQL

Di bagian sebelumnya, Anda menguji aplikasi Quarkus secara lokal dalam mode pengembangan dengan database PostgreSQL yang disediakan sebagai kontainer Docker. Sekarang, uji koneksi ke instans Azure Database for PostgreSQL Flexible Server secara lokal.

Pertama, tambahkan pengguna yang masuk saat ini sebagai Admin Microsoft Entra ke instans Server Fleksibel Azure Database for PostgreSQL dengan menggunakan perintah berikut:

ENTRA_ADMIN_NAME=$(az account show --query user.name --output tsv)
az postgres flexible-server ad-admin create \
    --resource-group $RESOURCE_GROUP_NAME \
    --server-name $DB_SERVER_NAME \
    --display-name $ENTRA_ADMIN_NAME \
    --object-id $(az ad signed-in-user show --query id --output tsv)

Output yang berhasil adalah objek JSON termasuk properti "type": "Microsoft.DBforPostgreSQL/flexibleServers/administrators".

Selanjutnya, tambahkan alamat IP lokal ke aturan firewall instans Azure Database for PostgreSQL Flexible Server dengan mengikuti langkah-langkah berikut:

  1. Dapatkan alamat IP lokal komputer tempat Anda menjalankan aplikasi Quarkus secara lokal. Misalnya, kunjungi https://whatismyipaddress.com untuk mendapatkan alamat IP v4 publik Anda.

  2. Tentukan variabel lingkungan dengan alamat IP lokal yang Anda dapatkan di langkah sebelumnya.

    export AZ_LOCAL_IP_ADDRESS=<your local IP address>
    
  3. Jalankan perintah berikut untuk menambahkan alamat IP lokal ke aturan firewall instans Server Fleksibel Azure Database for PostgreSQL:

    az postgres flexible-server firewall-rule create \
        --resource-group $RESOURCE_GROUP_NAME \
        --name $DB_SERVER_NAME \
        --rule-name $DB_SERVER_NAME-database-allow-local-ip \
        --start-ip-address $AZ_LOCAL_IP_ADDRESS \
        --end-ip-address $AZ_LOCAL_IP_ADDRESS
    

Kemudian, atur variabel lingkungan berikut di terminal Anda sebelumnya. Variabel lingkungan ini digunakan untuk menyambungkan ke instans Server Fleksibel Azure Database for PostgreSQL dari aplikasi Quarkus yang berjalan secara lokal:

export AZURE_POSTGRESQL_HOST=${DB_SERVER_NAME}.postgres.database.azure.com
export AZURE_POSTGRESQL_PORT=5432
export AZURE_POSTGRESQL_DATABASE=${DB_NAME}
export AZURE_POSTGRESQL_USERNAME=${ENTRA_ADMIN_NAME}

Catatan

Nilai variabel AZURE_POSTGRESQL_HOSTlingkungan , , AZURE_POSTGRESQL_PORT, AZURE_POSTGRESQL_DATABASEdan AZURE_POSTGRESQL_USERNAME dibaca oleh Properti konfigurasi database yang ditentukan dalam file src/main/resources/application.properties yang diperkenalkan di bagian sebelumnya. Nilai-nilai ini secara otomatis disuntikkan ke dalam aplikasi saat runtime menggunakan ekstensi tanpa kata sandi Konektor Layanan saat Anda menyebarkan aplikasi Quarkus ke kluster AKS nanti di artikel ini.

Sekarang, jalankan aplikasi Quarkus secara lokal untuk menguji koneksi ke instans Server Fleksibel Azure Database for PostgreSQL. Gunakan perintah berikut untuk memulai aplikasi dalam mode produksi:

quarkus build
java -jar target/quarkus-app/quarkus-run.jar

Catatan

Jika aplikasi gagal memulai dengan pesan kesalahan yang mirip ERROR [org.hib.eng.jdb.spi.SqlExceptionHelper] (JPA Startup Thread) Acquisition timeout while waiting for new connectiondengan , kemungkinan besar karena pengaturan jaringan komputer lokal Anda. Coba pilih Tambahkan alamat IP klien saat ini dari portal Azure lagi. Untuk informasi selengkapnya, lihat bagian Membuat aturan firewall setelah server dibuat di Membuat dan mengelola aturan firewall untuk Azure Database for PostgreSQL - Server Fleksibel menggunakan portal Azure. Sekarang, jalankan aplikasi lagi.

Buka browser web baru untuk http://localhost:8080 mengakses aplikasi Todo. Anda akan melihat aplikasi Todo, terlihat mirip dengan apa yang Anda lihat saat menjalankan aplikasi secara lokal dalam mode pengembangan.

Buat instans Azure Container Registry

Karena Quarkus adalah teknologi asli cloud, Quarkus memiliki dukungan bawaan untuk membuat kontainer yang berjalan di Kubernetes. Kubernetes sepenuhnya bergantung pada memiliki registri kontainer tempat kubernetes menemukan gambar kontainer untuk dijalankan. AKS memiliki dukungan bawaan untuk Azure Container Registry.

Gunakan perintah az acr create untuk membuat instans registri kontainer. Contoh berikut membuat instans registri kontainer bernama dengan nilai variabel ${REGISTRY_NAME}lingkungan Anda :

az acr create \
    --resource-group $RESOURCE_GROUP_NAME \
    --location ${LOCATION} \
    --name $REGISTRY_NAME \
    --sku Basic

Setelah beberapa saat, Anda akan melihat output JSON yang berisi baris berikut:

  "provisioningState": "Succeeded",
  "publicNetworkAccess": "Enabled",
  "resourceGroup": "<YOUR_RESOURCE_GROUP>",

Dapatkan server masuk untuk instans Container Registry dengan menggunakan perintah berikut:

export LOGIN_SERVER=$(az acr show \
    --name $REGISTRY_NAME \
    --query 'loginServer' \
    --output tsv)
echo $LOGIN_SERVER

Menyambungkan docker Anda ke instans registri kontainer

Masuk ke instans registri kontainer. Masuk memungkinkan Anda mendorong gambar. Gunakan perintah berikut untuk masuk ke registri:

az acr login --name $REGISTRY_NAME

Jika Anda berhasil masuk ke instans registri kontainer, Anda akan melihat Login Succeeded di akhir output perintah.

Membuat kluster AKS

Gunakan perintah az aks create untuk membuat kluster AKS. Contoh berikut membuat kluster bernama dengan nilai variabel ${CLUSTER_NAME} lingkungan Anda dengan satu simpul. Kluster terhubung ke instans registri kontainer yang Anda buat di langkah sebelumnya. Perintah ini memerlukan waktu 2-3 menit untuk diselesaikan. Kluster dimulai dengan identitas terkelola diaktifkan. Langkah ini diperlukan untuk koneksi database tanpa kata sandi.

az aks create \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --attach-acr $REGISTRY_NAME \
    --node-count 1 \
    --generate-ssh-keys \
    --enable-managed-identity

Setelah beberapa menit, perintah menyelesaikan dan mengembalikan informasi berformat JSON tentang kluster, termasuk output berikut:

  "nodeResourceGroup": "MC_<your resource_group_name>_<your cluster name>_<your region>",
  "privateFqdn": null,
  "provisioningState": "Succeeded",
  "resourceGroup": "<your resource group name>",

Menyambungkan ke kluster AKS

Untuk mengelola kluster Kube, gunakan kubectl, klien baris perintah Kube. Untuk menginstal kubectl secara lokal, gunakan perintah az aks install-cli , seperti yang ditunjukkan dalam contoh berikut:

az aks install-cli

Untuk informasi selengkapnya tentang kubectl, lihat Alat baris perintah (kubectl) dalam dokumentasi Kubernetes.

Untuk mengonfigurasi kubectl untuk terhubung ke kluster Kubernetes, gunakan perintah az aks get-credentials , seperti yang ditunjukkan pada contoh berikut. Perintah ini mengunduh informasi masuk dan mengonfigurasi CLI Kube untuk menggunakannya.

az aks get-credentials \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --overwrite-existing \
    --admin

Output yang berhasil mencakup teks yang mirip dengan contoh berikut:

Merged "ejb010718aks-admin" as current context in /Users/edburns/.kube/config

Anda mungkin merasa berguna untuk alias k ke kubectl. Jika demikian, gunakan perintah berikut:

alias k=kubectl

Untuk memverifikasi koneksi ke kluster Anda, gunakan kubectl get perintah untuk mengembalikan daftar node kluster, seperti yang ditunjukkan dalam contoh berikut:

kubectl get nodes

Contoh output berikut menunjukkan satu simpul yang dibuat pada langkah sebelumnya. Pastikan bahwa status simpul Siap:

NAME                                STATUS   ROLES   AGE     VERSION
aks-nodepool1-xxxxxxxx-yyyyyyyyyy   Ready    agent   76s     v1.28.9

Membuat namespace baru di AKS

Gunakan perintah berikut untuk membuat namespace baru di layanan Kubernetes untuk aplikasi Quarkus Anda:

kubectl create namespace ${AKS_NS}

Output akan terlihat seperti contoh berikut:

namespace/<your namespace> created

Membuat koneksi layanan di AKS dengan Konektor Layanan

Di bagian ini, Anda membuat koneksi layanan antara kluster AKS dan Server Fleksibel Azure Database for PostgreSQL menggunakan ID Beban Kerja Microsoft Entra dengan Konektor Layanan. Koneksi ini memungkinkan kluster AKS mengakses Server Fleksibel Azure Database for PostgreSQL tanpa menggunakan autentikasi SQL.

Jalankan perintah berikut untuk membuat koneksi antara kluster AKS dan database PostgreSQL menggunakan ID Beban Kerja Microsoft Entra dengan Konektor Layanan:

# Register the Service Connector and Kubernetes Configuration resource providers
az provider register --namespace Microsoft.ServiceLinker --wait
az provider register --namespace Microsoft.KubernetesConfiguration --wait

# Install the Service Connector passwordless extension
az extension add --name serviceconnector-passwordless --upgrade --allow-preview true

# Retrieve the AKS cluster and Azure SQL Server resource IDs
export AKS_CLUSTER_RESOURCE_ID=$(az aks show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $CLUSTER_NAME \
    --query id \
    --output tsv)
export AZURE_POSTGRESQL_RESOURCE_ID=$(az postgres flexible-server show \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_SERVER_NAME \
    --query id \
    --output tsv)

# Create a user-assigned managed identity used for workload identity
export USER_ASSIGNED_IDENTITY_NAME=workload-identity-uami
az identity create \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME}

# Retrieve the user-assigned managed identity resource ID
export UAMI_RESOURCE_ID=$(az identity show \
    --resource-group ${RESOURCE_GROUP_NAME} \
    --name ${USER_ASSIGNED_IDENTITY_NAME} \
    --query id \
    --output tsv)

# Create a service connection between your AKS cluster and your PostgreSQL database using Microsoft Entra Workload ID
az aks connection create postgres-flexible \
    --connection akspostgresconn \
    --kube-namespace $AKS_NS \
    --source-id $AKS_CLUSTER_RESOURCE_ID \
    --target-id $AZURE_POSTGRESQL_RESOURCE_ID/databases/$DB_NAME \
    --workload-identity $UAMI_RESOURCE_ID

Kehadiran JSON berikut dalam output dari perintah akhir dalam langkah-langkah sebelumnya menunjukkan keberhasilan penginstalan konektor layanan:

"name": "akspostgresconn",
"provisioningState": "Succeeded",

Catatan

Sebaiknya gunakan ID Beban Kerja Microsoft Entra untuk akses aman ke Server Fleksibel Azure Database for PostgreSQL Anda tanpa menggunakan autentikasi nama pengguna/kata sandi. Jika Anda perlu menggunakan autentikasi nama pengguna/kata sandi, abaikan langkah-langkah sebelumnya di bagian ini dan gunakan nama pengguna dan kata sandi untuk menyambungkan ke database.

Mendapatkan akun layanan dan rahasia yang dibuat oleh Konektor Layanan

Untuk mengautentikasi ke Server Fleksibel Azure Database for PostgreSQL, Anda perlu mendapatkan akun layanan dan rahasia Kubernetes yang dibuat oleh Konektor Layanan. Ikuti instruksi di bagian Perbarui kontainer Anda di Tutorial: Menyambungkan aplikasi AKS ke Azure SQL Database. Ambil opsi Buat penyebaran secara langsung menggunakan cuplikan kode sampel YAML yang disediakan dan gunakan langkah-langkah berikut:

  • Dari bagian yang disorot dalam sampel YAML penyebaran Kubernetes, salin nilai serviceAccountName dan secretRef.name, yang diwakili sebagai <service-account-name> dan <secret-name> dalam contoh berikut:

    serviceAccountName: <service-account-name>
    containers:
    - name: raw-linux
        envFrom:
           - secretRef:
              name: <secret-name>
    

    Nilai-nilai ini digunakan di bagian berikutnya untuk menyebarkan aplikasi Quarkus ke kluster AKS.

Mengkustomisasi konfigurasi cloud native

Sebagai teknologi asli cloud, Quarkus menawarkan kemampuan untuk mengonfigurasi sumber daya secara otomatis untuk Kubernetes standar, Red Hat OpenShift, dan Knative. Untuk informasi selengkapnya, lihat panduan Kubernetes Quarkus, panduan Quarkus OpenShift, dan panduan Knative Quarkus. Pengembang dapat menyebarkan aplikasi ke kluster Kubernetes target dengan menerapkan manifes yang dihasilkan.

Untuk menghasilkan sumber daya Kubernetes yang sesuai, gunakan perintah berikut untuk menambahkan quarkus-kubernetes ekstensi dan container-image-jib di terminal lokal Anda:

quarkus ext add kubernetes container-image-jib

Quarkus memodifikasi POM untuk memastikan ekstensi ini terdaftar sebagai <dependencies>. Jika diminta untuk menginstal sesuatu yang disebut JBang, jawab ya dan izinkan untuk diinstal.

Output akan terlihat seperti contoh berikut:

[SUCCESS] ✅  Extension io.quarkus:quarkus-kubernetes has been installed
[SUCCESS] ✅  Extension io.quarkus:quarkus-container-image-jib has been installed

Untuk memverifikasi ekstensi ditambahkan, Anda dapat menjalankan git diff dan memeriksa output.

Sebagai teknologi asli cloud, Quarkus mendukung gagasan profil konfigurasi. Quarkus memiliki tiga profil bawaan berikut:

  • dev - Diaktifkan saat dalam mode pengembangan
  • test - Diaktifkan saat menjalankan pengujian
  • prod - Profil default saat tidak berjalan dalam mode pengembangan atau pengujian

Quarkus mendukung sejumlah profil bernama, sesuai kebutuhan.

Langkah-langkah yang tersisa di bagian ini mengarahkan Anda untuk menyesuaikan nilai dalam file src/main/resources/application.properties .

prod. Awalan menunjukkan bahwa properti ini aktif saat berjalan di prod profil. Untuk informasi selengkapnya tentang profil konfigurasi, lihat dokumentasi Quarkus.

Konfigurasi database

Periksa variabel konfigurasi database berikut. Properti %prod.quarkus.datasource.jdbc.url terkait koneksi database dan %prod.quarkus.datasource.username nilai baca dari variabel AZURE_POSTGRESQL_HOSTlingkungan , , AZURE_POSTGRESQL_PORTAZURE_POSTGRESQL_DATABASE, dan AZURE_POSTGRESQL_USERNAME, masing-masing. Variabel lingkungan ini memetakan ke nilai rahasia yang menyimpan informasi koneksi database. Untuk alasan keamanan, ekstensi ini dibuat secara otomatis menggunakan ekstensi tanpa kata sandi Konektor Layanan seperti yang ditunjukkan di tempat lain dalam artikel ini.

# Database configurations
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://${AZURE_POSTGRESQL_HOST}:${AZURE_POSTGRESQL_PORT}/${AZURE_POSTGRESQL_DATABASE}?\
authenticationPluginClassName=com.azure.identity.extensions.jdbc.postgresql.AzurePostgresqlAuthenticationPlugin\
&sslmode=require
%prod.quarkus.datasource.username=${AZURE_POSTGRESQL_USERNAME}
%prod.quarkus.datasource.jdbc.acquisition-timeout=10
%prod.quarkus.hibernate-orm.database.generation=drop-and-create
%prod.quarkus.hibernate-orm.sql-load-script=import.sql

Konfigurasi Kubernetes

Periksa variabel konfigurasi Kubernetes berikut. service-type diatur ke load-balancer untuk mengakses aplikasi secara eksternal. Ganti nilai <service-account-name> dan <secret-name> dengan nilai nilai aktual yang Anda salin di bagian sebelumnya.

# Kubernetes configurations
%prod.quarkus.kubernetes.deployment-target=kubernetes
%prod.quarkus.kubernetes.service-type=load-balancer
%prod.quarkus.kubernetes.labels."azure.workload.identity/use"=true
%prod.quarkus.kubernetes.service-account=<service-account-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_CLIENT_ID.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_CLIENT_ID.with-key=AZURE_POSTGRESQL_CLIENTID
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_HOST.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_HOST.with-key=AZURE_POSTGRESQL_HOST
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_PORT.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_PORT.with-key=AZURE_POSTGRESQL_PORT
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_DATABASE.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_DATABASE.with-key=AZURE_POSTGRESQL_DATABASE
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_USERNAME.from-secret=<secret-name>
%prod.quarkus.kubernetes.env.mapping.AZURE_POSTGRESQL_USERNAME.with-key=AZURE_POSTGRESQL_USERNAME

Konfigurasi Kubernetes lainnya menentukan pemetaan nilai rahasia ke variabel lingkungan dalam aplikasi Quarkus. <secret-name> Rahasia berisi informasi koneksi database. Tombol AZURE_POSTGRESQL_CLIENTID, , AZURE_POSTGRESQL_PORTAZURE_POSTGRESQL_HOST, AZURE_POSTGRESQL_DATABASE, dan AZURE_POSTGRESQL_USERNAME dalam peta rahasia ke AZURE_CLIENT_IDvariabel lingkungan , , AZURE_POSTGRESQL_HOSTAZURE_POSTGRESQL_PORT, AZURE_POSTGRESQL_DATABASE, dan AZURE_POSTGRESQL_USERNAME masing-masing.

Untuk memeriksa rahasia secara langsung dengan kubectl, gunakan perintah yang mirip dengan contoh berikut:

kubectl -n ${AKS_NS} get secret <secret-name> -o jsonpath="{.data.AZURE_POSTGRESQL_USERNAME}" | base64 --decode

Konfigurasi gambar kontainer

Sebagai teknologi asli cloud, Quarkus mendukung pembuatan gambar kontainer OCI yang kompatibel dengan Docker. Ganti nilai <LOGIN_SERVER_VALUE> dengan nilai ${LOGIN_SERVER} aktual variabel lingkungan.

# Container Image Build
%prod.quarkus.container-image.build=true
%prod.quarkus.container-image.image=<LOGIN_SERVER_VALUE>/todo-quarkus-aks:1.0

Sebagai pemeriksaan akhir, ketika Anda menyelesaikan semua substitusi yang diperlukan dalam application.properties, tidak boleh ada kemunculan < karakter. Jika ada, periksa kembali apakah Anda menyelesaikan semua substitusi yang diperlukan.

Buat gambar kontainer dan dorong ke registri kontainer

Sekarang, gunakan perintah berikut untuk membangun aplikasi itu sendiri. Perintah ini menggunakan ekstensi Kubernetes dan Jib untuk membangun gambar kontainer.

quarkus build --no-tests

Output harus diakhir dengan BUILD SUCCESS. File manifes Kubernetes dihasilkan dalam target/kubernetes, seperti yang ditunjukkan pada contoh berikut:

tree target/kubernetes
target/kubernetes
├── kubernetes.json
└── kubernetes.yml

0 directories, 2 files

Anda dapat memverifikasi apakah gambar kontainer dihasilkan juga menggunakan docker baris perintah (CLI). Output terlihat mirip dengan contoh berikut:

docker images | grep todo-quarkus-aks
<LOGIN_SERVER_VALUE>/todo-quarkus-aks   1.0       b13c389896b7   18 minutes ago   422MB

Dorong gambar kontainer ke registri kontainer dengan menggunakan perintah berikut:

export TODO_QUARKUS_TAG=$(docker images | grep todo-quarkus-aks | head -n1 | cut -d " " -f1)
echo ${TODO_QUARKUS_TAG}
docker push ${TODO_QUARKUS_TAG}:1.0

Output akan terlihat mirip dengan contoh berikut:

The push refers to repository [<LOGIN_SERVER_VALUE>/todo-quarkus-aks]
dfd615499b3a: Pushed
56f5cf1aa271: Pushed
4218d39b228e: Pushed
b0538737ed64: Pushed
d13845d85ee5: Pushed
60609ec85f86: Pushed
1.0: digest: sha256:0ffd70d6d5bb3a4621c030df0d22cf1aa13990ca1880664d08967bd5bab1f2b6 size: 1995

Sekarang setelah Anda mendorong aplikasi ke registri kontainer, Anda dapat memberi tahu AKS untuk menjalankan aplikasi.

Menyebarkan aplikasi Quarkus ke AKS

Langkah-langkah di bagian ini memperlihatkan kepada Anda cara menjalankan aplikasi sampel Quarkus pada sumber daya Azure yang Anda buat.

Gunakan kubectl apply untuk menyebarkan aplikasi Quarkus ke AKS

Sebarkan sumber daya Kubernetes menggunakan kubectl pada baris perintah, seperti yang ditunjukkan dalam contoh berikut:

kubectl apply -f target/kubernetes/kubernetes.yml -n ${AKS_NS}

Output akan terlihat seperti contoh berikut:

service/quarkus-todo-demo-app-aks created
deployment.apps/quarkus-todo-demo-app-aks created

Verifikasi bahwa aplikasi berjalan dengan menggunakan perintah berikut:

kubectl -n $AKS_NS get pods

Jika nilai STATUS bidang menunjukkan apa pun selain Running, pecahkan masalah dan atasi masalah sebelum melanjutkan. Ini mungkin membantu memeriksa log pod dengan menggunakan perintah berikut:

kubectl -n $AKS_NS logs $(kubectl -n $AKS_NS get pods | grep quarkus-todo-demo-app-aks | cut -d " " -f1)

EXTERNAL-IP Dapatkan untuk mengakses aplikasi Todo dengan menggunakan perintah berikut:

kubectl get svc -n ${AKS_NS}

Output akan terlihat seperti contoh berikut:

NAME                        TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)        AGE
quarkus-todo-demo-app-aks   LoadBalancer   10.0.236.101   20.12.126.200   80:30963/TCP   37s

Anda dapat menggunakan perintah berikut untuk menyimpan nilai EXTERNAL-IP ke variabel lingkungan sebagai URL yang sepenuhnya memenuhi syarat:

export QUARKUS_URL=http://$(kubectl get svc -n ${AKS_NS} | grep quarkus-todo-demo-app-aks | cut -d " " -f10)
echo $QUARKUS_URL

Buka browser web baru ke nilai ${QUARKUS_URL}. Kemudian, tambahkan item todo baru dengan teks Deployed the Todo app to AKS. Selain itu Introduction to Quarkus Todo App , pilih item sebagai selesai.

Cuplikan layar aplikasi sampel Todo yang berjalan di AKS.

Akses RESTful API (/api) untuk mendapatkan semua item todo yang disimpan dalam database Azure PostgreSQL, seperti yang ditunjukkan dalam contoh berikut:

curl --verbose ${QUARKUS_URL}/api | jq .

Output akan terlihat seperti contoh berikut:

* Connected to 20.237.68.225 (20.237.68.225) port 80 (#0)
> GET /api HTTP/1.1
> Host: 20.237.68.225
> User-Agent: curl/7.88.1
> Accept: */*
>
< HTTP/1.1 200 OK
< content-length: 828
< Content-Type: application/json;charset=UTF-8
<
[
  {
    "id": 2,
    "title": "Quarkus on Azure App Service",
    "completed": false,
    "order": 1,
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "id": 3,
    "title": "Quarkus on Azure Container Apps",
    "completed": false,
    "order": 2,
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "id": 4,
    "title": "Quarkus on Azure Functions",
    "completed": false,
    "order": 3,
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "id": 5,
    "title": "Deployed the Todo app to AKS",
    "completed": false,
    "order": 5,
    "url": null
  },
  {
    "id": 1,
    "title": "Introduction to Quarkus Todo App",
    "completed": true,
    "order": 0,
    "url": null
  }
]

Verifikasi bahwa database diperbarui

Jalankan perintah berikut untuk memverifikasi bahwa database sekarang diperbarui dengan benar:

ACCESS_TOKEN=$(az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken)
az postgres flexible-server execute \
    --admin-user $ENTRA_ADMIN_NAME \
    --admin-password $ACCESS_TOKEN \
    --name $DB_SERVER_NAME \
    --database-name $DB_NAME \
    --querytext "select * from todo;"

Jika Anda diminta untuk menginstal ekstensi, jawab Y.

Output akan terlihat mirip dengan contoh berikut, dan harus menyertakan item yang sama dalam GUI aplikasi Todo dan output curl perintah sebelumnya:

Successfully connected to <DB_SERVER_NAME>.
Ran Database Query: 'select * from todo;'
Retrieving first 30 rows of query output, if applicable.
Closed the connection to <DB_SERVER_NAME>
[
  {
    "completed": false,
    "id": 2,
    "ordering": 1,
    "title": "Quarkus on Azure App Service",
    "url": "https://learn.microsoft.com/en-us/azure/developer/java/eclipse-microprofile/deploy-microprofile-quarkus-java-app-with-maven-plugin"
  },
  {
    "completed": false,
    "id": 3,
    "ordering": 2,
    "title": "Quarkus on Azure Container Apps",
    "url": "https://learn.microsoft.com/en-us/training/modules/deploy-java-quarkus-azure-container-app-postgres/"
  },
  {
    "completed": false,
    "id": 4,
    "ordering": 3,
    "title": "Quarkus on Azure Functions",
    "url": "https://learn.microsoft.com/en-us/azure/azure-functions/functions-create-first-quarkus"
  },
  {
    "completed": false,
    "id": 5,
    "ordering": 5,
    "title": "Deployed the Todo app to AKS",
    "url": null
  },
  {
    "completed": true,
    "id": 1,
    "ordering": 0,
    "title": "Introduction to Quarkus Todo App",
    "url": null
  }
]

Setelah selesai, hapus aturan firewall yang memungkinkan alamat IP lokal Anda mengakses instans Server Fleksibel Azure Database for PostgreSQL dengan menggunakan perintah berikut:

az postgres flexible-server firewall-rule delete \
    --resource-group $RESOURCE_GROUP_NAME \
    --name $DB_SERVER_NAME \
    --rule-name $DB_SERVER_NAME-database-allow-local-ip \
    --yes

Membersihkan sumber daya

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

git reset --hard
docker rmi ${TODO_QUARKUS_TAG}:1.0
docker rmi postgres
az identity delete --ids ${UAMI_RESOURCE_ID}
az group delete --name $RESOURCE_GROUP_NAME --yes --no-wait

Anda mungkin juga ingin menggunakan docker rmi untuk menghapus gambar postgres kontainer dan testcontainers dihasilkan oleh mode pengembangan Quarkus.

Langkah berikutnya