使用 Apache Camel 和 Quarkus 的微服务(三)

squids.cn】 全网zui低价RDS,免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等

Minikube:它可能是最简单和最容易接近的K8s集群。作为一个为了以低资源运行而设计的轻量级K8s发行版,有效的Minikube设置不需要除了你自己的笔记本电脑以外的任何东西。从这个角度来看,Minikube是开发环境的绝佳选择,能够快速访问基础设施元素,如节点、pods、部署、服务和其他K8s的细微之处,在大规模场景中更难实现。

作为一个K8s-native运行时,Quarkus支持各种类型的集群,包括但不限于Minikube、Kind、OpenShift、EKS(Elastic Kubernetes Service)、AKS(Azure Kubernetes Service)等。

打包为Docker镜像

Quarkus提供了几种选择,可以根据不同的技术和工具打包基于云的应用程序,如下所示:

  • Jib

  • Docker

  • S2I(Source to Image)

在我们的原型中,我们使用的是Jib,与其他两种方法相比,它的优势在于不需要在主机上运行Docker守护进程。为了利用它,只需在master pom.xml文件中包含以下Maven依赖项:

复制代码
...<dependency>  <groupId>io.quarkus</groupId>  <artifactId>quarkus-container-image-jib</artifactId></dependency>...

运行新的构建:

复制代码
mvn -DskipTests -Dquarkus.container-image.build=true clean package

完成后,如果本地有 Docker 守护进程运行,则可以检查容器镜像创建情况,如下所示:

复制代码
$ docker images
REPOSITORY                        TAG                      IMAGE ID       CREATED         SIZE
aws-quarkus/aws-camelk-sqs        1.0.0-SNAPSHOT           63072102ba00   9 days ago      382MB
aws-quarkus/aws-camelk-jaxrs      1.0.0-SNAPSHOT           776a0f99c5d6   9 days ago      387MB
aws-quarkus/aws-camelk-s3         1.0.0-SNAPSHOT           003f0a987901   9 days ago      382MB
aws-quarkus/aws-camelk-file       1.0.0-SNAPSHOT           1130a9c3dfcb   9 days ago      382MB
...

部署到 Minikube

我们的 Apache Camel 微服务不需要任何修改或重构即可部署到 Minikube。然而,构建过程包括测试、打包和将应用程序部署到 K8s 所需的所有步骤,需要进行调整以实现云感知并利用 Minikube 的特性。

因此,我们需要调整的第一个修改是将quarkus-minikubeMaven 工件添加到我们的主pom.xml文件中,如下所示:

复制代码
...    <dependency>      <groupId>io.quarkus</groupId>      <artifactId>quarkus-minikube</artifactId>    </dependency>...

该工件将在项目target/kubernetes目录中生成 Minikube 特定的清单文件。众所周知,K8s 的一切都是用 YAML(Yet Another Markup Language)表示法描述的。虽然 K8s 历来需要相当繁重的 YAML 创作和编辑过程,但使用此工件的优点是自动生成所需的 YAML 文件,或者至少是稍后可能会丰富的基本框架。

mvn -DskipTests clean install通过在项目根级别运行命令来执行新构建将在target/kubernetes每个 Quarkus 微服务的目录中生成两类文件:

  • 一对kubernetes.yaml/json文件,其中包含描述微服务的 K8 常规资源的清单

  • 一对minikube.yaml/json文件,其中包含描述微服务的 Minikube 特定资源的清单

例如,对于aws-camelk-jaxrs微服务,转到aws-camelk-jaxrs/target/kubernetes并打开minikube.yaml文件,您将看到:

复制代码
...spec:  ports:    - name: http      nodePort: 30326      port: 80      protocol: TCP      targetPort: 8080  selector:    app.kubernetes.io/name: aws-camel-jaxrs    app.kubernetes.io/part-of: aws-camelk    app.kubernetes.io/version: 1.0.0-SNAPSHOT  type: NodePort...

此清单片段定义了一种类型为NodePort的K8s服务,该服务在TCP端口号8080上监听HTTP请求,并映射到主机的端口号30326。这个配置是特定于Minikube的,对于像EKS这样的其他集群,配置的K8s服务的类型将是ClusterIP而不是NodePort。选择器段定义了服务名称、版本和包,通过以下属性进行定制:

复制代码
...quarkus.kubernetes.part-of=aws-camelkquarkus.kubernetes.name=aws-camel-jaxrsquarkus.kubernetes.version=1.0.0-SNAPSHOT...

另一个需要注意的重要点是AWS凭据的定义。我们的微服务需要访问AWS,为此,应定义一些属性,如区域名称、访问密钥ID和值。虽然区域名称不是敏感信息,可以作为明文属性定义,但对于与访问密钥相关的属性则不是这样,它们需要使用K8s secrets。下面的列表显示了application.properties文件的一个片段:

复制代码
...quarkus.kubernetes.env.vars.aws_region=eu-west-3quarkus.kubernetes.env.secrets=aws-secret...

此处,区域名称被定义为eu-west-3纯文本形式,而 AWS 访问密钥凭证是通过名为 的 K8S 密钥定义的aws-secret。

在 Minikube 上运行

我们刚刚回顾了如何重构基于 Maven 的构建流程,以使其适应 K8s 原生。为了在 Minikube 上运行微服务,请按以下步骤操作:

启动 Minikube

当然,Minikube 应该安装在您的盒子上。这是一个非常简单的操作;只需按照此处的指南进行操作即可。安装完成后,您需要启动 Minikube:

复制代码
$ minikube start...$ eval $(minikube -p minikube docker-env)

启动 Minikube 后,上面列表中的最后一个命令将 K8s Docker 注册表设置为 Minikube 中运行的实例,以便将新生成的映像直接发布到该实例。

从 GitHub 克隆项目

运行以下命令来克隆存储库:

复制代码
$ git clone https://github.com/nicolasduminil/aws-camelk.git$ cd aws-camelk$ git checkout minikube

创建 K8s 命名空间和 Secret

运行以下命令创建 K8s 命名空间和密钥:

复制代码
$ kubectl create namespace quarkus-camel$ kubectl apply -f aws-secret.yaml --namespace quarkus-camel

在这里,创建名为 的 K8s 命名空间后quarkus-camel,我们通过应用名为 的清单文件中的配置在同一命名空间中创建一个 K8s 密钥aws-secret.yaml,如下所示:

复制代码
apiVersion: v1kind: Secretmetadata:  name: aws-secrettype: Opaquedata:  AWS_ACCESS_KEY_ID: ...  AWS_SECRET_ACCESS_KEY: ...

AWS_ACCESS_KEY_ID标记为和的属性AWS_SECRET_ACCESS_KEY 是 BASE64 编码的。

启动微服务

我们在第 2 部分中用于启动微服务的相同脚本 (start-ms.sh) 可以再次用于相同目的。已修改,如下图:

复制代码
#!/bin/sh./delete-all-buckets.sh./create-queue.shmvn -DskipTests -Dquarkus.kubernetes.deploy clean packagesleep 3./copy-xml-file.sh

在这里,我们首先清理环境并删除所有名为"mys3*"的 S3 存储桶(如果有)。然后,我们创建一个名为"myQueue"的 SQS 队列(如果它尚不存在)。如果存在,我们会通过删除其中存储的所有消息来清除它。

Maven 命令使用quarkus.kubernetes.deploy该属性将新生成的 Docker 镜像部署到 Minikube。最后但并非最不重要的一点是,将 XML 文件复制到输入目录中将触发名为 的 Camel 路由aws-camelk-file,从而启动管道。

观察日志文件

为了跟踪微服务的执行,请运行以下命令:

复制代码
$ kubectl get pods --namespace quarkus-camel$ kubectl logs <pod-id> --namespace quarkus-camel

停止微服务

要停止微服务,请运行以下命令:

复制代码
./kill-ms.sh

清理AWS基础设施

不要忘记清理您的 AWS 基础设施,以免被计费。

复制代码
$ ./delete-all-buckets.sh$ ./purge-sqs-queue.sh$ ./delete-sqs-queue.sh

停止 Minikube

最后但并非最不重要的一点是,停止 Minikube:

复制代码
$ eval $(minikube -p minikube docker-env --unset)$ minikube stop

作者:Nicolas Duminil

更多内容请关注公号【云原生数据库

squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。

相关推荐
卓卓不是桌桌27 分钟前
如何优雅地处理 iframe 跨域通信?这是我的开源方案
javascript·架构
Qlly31 分钟前
DDD 架构为什么适合 MCP Server 开发?
人工智能·后端·架构
用户8815869109120 小时前
AI Agent 协作系统架构设计与实践
架构
鹏北海20 小时前
Qiankun 微前端实战踩坑历程
前端·架构
货拉拉技术21 小时前
货拉拉海豚平台-大模型推理加速工程化实践
人工智能·后端·架构
RoyLin1 天前
libkrun 深度解析:架构设计、模块实现与 Windows WHPX 后端
架构
CoovallyAIHub2 天前
实时视觉AI智能体框架来了!Vision Agents 狂揽7K Star,延迟低至30ms,YOLO+Gemini实时联动!
算法·架构·github
RoyLin2 天前
领域驱动设计:回归本质的工程实践
架构
CoovallyAIHub2 天前
OpenClaw:从“19万星标”到“行业封杀”,这只“赛博龙虾”究竟触动了谁的神经?
算法·架构·github
悟空聊架构2 天前
基于KaiwuDB在游乐场“刷卡+投币”双模消费系统中的落地实践
数据库·后端·架构