使用 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等数据库生态工具。

相关推荐
javaDocker10 小时前
业务架构、数据架构、应用架构和技术架构
架构
JosieBook11 小时前
【架构】主流企业架构Zachman、ToGAF、FEA、DoDAF介绍
架构
.生产的驴12 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
喵叔哟12 小时前
16. 【.NET 8 实战--孢子记账--从单体到微服务】--汇率获取定时器
微服务·oracle·.net
Smile丶凉轩12 小时前
微服务即时通讯系统的实现(服务端)----(1)
c++·git·微服务·github
丁总学Java13 小时前
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
arm开发·架构
运维&陈同学14 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
ZOMI酱14 小时前
【AI系统】GPU 架构与 CUDA 关系
人工智能·架构
猿java15 小时前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试