持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
如果你不熟悉Cloud-Agnostic Serverless(云无关)服务,那么为Serverless基础架构创建一个简单的应用程序是一个不错的起点。
在本文中,将完成创建你的第一个可在任何云上运行的Serverless Java 应用程序的步骤。
什么是Serverless?
与名称相反,Serverless中仍然存在服务器,但你无需担心管理它们。你只需要部署容器,Serverless基础架构负责为你的应用程序扩展或缩减资源,它会在有高需求时自动扩展,或者在没有需求时自动缩减至零。这将减少你在云上的开销。
你会创造什么?
您将使用 Quarkus 创建一个简单的 Java 应用程序,该应用程序向 HTTP 请求返回问候消息并将其部署到 Knative。
为什么选择 Knative?
一开始,Serverless应用程序通常由一小段代码组成,这些代码由云供应商运行。在第一阶段,应用程序有一些限制,并且与供应商库紧密耦合。
Knative 使开发人员能够在 Kubernetes 集群上运行Serverless应用程序。这使您可以灵活地在任何云、本地甚至混合所有应用程序上运行你的应用程序。
为什么选择Quarkus?
因为无服务器应用程序需要快速启动。
由于 Serverless 的最大优势是按需扩展和缩减(甚至为零),因此 serverless 应用程序在扩展时需要快速启动,否则请求将被拒绝。
Quarkus 应用程序的最大特点之一是它们的超快速启动。
此外,Quarkus 是Kubernetes Native,这意味着可以轻松地将 Quarkus 应用程序部署到 Kubernetes,而无需了解底层 Kubernetes 框架的复杂性。
要求
-
本地 Knative 安装。
- 本文使用 minikube 作为本地 Kubernetes 集群
-
kn已安装 CLI。 -
JDK 11+ 安装了适当配置的 JAVA_HOME
-
Apache Maven 3.8.1+
-
GraalVM(可选部署原生镜像)
创建 Quarkus 应用程序
注意: 如果您不想创建应用程序,您可以从GitHub克隆它并跳到将您的应用程序部署到 Knative
mvn io.quarkus.platform:quarkus-maven-plugin:2.11.2.Final:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=knative-serving-quarkus-demo
cd knative-serving-quarkus-demo
在本地运行您的应用程序
要验证您是否正确创建了项目,请通过运行以下命令在本地运行该项目:
mvn quarkus:dev
__ ____ __ _____ ___ __ ____ ______
--/ __ / / / / _ | / _ / //_/ / / / __/
-/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--________/_/ |_/_/|_/_/|_|____/___/
2022-08-15 16:50:25,135 INFO [io.quarkus] (Quarkus Main Thread) knative-serving-quarkus-demo 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.11.2.Final) started in 1.339s. Listening on: http://localhost:8080
2022-08-15 16:50:25,150 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2022-08-15 16:50:25,150 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy-reactive, smallrye-cont
在不同的终端窗口或浏览器中,您可以通过向http://localhost:8080/hello 发送请求来访问应用程序:
curl -X 'GET' 'http://localhost:8080/hello' -H 'accept: text/plain'
如果看到以下输出,则已成功创建应用程序:
Hello from RESTEasy Reactive
点击Ctrl+C停止应用程序。
准备将应用程序以部署到 Knative
添加所需的依赖项
将以下依赖项添加到pom.xml文件中:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-container-image-jib</artifactId>
</dependency>
配置应用程序以部署到 Knative
将以下配置添加到src/main/resources/application.properties文件中:
quarkus.kubernetes.deployment-target=knative
quarkus.container-image.group=dev.local/hbelmiro
注意: 在
quarkus.container-image.group属性中,替换hbelmiro为您的容器注册表用户名。
将应用程序部署到 Knative
启动 Minikube 隧道
注意: 仅当您使用 minikube 作为本地 Kubernetes 集群时,才需要执行此步骤。
在不同的终端窗口中,运行以下命令来启动 minikube 隧道:
minikube tunnel --profile knative
您应该会看到类似于以下内容的输出:
Status:
machine: knative
pid: 223762
route: 10.96.0.0/12 -> 192.168.49.2
minikube: Running
services: [kourier]
errors:
minikube: no errors
router: no errors
loadbalancer emulator: no errors
保持终端窗口打开并运行上述命令。
配置容器 CLI 以使用 Minikube 内的容器引擎
eval $(minikube -p knative docker-env)
部署应用程序
运行以下命令将应用程序部署到 Knative:
mvn clean package -Dquarkus.kubernetes.deploy=true
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Deploying to knative server: https://192.168.49.2:8443/ in namespace: default.
[INFO] [io.quarkus.kubernetes.deployment.KubernetesDeployer] Applied: Service knative-serving-quarkus-demo.
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 8952ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
检查 Knative 部署的服务
运行以下命令检查 Knative 部署的服务:
kn service list
将会在已部署的服务中看到您的应用程序,如下所示:
NAME URL LATEST AGE CONDITIONS READY REASON
knative-serving-quarkus-demo http://knative-serving-quarkus-demo.default.10.106.207.219.sslip.io knative-serving-quarkus-demo-00001 23s 3 OK / 3 True
提示:在上述输出中,检查应用程序的 READY 状态。如果状态不是
True,则需要等待应用准备好,否则部署有问题。
向已部署的应用程序发送请求
使用上述命令返回的 URL 向已部署的应用程序发送请求
curl -X 'GET' 'http://knative-serving-quarkus-demo.default.10.106.207.219.sslip.io/hello' -H 'accept: text/plain'
您应该看到以下输出:
Hello from RESTEasy Reactive
Going Native
可以创建应用程序的本机映像,以使其启动更快。为此,请使用以下命令部署您的应用程序:
mvn clean package -Pnative -Dquarkus.native.native-image-xmx=4096m -Dquarkus.native.remote-container-build=true -Dquarkus.kubernetes.deploy=true
提示:
-Dquarkus.native.native-image-xmx=4096m是 Quarkus 可用于生成本机图像的内存量。您应该根据本地机器的规格对其进行调整或完全删除它。
现在已准备好使用 Java 运行Cloud-Agnostic Serverless应用程序
Quarkus 和 Knative 让你可以自由地在本地或云中使用 Java 运行无服务器应用程序,无论供应商如何。你甚至可以将多个云供应商与您的本地基础设施混合使用。这种灵活性的优势是快捷部署并降低基础架构成本。