OpenShift 4 - 从 1.3G 到 50M,以最小化的可执行程序运行 Quarkus 微服务
《OpenShift / RHEL / DevSecOps 汇总目录》
文本已在 OpenShift 4.10 环境中进行验证。
文章目录
- 创建应用镜像,并 Java 微服务转换可执行程序
- 生成最小化的应用镜像
创建应用镜像,并 Java 微服务转换可执行程序
- 创建测试项目
$ oc new-project quarkus
- 使用 ubi-quarkus-native-s2i:22.1-java11 作为基础镜像和 Source-2-Image 方法运行 quarkus-quickstarts 应用中的微服务。
$ oc new-app quay.io/quarkus/ubi-quarkus-native-s2i:22.1-java11~https://github.com/quarkusio/quarkus-quickstarts.git --context-dir=getting-started --name=quarkus-quickstart-native
- 查看创建的 BuildConfig,然后查看 Build 运行日志,其中包含了将 Java 应用编译成二进制应用的过程。在完成后会将生成的 quarkus-quickstart-native 镜像推送到 OpenShift 内部的 Image Registry 中。
$ oc get bc quarkus-quickstart-native
NAME TYPE FROM LATEST
quarkus-quickstart-native Source Git 1$ oc logs -f bc/quarkus-quickstart-native
...
以上省略
========================================================================================================================
GraalVM Native Image: Generating 'getting-started-1.0.0-SNAPSHOT-runner' (executable)...
========================================================================================================================
[1/7] Initializing... (7.1s @ 0.28GB)Version info: 'GraalVM 22.1.0 Java 11 CE'C compiler: gcc (redhat, x86_64, 8.5.0)Garbage collector: Serial GC3 user-provided feature(s)1. io.quarkus.runner.Feature2. io.quarkus.runtime.graal.DisableLoggingFeature3. io.quarkus.runtime.graal.ResourcesFeature
[2/7] Performing analysis... [***********] (33.9s @ 2.29GB)9,867 (89.55%) of 11,018 classes reachable15,190 (60.66%) of 25,043 fields reachable49,924 (57.36%) of 87,035 methods reachable411 classes, 581 fields, and 1,494 methods registered for reflection68 classes, 88 fields, and 54 methods registered for JNI access
[3/7] Building universe... (5.8s @ 0.92GB)
[4/7] Parsing methods... [***] (5.2s @ 2.55GB)
[5/7] Inlining methods... [*****] (8.5s @ 3.66GB)
[6/7] Compiling methods... [******] (34.5s @ 1.78GB)
[7/7] Creating image... (4.5s @ 2.70GB)19.80MB (44.38%) for code area: 32,401 compilation units20.12MB (45.11%) for image heap: 6,756 classes and 245,742 objects4.69MB (10.51%) for other data44.60MB in total
------------------------------------------------------------------------------------------------------------------------
Top 10 packages in code area: Top 10 object types in image heap:1.73MB sun.security.ssl 4.26MB byte[] for code metadata
1001.92KB java.lang.invoke 2.33MB java.lang.Class975.00KB java.util 2.22MB java.lang.String715.49KB com.sun.crypto.provider 2.20MB byte[] for general heap data484.63KB sun.security.x509 1.81MB byte[] for java.lang.String427.76KB io.netty.buffer 925.03KB com.oracle.svm.core.hub.DynamicHubCompanion420.41KB java.lang 519.61KB java.util.HashMap$Node405.77KB com.oracle.svm.core.reflect 458.10KB byte[] for reflection metadata390.50KB java.io 445.95KB java.lang.String[]389.44KB java.util.concurrent 250.41KB java.util.concurrent.ConcurrentHashMap$Node... 365 additional packages ... 2430 additional object types(use GraalVM Dashboard to see all)
------------------------------------------------------------------------------------------------------------------------8.7s (8.3% of total time) in 29 GCs | Peak RSS: 6.31GB | CPU load: 4.78
------------------------------------------------------------------------------------------------------------------------
Produced artifacts:/tmp/src/target/getting-started-1.0.0-SNAPSHOT-native-image-source-jar/getting-started-1.0.0-SNAPSHOT-runner (executable)/tmp/src/target/getting-started-1.0.0-SNAPSHOT-native-image-source-jar/getting-started-1.0.0-SNAPSHOT-runner.build_artifacts.txt
========================================================================================================================
Finished generating 'getting-started-1.0.0-SNAPSHOT-runner' in 1m 44s.
...
以下省略
...
Successfully pushed image-registry.openshift-image-registry.svc:5000/quarkus/quarkus-quickstart-native@sha256:b8d2873fe7100ec2f08c2a504d4d4e1413f8623373c88a33707a4d599f988f99
Push successful
- 查看生成的 ImageStreamTag。
$ oc get istag
NAME IMAGE REFERENCE UPDATED
quarkus-quickstart-native:latest image-registry.openshift-image-registry.svc:5000/quarkus/quarkus-quickstart-native@sha256:b8d2873fe7100ec2f08c2a504d4d4e1413f8623373c88a33707a4d599f988f99 15 minutes ago
ubi-quarkus-native-s2i:22.1-java11 quay.io/quarkus/ubi-quarkus-native-s2i@sha256:29276cfbaf3111ffe272c194b37b5fdf9598e806d60bcae2e7d5e331d4a35a0d 18 minutes ago
- 对比 ubi-quarkus-native-s2i:22.1-java11 和 quarkus-quickstart-native:latest 镜像的大小,确认镜像都是 1.3G 左右。说明:ubi-quarkus-native-s2i 镜像之所有比较大,是因为其中不但包含了标准的 RHEL UBI 镜像内容,还包含了针对 Quarkus Native 编译的 Source 2 Image 的运行环境。
$ ISTags="quarkus-quickstart-native:latest ubi-quarkus-native-s2i:22.1-java11"
$ for ISTag in $ISTags; do oc get istag $ISTag --output=jsonpath='{.image.dockerImageMetadata.Size}{"\t"}{.metadata.name}{"\n"}'; done
1397020952 quarkus-quickstart-native:latest
1273656913 ubi-quarkus-native-s2i:22.1-java11
- 最后可以生成 Route 并测试访问应用。
$ oc expose svc/quarkus-quickstart-native
$ URL_NATIVE="http://$(oc get route | grep quarkus-quickstart-native | awk '{print $2}')"
$ curl $URL_NATIVE/hello/greeting/quarkus
生成最小化的应用镜像
- 基于已有的 ImageStream 和 registry.access.redhat.com/ubi9/ubi-minimal:latest 基础镜像,运行 Build 创建出新的应用镜像。
$ oc get is quarkus-quickstart-native
NAME IMAGE REPOSITORY TAGS UPDATED
quarkus-quickstart-native image-registry.openshift-image-registry.svc:5000/quarkus/quarkus-quickstart-native latest 2 minutes ago$ oc new-build --name=quarkus-quickstart-native-minimal \--source-image=quarkus-quickstart-native \--source-image-path='/home/quarkus/application:.' \--dockerfile=$'FROM registry.access.redhat.com/ubi9/ubi-minimal:latest\nCOPY application /application\nCMD /application\nEXPOSE 8080'
- 确认创建了名为 quarkus-quickstart-native-minimal 的 BuildConfig,然后查看 Build 日志。确认在最后会生成 quarkus-quickstart-native-minimal 应用镜像,并将其对送到了 OpenShift 内部 Image Registry 中了。
$ oc get bc quarkus-quickstart-native-minimal
NAME TYPE FROM LATEST
quarkus-quickstart-native-minimal Docker Dockerfile 1$ oc logs -f bc/quarkus-quickstart-native-minimal
...
以上省略
Successfully pushed image-registry.openshift-image-registry.svc:5000/quarkus/quarkus-quickstart-native-minimal@sha256:d0f97dac24939a5620eebabf72f06277e995e6a1a55df4861bcef772e3d924b0
Push successful
- 对比刚刚生成的 quarkus-quickstart-native-minimal:latest 应用镜像和第一次生成的 quarkus-quickstart-native:latest 应用镜像大小。确认新镜像只有 50M 左右。
$ ISTags="quarkus-quickstart-native-minimal:latest quarkus-quickstart-native:latest"
$ for ISTag in $ISTags; do oc get istag $ISTag --output=jsonpath='{.image.dockerImageMetadata.Size}{"\t"}{.metadata.name}{"\n"}'; done
50784630 quarkus-quickstart-native-minimal:latest
1397020952 quarkus-quickstart-native:latest
- 基于新的应用镜像运行应用。
$ oc get is quarkus-quickstart-native-minimal
NAME IMAGE REPOSITORY TAGS UPDATED
quarkus-quickstart-native-minimal image-registry.openshift-image-registry.svc:5000/quarkus/quarkus-quickstart-native-minimal latest 2 minutes ago$ oc new-app quarkus-quickstart-native-minimal
$ oc expose svc quarkus-quickstart-native-minimal
$ URL_MINIMAL="http://$(oc get route | grep quarkus-quickstart-native-minimal | awk '{print $2}')"
$ curl $URL_MINIMAL/hello/greeting/quarkus
- 进入运行新旧应用镜像的 Pod,确认 /application 和 /tmp 的差异。
$ oc exec deploy/quarkus-quickstart-native-minimal -- ls -al /application /tmp
-rwxr-xr-x. 1 root root 42211232 Oct 16 12:50 /application
/tmp:
total 0
drwxrwxrwt. 1 root root 25 Oct 16 12:57 .
dr-xr-xr-x. 1 root root 28 Oct 16 12:57 ..
drwxrwxrwx. 3 1000760000 root 70 Oct 16 13:02 vertx-cache
$ oc exec deploy/quarkus-quickstart-native -- ls -al /application /tmp
ls: cannot access '/application': No such file or directory
/tmp:
total 8
drwxrwxrwt. 1 root root 25 Oct 16 12:30 .
dr-xr-xr-x. 1 root root 17 Oct 16 12:30 ..
drwxr-xr-x. 2 quarkus quarkus 26 Oct 16 12:28 com_aayushatharva_brotli4j_10073115817846
drwxr-xr-x. 2 quarkus quarkus 6 Oct 16 12:30 hsperfdata_quarkus
-rwx------. 1 root root 701 Sep 6 17:17 ks-script-16cks60v
-rwx------. 1 root root 291 Sep 6 17:17 ks-script-yf1frpot
drwxr-xr-x. 6 quarkus root 154 Oct 16 12:28 src
drwxrwxrwx. 3 1000760000 root 70 Oct 16 12:30 vertx-cache
OpenShift 4 - 从 1.3G 到 50M,以最小化的可执行程序运行 Quarkus 微服务相关推荐
- 在OpenShift上扩展Java EE微服务
这个小系列的前两个部分介绍了如何使用WildFly Swarm构建一个微型JAX-RS服务并将其打包到Docker映像中 . 您学习了如何将此示例部署到OpenShift ,现在该进行一点扩展了. 为 ...
- OpenShift 4 之Istio-Tutorial (3) 监控微服务运行
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 本章节我们在OpenShift 4的Serivce Mesh环境中集成的Kiali,J ...
- OpenShift 4 之Service Mesh教程(1)- 创建ServiceMesh环境,部署Istio的微服务
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 文章目录 创建ServiceMesh环境 部署Istio的微服务 参考 创建Servi ...
- 使用Quarkus在Openshift上构建微服务的快速指南
点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! [重磅]到底是什么野生海鲜美味,惹得人们都往泥瓦匠老家买? 作者 | 康仔 来源 | 公众号 ...
- openshift 部署_在OpenShift上部署Java EE微服务
openshift 部署 我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客. 您学习了如何使用Maven构建所谓的"胖子",还使用Maven Doc ...
- openshift_在OpenShift上扩展Java EE微服务
openshift 这个小系列的前两个部分介绍了如何使用WildFly Swarm构建一个小型的JAX-RS服务并将其打包到Docker映像中 . 您学习了如何将此示例部署到OpenShift ,现在 ...
- 在OpenShift上部署Java EE微服务
我昨天用WildFly Swarm在博客上发布了有关简单JAX-RS微服务的博客. 您学习了如何使用Maven构建一个所谓的"胖子",还使用Maven Docker插件对我们的微服 ...
- OpenShift 4 - Istio-Tutorial (2) 部署三个微服务
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 本系列演示的场景使用了基于Java实现的三个微服务:Customer.Preferen ...
- OpenShift 4 之Service Mesh教程(2)- 用Kiali监控微服务运行
<OpenShift 4.x HOL教程汇总> 说明:本文已经在OpenShift 4.8环境中验证 获得Kiali访问地址,然后用浏览器访问并登陆. $ oc get route kia ...
最新文章
- DPDK 报文收发流程(二十五)
- Batch Normalization的作用及原理
- android activity切换动画
- eclipse maven jetty插件方式启动项目
- Qt——P26 Label控件显示图片
- LSJ_NHibernate第一章 NHibernate介绍
- 使用HttpClient连接池进行https单双向验证
- mysql安装运行(centos)
- Lena图像分解成小块与从小块合成
- 数学建模:R语言的正态性检验
- SAP-物料 X 未对销售组织 XXXX 分销渠道 X 语言 XX 定义
- bzoj3717 [PA2014]Pakowanie(状压dp+贪心)
- 苹果开发者新账号上新app审核被拒绝:Other-Other被拒绝,心路历程记录!
- fastspeech2复现github项目--数据准备
- Hashmap底层源码
- MySQL数据库-设置数据完整性
- 微信小程序底部菜单详解
- HANA S/4 标准表(MARC MBEW COBL)增强流程
- WinInet库之Http通信
- 我的世界如何增加小游戏服务器,我的世界服务器小游戏怎么玩 骨灰玩家手把手教学...