将Spring Boot自定义容器映像部署到Azure Container Apps(ACA):使用GraalVM生成本地映像

将Spring Boot自定义容器映像部署到Azure Container Apps(ACA):使用GraalVM本机映像。

你好,我是株式会社船井総研デジタル的员工 @fsdg-adachi_h 。今天我将介绍在Azure Container Apps环境中,使用GraalVM生成本地镜像的Spring Boot Web应用程序,并将其作为容器启动的方法。

spring-boot_graalvm_on_azure-container-apps.png

目标

我将在Windows 11上使用Linux进行云开发。

您可以在这里查看文章列表。

 

实现

将GraalVM原生映像的Spring Boot Web应用程序部署到Microsoft Azure Container Apps (ACA)的自定义容器映像中。

以原生图像格式启动应用程序容器

要素概要terminalターミナルAzureクラウド環境Azure Container Appsコンテナ実行環境app-hello-spring-boot-nativeカスタムコンテナappネイティブイメージ アプリケーションtomcatWeb サーバー
在本文章中,我们使用了Docker Hub上的公开可访问的自定义容器镜像。在实际的系统开发中,获取容器镜像的注册表可能会有所不同,请适时确认。

技术话题

Microsoft Azure 容器化应用(ACA)是什么?

请查看以下内容。Microsoft Azure容器应用(ACA)

这是一个在Azure上运行的容器应用平台。
ACA支持Docker容器和Kubernetes集群环境,开发人员可以创建容器镜像,并将其部署为Kubernetes资源。此外,ACA支持自定义域名,可以保持公司品牌的一致性。

优点
说明

简单的设置和部署
ACA具有简单的用户界面,只需点击几次即可设置和部署容器应用。

可扩展性
ACA可以自动进行扩展。当应用程序所需的资源增加时,ACA会自动添加所需的资源并分散处理。

安全性
ACA提供了在运行容器应用时所需的安全功能。例如,与Azure Active Directory的集成以及容器级的访问控制等。

成本效益
ACA在需要时添加所需资源,可以将无用资源的使用降至最低。此外,只需支付所需资源的费用,可以以成本有效的方式使用。

开发环境

    Windows 11 Home 22H2 を使用しています。
由于操作 WSL 的 Ubuntu,请参考 macOS 上的操作方法。
WSL(Microsoft Store应用版)* 您可以从此相关文章中了解安装方法
> wsl –version
WSL版本:1.0.3.0
内核版本:5.15.79.1
WSLg版本:1.0.47Ubuntu* 您可以从此相关文章中了解安装方法
$ lsb_release -a
没有可用的LSB模块。
发行商ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
版本:22.04

Java JDK* 您可以从此相关文章中了解安装方法
$ java -version
openjdk版本:”17.0.6″ 2023-01-17
OpenJDK运行时环境GraalVM CE 22.3.1(构建 17.0.6+10-jvmci-22.3-b13)
OpenJDK 64位服务器VM GraalVM CE 22.3.1(构建 17.0.6+10-jvmci-22.3-b13,混合模式,共享)

Maven* 您可以从此相关文章中了解安装方法
$ mvn -version
Apache Maven 3.6.3
Maven主页:/usr/share/maven
Java版本:11.0.18,供应商:Ubuntu,运行时:/usr/lib/jvm/java-11-openjdk-amd64

Docker* 您可以从此相关文章中了解安装方法
$ docker –version
Docker版本23.0.1,构建a5ee5b1

Azure CLI* 您可以从此相关文章中了解安装方法
$ az –version
azure-cli 2.45.0
core 2.45.0
telemetry 1.0.8

在这篇文章中,我们基本上会在Ubuntu的终端上进行操作。为了帮助初次学习如何使用Vim进行复制粘贴的人,以下文章介绍了步骤。请务必尝试一下。

 

创建Web应用程序的规范

NoエンドポイントHTTPメソッドMIME タイプ1/api/dataGETapplication/json

显示”Hello World”的步骤

创建Spring Boot Web服务

您可以在本关联文章中确认步骤。

 

通过这些步骤,我们成功地在本地环境的 Docker 上构建了应用程序的自定义容器镜像。

移动至项目文件夹。

将目录切换至项目文件夹。
※ 以 ~/tmp/hello-spring-boot 为项目文件夹。

$ cd ~/tmp/hello-spring-boot

确认容器镜像

启动Docker守护进程。

$ sudo service docker start
 * Starting Docker: docker      [ OK ]

我会检查容器镜像。

$ docker images | grep app-hello-spring-boot-native
app-hello-spring-boot-native   latest     f0794df4d28c   23 minutes ago   149MB

将容器镜像注册到Docker Hub。

登录Docker Hub。

$ docker login
Login Succeeded

给容器镜像打上标签。

在这里,$USER 嵌入变量指的是 Ubuntu 的 shell 变量 USER。也就是说,当将自定义容器镜像推送到 Docker Hub 时,指定的帐户名称和 Ubuntu 用户名相同,可以使镜像的处理变得简单。然而,这种方法仅限于验证目的。
$ docker tag app-hello-spring-boot-native:latest \
    $USER/app-hello-spring-boot-native:latest

将容器映像推送到Docker Hub。

$ docker push $USER/app-hello-spring-boot-native:latest
通过这些步骤,您可以将名为 $USER/app-hello-spring-boot-native:latest 的自定义容器镜像推送到 Docker Hub。

创建Shell变量

作为Shell变量,在Ubuntu中创建以下值。根据情况,可能需要更改容器应用的名称。
location_name=japaneast
resource_group_name=rg-hello
containerapp_env_name=cae-hello
containerapp_name=ca-hello-spring-boot-native
container_image_name=app-hello-spring-boot-native:latest

登入Azure环境

以下是一篇解释从相关文章继续的步骤的文章。

 

使用 Azure CLI 进行登录。

$ az login

蔚藍環境

资源组

创建资源组。

$ az group create \
    --name $resource_group_name \
    --location $location_name

容器应用环境

创建容器应用环境。
※ 由于基于Kubernetes基础设施,所以可能需要一些时间。

$ az containerapp env create \
    --resource-group $resource_group_name \
    --name $containerapp_env_name \
    --location $location_name

容器应用程序

进行容器应用的创建和部署。

$ az containerapp create \
    --resource-group $resource_group_name \
    --environment $containerapp_env_name \
    --name $containerapp_name \
    --image $USER/$container_image_name \
    --target-port 8080 \
    --ingress 'external' \
    --min-replicas 0
— 将“min-replicas”设置为0,当应用程序在300秒内没有访问时,将进入零缩放状态。
如果要删除容器应用程序,请执行以下命令:
$ az containerapp delete \
–resource-group $resource_group_name \
–name $containerapp_name

将容器应用的FQDN作为shell变量containerapp_fqdn获取。

$ containerapp_fqdn=$(az containerapp show \
    --resource-group $resource_group_name \
    --name $containerapp_name \
    --query 'properties.configuration.ingress.fqdn' \
    --output tsv)

确认容器应用的FQDN。

$ set | grep containerapp_fqdn
containerapp_fqdn=ca-hello-spring-boot-native.wonderfuldune-033c35fb.japaneast.awesomecontainerapps.io

在中国称为“Azure门户”的验证

image.png
在之前的工作中,我們成功將容器應用部署到了Azure容器化應用程式平台。

验证容器的运行

从终端使用curl命令进行确认。

$ curl https://$containerapp_fqdn/api/data -w '\ntime_total: %{time_total}s\n'

完成(※省略time_total)

{"message":"Hello World!"}
在这个阶段的工作中,终端显示了{“message”:”你好,世界!”}的信息,并成功获取了JSON数据。

连接到容器

连接到容器应用程序

$ az containerapp exec \
    --resource-group $resource_group_name \
    --name $containerapp_name

连接到容器后,请确认目录。
※离开容器时按ctrl + D。

# pwd
/app
# ls -lah
total 67M
drwxr-xr-x 1 root root 4.0K Aug  2 09:18 .
drwxr-xr-x 1 root root 4.0K Aug  2 11:03 ..
-rwxr-xr-x 1 root root  67M Aug  2 09:16 app

使用top命令来检查当前情况。

top - 11:04:32 up 18:34,  0 users,  load average: 0.10, 0.18, 0.29
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.4 us,  1.0 sy,  0.0 ni, 96.5 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
MiB Mem :  15990.8 total,   4189.2 free,   2167.2 used,   9634.4 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  13467.9 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0 1396004  94288  48104 S   0.0   0.6   0:00.06 app
     24 root      20   0    2888    956    864 S   0.0   0.0   0:00.00 sh
     31 root      20   0    7316   3492   2928 R   0.0   0.0   0:00.00 top

以下是使用 top 命令显示 CPU 状况的情况。

top - 11:04:45 up 18:35,  0 users,  load average: 0.09, 0.17, 0.28
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu0  :  2.4 us,  0.3 sy,  0.0 ni, 97.3 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.7 us,  0.3 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  1.0 us,  0.0 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :  2.0 us,  0.3 sy,  0.0 ni, 97.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :  15990.8 total,   4192.7 free,   2163.4 used,   9634.7 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.  13471.7 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0 1396004  94288  48104 S   0.0   0.6   0:00.06 app
     24 root      20   0    2888    956    864 S   0.0   0.0   0:00.00 sh
     31 root      20   0    7316   3492   2928 R   0.0   0.0   0:00.00 top
可以确认Spring Boot正运行,但无需启动java命令,也就是不需要JVM。

我尝试展示容器的信息。

# cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=22.04
DISTRIB_CODENAME=jammy
DISTRIB_DESCRIPTION="Ubuntu 22.04.2 LTS"
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
这个容器是基于Ubuntu创建的,也就是说,可以像使用Ubuntu一样使用它。

表演的计量

容器环境 ɡqì

項目バージョンBase ImageUbuntu 22.04.2 LTSSpring Bootv3.0.4

容器资源的分配

項目設定値CPU コアの数0.5メモリ サイズ(Gi)1Gi

请求处理完成所需时间。

No状況リクエスト所要時間(秒)1デプロイ直後0.233591秒2連続して2回目0.175264秒3さらに3回目0.173258秒4スケールゼロ回復直後7.049757秒5連続して2回目0.209536秒6さらに3回目0.189759秒

日志流:显示启动时间的日志

状況アプリ起動時間(秒)デプロイ直後0.042秒スケールゼロ回復直後0.039秒
2023-08-02T10:44:27.514912040Z 2023-08-02T10:44:27.514Z  INFO 1 --- [           main] com.example.springboot.Application       : Started Application in 0.042 seconds (process running for 0.045)
2023-08-02T10:55:00.896887847Z 2023-08-02T10:55:00.896Z  INFO 1 --- [           main] com.example.springboot.Application       : Started Application in 0.039 seconds (process running for 0.042)

度量: CPU利用率

状況CPU使用率デプロイ後:ピーク値0.00101コアスケールゼロ回復後:ピーク値0.00095コア

度量:内存使用量

状況メモリ使用量デプロイ後:ピーク値54.7MBスケールゼロ回復後:ピーク値56.1MB
应用程序从零缩放状态恢复活跃后,您会注意到在处理请求之前会花费相当长的时间。然而,您可以通过设置–min-replicas 1来避免零缩放状态。

总结

我可以在Azure Container Apps环境中启动通过Dockerfile构建的GraalVM原生映像Spring Boot Web服务的自定义容器映像。

可以使用Maven、Docker和Azure CLI来从开发Spring Boot应用程序到创建容器映像,再到部署到Azure环境的整个过程都可以在终端上完成。通过这种方式,您可以提升在云端系统开发所需的技能和理解。即使是初学者也可以轻松地跟随步骤进行操作,请务必尝试一下。

您觉得怎么样?作为验证目的,您可以在 Azure Container Apps 环境中轻松启动 GraalVM 的本地映像 Spring Boot Web 应用程序作为容器。请务必试一试。我们将继续介绍 Azure 的开发环境等内容,请敬请期待。

相关文章

让我们与常规的自定义容器映像的部署进行比较!

 

广告
将在 10 秒后关闭
bannerAds