【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)等。
Quarkus提供了几种选择,可以根据不同的技术和工具打包基于云的应用程序,如下所示:
Jib
Docker
S2I(Source to Image)
在我们的原型中,我们使用的是Jib,与其他两种方法相比,它的优势在于不需要在主机上运行Docker守护进程。为了利用它,只需在master pom.xml文件中包含以下Maven依赖项:
...
io.quarkus
quarkus-container-image-jib ...
运行新的构建:
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
...
我们的 Apache Camel 微服务不需要任何修改或重构即可部署到 Minikube。然而,构建过程包括测试、打包和将应用程序部署到 K8s 所需的所有步骤,需要进行调整以实现云感知并利用 Minikube 的特性。
因此,我们需要调整的第一个修改是将quarkus-minikubeMaven 工件添加到我们的主pom.xml文件中,如下所示:
...
io.quarkus
quarkus-minikube
...
该工件将在项目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-camelk
quarkus.kubernetes.name=aws-camel-jaxrs
quarkus.kubernetes.version=1.0.0-SNAPSHOT
...
另一个需要注意的重要点是AWS凭据的定义。我们的微服务需要访问AWS,为此,应定义一些属性,如区域名称、访问密钥ID和值。虽然区域名称不是敏感信息,可以作为明文属性定义,但对于与访问密钥相关的属性则不是这样,它们需要使用K8s secrets。下面的列表显示了application.properties文件的一个片段:
...
quarkus.kubernetes.env.vars.aws_region=eu-west-3
quarkus.kubernetes.env.secrets=aws-secret
...
此处,区域名称被定义为eu-west-3纯文本形式,而 AWS 访问密钥凭证是通过名为 的 K8S 密钥定义的aws-secret。
我们刚刚回顾了如何重构基于 Maven 的构建流程,以使其适应 K8s 原生。为了在 Minikube 上运行微服务,请按以下步骤操作:
当然,Minikube 应该安装在您的盒子上。这是一个非常简单的操作;只需按照此处的指南进行操作即可。安装完成后,您需要启动 Minikube:
$ minikube start
...
$ eval $(minikube -p minikube docker-env)
启动 Minikube 后,上面列表中的最后一个命令将 K8s Docker 注册表设置为 Minikube 中运行的实例,以便将新生成的映像直接发布到该实例。
运行以下命令来克隆存储库:
$ git clone https://github.com/nicolasduminil/aws-camelk.git
$ cd aws-camelk
$ git checkout minikube
运行以下命令创建 K8s 命名空间和密钥:
$ kubectl create namespace quarkus-camel
$ kubectl apply -f aws-secret.yaml --namespace quarkus-camel
在这里,创建名为 的 K8s 命名空间后quarkus-camel,我们通过应用名为 的清单文件中的配置在同一命名空间中创建一个 K8s 密钥aws-secret.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) 可以再次用于相同目的。已修改,如下图:
#!/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,从而启动管道。
为了跟踪微服务的执行,请运行以下命令:
$ kubectl get pods --namespace quarkus-camel
$ kubectl logs
--namespace quarkus-camel
要停止微服务,请运行以下命令:
./kill-ms.sh
不要忘记清理您的 AWS 基础设施,以免被计费。
$ ./delete-all-buckets.sh
$ ./purge-sqs-queue.sh
$ ./delete-sqs-queue.sh
最后但并非最不重要的一点是,停止 Minikube:
$ eval $(minikube -p minikube docker-env --unset)
$ minikube stop
作者:Nicolas Duminil
更多内容请关注公号【云原生数据库】
squids.cn,云数据库RDS,迁移工具DBMotion,云备份DBTwin等数据库生态工具。