在 Kubernetes 中优化 Java 的 Serverless 功能

频道:行业资讯 日期: 浏览:730
实现更快的启动和更小的内存占用,以在?Kubernetes?上运行?serverless?功能。

由于运行数千个应用程序?pod?的费用以及使用更少的工作节点和其他资源来节省成本,在?Kubernetes?中更快的启动和更小的内存占用总是很重要的。 在?Kubernetes?上的容器化微服务上,内存比吞吐量更重要,因为:

?由于永久性(与?CPU?周期不同),它更昂贵。

?微服务成倍增加开销成本。

?一个单体应用变成?N?个微服务(例如,20?个微服务 ≈?20GB)

这会显着影响?serverless?功能开发和?Java?部署模型。 这是因为许多企业开发人员选择了?Go、Python?和?Nodejs?等替代方案来克服性能瓶颈——直到现在,感谢?Quarkus,一个新的?Kubernetes?原生?Java?堆栈。 本文介绍了如何优化?Java?性能以使用?Quarkus?在?Kubernetes?上运行?serverless?功能。

容器优先设计

Java?生态系统中的传统框架在初始化这些框架所需的内存和启动时间方面是有代价的,包括配置处理、类路径扫描、类加载、注释处理和构建世界的元模型,框架需要这些操作。对于不同的框架,这一次又一次地成倍增加。

Quarkus?通过将几乎所有开销“左移”到构建阶段来帮助解决这些?Java?性能问题。通过在构建时只进行一次代码和框架分析、字节码转换和动态元模型生成,您最终会得到一个高度优化的运行时可执行文件,它启动速度超快,并且不需要传统启动的所有内存,因为工作在构建阶段完成一次。

更重要的是,Quarkus?允许您构建具有性能优势的本机可执行文件,包括惊人的快速启动时间和非常小的驻留集大小?(RSS)?内存,与传统云相比,可实现即时扩展和高密度内存利用率—— 本机?Java?堆栈。

这是一个快速示例,说明如何使用?Quarkus?通过?Java?serverless?功能项目构建本机可执行文件。

一、创建?Quarkus?serverless?Maven?项目

这个命令会生成一个?Quarkus?项目(例如?quarkus-serverless-native)来创建一个简单的函数:

二、构建原生可执行文件

您需要一个?GraalVM?来为?Java?应用程序构建本机可执行文件。 您可以选择任何?GraalVM?发行版,例如?Oracle GraalVM?社区版?(CE)?和?Mandrel(Oracle GraalVM CE?的下游发行版)。?Mandrel?旨在支持在?OpenJDK 11?上构建?Quarkus?原生可执行文件。

打开?pom.xml,你会发现这个原生配置文件。 您将使用它来构建本机可执行文件:

注意:您可以在本地安装?GraalVM?或?Mandrel?发行版。 您还可以下载?Mandrel?容器镜像来构建它(就像我所做的那样),因此您需要在本地运行容器引擎(例如?Docker)。

假设您已经启动了容器运行时,请运行以下?Maven?命令之一。

对于?Docker:

对于?Podman:

输出应以?BUILD SUCCESS?结束。

在没有?Java?虚拟机?(JVM)?的情况下直接运行本机可执行文件:

输出将如下所示:

超音速!?启动时间为?19?毫秒。 时间可能因您的环境而异。

正如?Linux ps?实用程序报告的那样,它还具有极低的内存使用率。 在应用程序运行时,在另一个终端中运行此命令:

你应该看到类似的东西:

此过程使用大约?11MB?的内存?(RSS)。 相当紧凑!

注意:任何应用程序(包括?Quarkus)的?RSS?和内存使用量将根据您的特定环境而有所不同,并且会随着应用程序体验的加载而增加。

您还可以使用?REST API?访问该函数。 那么输出应该是?Hello RESTEasy:

三、将功能部署到?Knative?服务

如果您还没有,请在?OKD(OpenShift Kubernetes Distribution)上创建一个命名空间(例如?quarkus-serverless-native),以将此本机可执行文件部署为无服务器功能。 然后为?Knative?服务部署添加一个?quarkus-openshift?扩展:

在?src/main/resources/application.properties?中添加以下变量来配置?Knative?和?Kubernetes?资源:

构建本机可执行文件,然后直接将其部署到?OLD?集群:

注意:确保提前使用?oc login?命令登录到正确的项目(例如?quarkus-serverless-native)。

输出应以?BUILD SUCCESS?结束。 完成原生二进制构建并部署新的?Knative?服务需要几分钟时间。 成功创建服务后,您应该使用?kubectl?或?oc?命令工具看到?Knative?服务?(KSVC)?和修订版?(REV):

四、访问原生可执行函数

通过运行以下?kubectl?命令检索?serverless?函数的端点:

输出应如下所示:

使用?curl?命令访问路由?URL:

不到一秒钟,您将获得与本地相同的结果:

当您访问?OLD?集群中的?Quarkus?运行?pods?日志时,您将看到本机可执行文件作为?Knative?服务运行。

下一步是什么?

您可以使用?GraalVM?发行版优化?Java?serverless功能,将它们作为无服务器功能部署在?Knative?和?Kubernetes?上。?Quarkus?使用普通微服务中的简单配置来实现这种性能优化。

0 留言

评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。