使用 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依赖项:

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

运行新的构建:

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

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

bash 复制代码
$ 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文件中,如下所示:

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文件,您将看到:

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。选择器段定义了服务名称、版本和包,通过以下属性进行定制:

ini 复制代码
...
quarkus.kubernetes.part-of=aws-camelk
quarkus.kubernetes.name=aws-camel-jaxrs
quarkus.kubernetes.version=1.0.0-SNAPSHOT
...

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

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

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

在 Minikube 上运行

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

启动 Minikube

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

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

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

从 GitHub 克隆项目

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

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

创建 K8s 命名空间和 Secret

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

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

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

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: aws-secret
type: Opaque
data:
  AWS_ACCESS_KEY_ID: ...
  AWS_SECRET_ACCESS_KEY: ...

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

启动微服务

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

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

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

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

观察日志文件

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

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

停止微服务

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

bash 复制代码
./kill-ms.sh

清理AWS基础设施

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

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

停止 Minikube

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

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

作者:Nicolas Duminil

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

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

相关推荐
终末圆3 分钟前
MyBatis—Plus 快速上手【后端 22】
java·开发语言·数据库·后端·sql·spring·mybatis
码代码的小农9 分钟前
SpringBoot自定义异常
java·spring boot·后端
岁岁岁平安13 分钟前
springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)
java·spring boot·后端·学习·threadlocal·jwt令牌
Jason-河山40 分钟前
Java中的HTTP请求:使用Apache HttpClient
java·http·apache
阿树梢1 小时前
【DRF】DRF基本使用
后端·python·django
peihexian1 小时前
使用rust实现rtsp码流截图
开发语言·后端·rust
customer081 小时前
【开源免费】基于SpringBoot+Vue.JS微服务在线教育系统(JAVA毕业设计)
java·vue.js·spring boot·spring cloud·微服务·开源
影灵衣丶1 小时前
go进阶编程:设计模式之解释器模式
后端·go
Y_3_71 小时前
RabbitMQ 概述及安装 : 程序之间沟通的桥梁
开发语言·分布式·后端·程序人生·中间件·rabbitmq·学习方法
2401_857622661 小时前
SpringBoot助力墙绘艺术市场创新
java·spring boot·后端