1.5. 迁移过程
迁移过程由以下步骤组成:
| 任务 | 描述 |
|---|---|
| 创建 maven 项目 | 使用 Camel JBang 的 camel cli 导出文件,它将创建一个 maven 项目。 |
| 调整配置 | 通过添加和更改文件来配置项目。 |
| Build | 构建项目将生成 JAR 文件。构建容器镜像并推送到容器注册表。 |
| 部署 | 将 kubernetes 对象部署到 Openshift 集群并运行 pod。 |
1.5.1. 迁移步骤 复制链接链接已复制到粘贴板!
1.5.1.1. 使用案例 1 - 使用配置简单集成路由 复制链接链接已复制到粘贴板!
根据以下集成路由,带有 rest 和 kamelet 端点。
http2jms.properties 文件
broker=amqp://172.30.177.216:61616 queue=qtest
broker=amqp://172.30.177.216:61616
queue=qtest
kamel run 命令
kamel run Http2Jms.java -p file://$PWD/http2jms.properties --annotation some_annotation=foo --env MY_ENV1=VAL1
kamel run Http2Jms.java -p file://$PWD/http2jms.properties --annotation some_annotation=foo --env MY_ENV1=VAL1
它使用注解构建并运行 pod。环境变量和属性文件作为 ConfigMap 添加并挂载到 pod 中。
1.5.1.1.1. 第 1 步 - 创建 maven 项目 复制链接链接已复制到粘贴板!
使用 camel jbang 将文件导出到 maven 项目。
参数的描述:
| 参数 | 描述 |
|---|---|
|
| 使用 Quarkus 运行时。生成的项目包含 quarkus BOM。 |
|
|
红帽支持的 quarkus 平台 maven 工件组是 |
|
| 这是目前支持的最新版本。请参阅 Quarkus 文档中的 最新版本的。 |
|
| 在 GA 版本中使用 Red Hat Maven 存储库。 |
|
| 将 quarkus-openshift 依赖项添加到 pom.xml 中,以在 Openshift 中进行构建。 |
|
| 将 GAV 设置为生成的 pom.xml。您必须为项目相应地设置 GAV。 |
|
| maven 项目目录。 |
您可以使用 camel export --help查看更多参数
如果使用 kamelets,它必须是 maven 项目的一部分。您可以下载 Kamelet 存储库 并解压缩它。如果您有任何自定义 kamelet,请将它们添加到此 kamelet 目录中。
在使用 camel 导出时,您可以使用 parameter --local-kamelet-dir=<kamelet directory& gt;,它将所有 kamelets 复制到 src/main/resources/kamelets,稍后被打包到最终存档中。
如果您选择不使用 -local-kamelet-dir=<kamelet directory > 参数,则必须手动将所需的 kamelet yaml 文件复制到上述目录中。
跟踪生成的 pom 中的工件名称,因为工件名称在生成的 Openshift 文件中(Deployment、Service、Route 等)。
1.5.1.1.2. 第 2 步 - 配置项目 复制链接链接已复制到粘贴板!
这是配置 maven 项目和工件以适合您的环境的步骤。
进入 maven 项目
cd ceq-app1
cd ceq-app1
设置 docker 构建策略。
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
在 src/main/docker 中将基础镜像改为 OpenJDK 21 (可选)
FROM registry.access.redhat.com/ubi9/openjdk-21:1.20
FROM registry.access.redhat.com/ubi9/openjdk-21:1.20
将 pom.xml 中的编译器版本更改为 21 (可选)
<maven.compiler.release>21</maven.compiler.release>
<maven.compiler.release>21</maven.compiler.release>
如果需要,在 src/main/resources/application.properties 中设置环境变量、标签和注解。
quarkus.openshift.annotations.sample_annotation=sample_value1 quarkus.openshift.env.vars.SAMPLE_KEY=sample_value2 quarkus.openshift.labels.sample_label=sample_value3
quarkus.openshift.annotations.sample_annotation=sample_value1
quarkus.openshift.env.vars.SAMPLE_KEY=sample_value2
quarkus.openshift.labels.sample_label=sample_value3
如果要使用这些参数自定义镜像和容器 registry 设置:
quarkus.container-image.registry quarkus.container-image.group quarkus.container-image.name quarkus.container-image.tag
quarkus.container-image.registry
quarkus.container-image.group
quarkus.container-image.name
quarkus.container-image.tag
因为有一个 http2jms.properties,其配置在运行时使用,kamel cli 会创建一个 ConfigMap,并将它挂载到 pod 中。红帽构建的 Apache Camel for Quarkus 必须达到相同的目的。
在 'src/main/kubernetes/common.yml 中创建一个名为 ceq-app 的本地 ConfigMap 文件,该文件将是镜像构建过程的一部分。以下命令将 ConfigMap 键设置为 application.properties
oc create configmap ceq-app --from-file application.properties=http2jms.properties --dry-run=client -oyaml > src/main/kubernetes/common.yml
oc create configmap ceq-app --from-file application.properties=http2jms.properties --dry-run=client -oyaml > src/main/kubernetes/common.yml
将以下属性添加到 application.properties,以便 Quarkus 挂载 ConfigMap。
quarkus.openshift.app-config-map=ceq-app
quarkus.openshift.app-config-map=ceq-app
1.5.1.1.3. 第 3 步 - 构建 复制链接链接已复制到粘贴板!
构建用于本地检查的软件包。
./mvnw -ntp package
./mvnw -ntp package
此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes 目录中生成 Openshift 文件。
跟踪 target/kubernetes/openshift.yml,以了解部署到 Openshift 集群的部署。
1.5.1.1.4. 第 4 步 - 构建和部署 复制链接链接已复制到粘贴板!
构建软件包并部署到 Openshift
./mvnw -ntp package -Dquarkus.openshift.deploy=true
./mvnw -ntp package -Dquarkus.openshift.deploy=true
您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。
1.5.1.1.5. 第 5 步 - 测试 复制链接链接已复制到粘贴板!
验证集成路由是否正常工作。
如果项目可以在本地运行,您可以尝试以下操作:
mvn -ntp quarkus:run
mvn -ntp quarkus:run
按照 pod 容器日志进行操作
oc logs -f `oc get pod -l app.kubernetes.io/name=app -oname`
oc logs -f `oc get pod -l app.kubernetes.io/name=app -oname`
它必须显示类似如下的输出:
请参阅 MicroProfilePropertiesSource 行,它显示添加为 ConfigMap 的属性文件的内容,并挂载到容器集。
1.5.1.2. 使用案例 2 - Knative 集成路由 复制链接链接已复制到粘贴板!
这个用例有两个 Knative 集成路由。Feed 路由定期向 Knative 频道发送文本信息,第二个路由 Printer 接收来自 Knative 频道的信息并打印它。
对于 Camel K,有两个 pod,各自运行一个集成路由。因此,此迁移必须创建两个项目,各自具有一个集成路由。
之后,您可以将其自定义为单一 pod 中具有两个集成路由的单个 maven 项目。
Feed 集成路由。
打印机 集成路由。
kamel run 命令显示如何使用 Camel K 运行。
kamel run Feed.java kamel run Printer.java
kamel run Feed.java
kamel run Printer.java
将有两个 pod 正在运行。
1.5.1.2.1. 第 1 步 - 创建 maven 项目 复制链接链接已复制到粘贴板!
使用 camel jbang 将文件导出到完整的 maven 项目
导出 源 集成。
导出 打印机 集成。
将为每个集成创建一个 maven 项目。
1.5.1.2.2. 第 2 步 - 配置项目 复制链接链接已复制到粘贴板!
此步骤是配置 maven 项目和工件以适合您的环境。使用案例 1 包含有关 ConfigMap 中的标签、注解和配置的信息。
进入 maven 项目
cd ceq-feed
cd ceq-feed
设置 docker 构建策略。
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
在 src/main/docker 中将基础镜像改为 OpenJDK 21 (可选)
FROM registry.access.redhat.com/ubi9/openjdk-21:1.20
FROM registry.access.redhat.com/ubi9/openjdk-21:1.20
将 pom.xml 中的编译器版本更改为 21 (可选)
<maven.compiler.release>21</maven.compiler.release>
<maven.compiler.release>21</maven.compiler.release>
将 openshift 添加为部署目标。
quarkus.kubernetes.deployment-target=openshift
quarkus.kubernetes.deployment-target=openshift
您必须设置这些容器镜像属性,以便在生成的 openshift.yml 和 knative.yml 文件中设置镜像地址。
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 quarkus.container-image.group=<namespace>
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000
quarkus.container-image.group=<namespace>
在 application.properties 中添加以下属性,以允许 Knative 控制器将 K_SINK 环境变量注入部署。
quarkus.openshift.labels."bindings.knative.dev/include"=true
quarkus.openshift.labels."bindings.knative.dev/include"=true
在 src/main/resources 中添加 knative.json。这是 Camel 连接到 Knative 频道所需的配置。
有 k.sink 属性占位符。当 pod 运行时,它将查看名为 K_SINK 的环境变量,并在 url 值中替换。
添加以下属性以允许 Camel 加载 Knative 环境配置。
camel.component.knative.environmentPath=classpath:knative.json
camel.component.knative.environmentPath=classpath:knative.json
要使注入工作,您必须创建一个 Knative SinkBinding 对象。
将 SinkBinding 文件添加到 src/main/kubernetes/openshift.yml
现在,配置 ceq-printer 项目。
cd ceq-printer
cd ceq-printer
设置 docker 构建策略。
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
在 src/main/docker 中将基础镜像改为 OpenJDK 21 (可选)
FROM registry.access.redhat.com/ubi9/openjdk-21:1.20
FROM registry.access.redhat.com/ubi9/openjdk-21:1.20
将 pom.xml 中的编译器版本更改为 21 (可选)
<maven.compiler.release>21</maven.compiler.release>
<maven.compiler.release>21</maven.compiler.release>
将 knative 设置为部署目标。
quarkus.kubernetes.deployment-target=knative
quarkus.kubernetes.deployment-target=knative
您必须设置这些容器镜像属性,以便在生成的 openshift.yml 和 knative.yml 文件中正确设置镜像地址。
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000 quarkus.container-image.group=<namespace>
quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000
quarkus.container-image.group=<namespace>
在 src/main/resources 中添加 knative.json。这是 Camel 连接到 Knative 频道所需的配置。
添加以下属性以允许 Camel 加载 Knative 环境配置。
camel.component.knative.environmentPath=classpath:knative.json
camel.component.knative.environmentPath=classpath:knative.json
从频道到 sink 的消息发送需要 Knative 订阅。
将 Subscription 文件添加到 src/main/kubernetes/knative.yml
1.5.1.2.3. 第 3 步 - 构建 复制链接链接已复制到粘贴板!
构建用于本地检查的软件包。
./mvnw -ntp package
./mvnw -ntp package
此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes 目录中生成 Openshift 文件。
跟踪 target/kubernetes/openshift.yml 和 'target/kubernetes/knative.yml',以了解部署到 Openshift 集群的部署。
1.5.1.2.4. 第 4 步 - 构建和部署 复制链接链接已复制到粘贴板!
构建软件包并部署到 Openshift。
./mvnw -ntp package -Dquarkus.openshift.deploy=true
./mvnw -ntp package -Dquarkus.openshift.deploy=true
您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。
1.5.1.2.5. 第 5 步 - 测试 复制链接链接已复制到粘贴板!
验证集成路由是否正常工作。
按照 pod 容器日志进行操作
oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-feed -oname`
oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-feed -oname`
它必须显示类似如下的输出:
CEQ-feed pod
请参阅 Property-placeholders。它显示 k.sink 属性值。
CEQ-printer pod
1.5.1.3. 使用案例 3 - Pipe 复制链接链接已复制到粘贴板!
将以下集成路由指定为 KameletBinding。
1.5.1.3.1. 第 1 步 - 创建 maven 项目 复制链接链接已复制到粘贴板!
使用 camel jbang 将文件导出到 maven 项目。
您可以使用 camel export --help查看更多参数
1.5.1.3.2. 第 2 步 - 配置项目 复制链接链接已复制到粘贴板!
这是配置 maven 项目和工件以适合您的环境的步骤。
您可以遵循常见配置的用例 1 和 2,我们将提供 KameletBinding 配置所需的步骤。
您可以尝试使用 camel jbang 在本地运行集成路由,以了解它在构建和部署到 Openshift 前如何工作。
进入 maven 项目
cd ceq-timer2log-kbind
cd ceq-timer2log-kbind
请参阅关于如何管理 Kamelets 的开头的备注。对于此迁移用例,我在 pom.xml 中使用 org.apache.camel.kamelets:camel-kamelets 依赖项。
在导出时,它会在 application.properties 中添加以下属性,但您可以将其删除。
quarkus.native.resources.includes camel.main.routes-include-pattern
quarkus.native.resources.includes
camel.main.routes-include-pattern
设置 docker 构建策略。
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
echo quarkus.openshift.build-strategy=docker >> src/main/resources/application.properties
如果您的 Kamelet 或 KameletBinding 具有如下特征注解: trait.camel.apache.org/environment.vars: "my_key=my_val",那么您必须遵循特征配置部分来使用 Quarkus 属性进行设置。
1.5.1.3.3. 第 3 步 - 构建 复制链接链接已复制到粘贴板!
构建用于本地检查的软件包。
./mvnw -ntp package
./mvnw -ntp package
此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes 目录中生成 Openshift 清单文件。
跟踪 target/kubernetes/openshift.yml,以了解部署到 Openshift 集群的部署。
1.5.1.3.4. 第 4 步 - 构建和部署 复制链接链接已复制到粘贴板!
构建软件包并部署到 Openshift。
./mvnw -ntp package -Dquarkus.openshift.deploy=true
./mvnw -ntp package -Dquarkus.openshift.deploy=true
您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。
1.5.1.3.5. 第 5 步 - 测试 复制链接链接已复制到粘贴板!
验证集成路由是否正常工作。
按照 pod 容器日志进行操作
oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-timer2log-kbind -oname`
oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-timer2log-kbind -oname`
它必须显示类似如下的输出:
1.5.2. 取消部署 kubernetes 资源 复制链接链接已复制到粘贴板!
要删除 quarkus-maven-plugin 安装的所有 resouces,您必须运行以下命令:
oc delete -f target/kubernetes/openshift.yml
oc delete -f target/kubernetes/openshift.yml
1.5.3. Kubernetes CronJob 复制链接链接已复制到粘贴板!
当有类型为 cron、quartz 或 timer 的消费者时,Camel K 具有一个功能。在某些情况下,它会创建一个 kubernetes CronJob 对象而不是常规 部署。这会通过不运行 Deployment Pod 来节省计算资源。
要获取红帽构建的 Apache Camel for Quarkus 的结果,您必须在 src/main/resources/application.properties 中设置以下属性。
quarkus.openshift.deployment-kind=CronJob quarkus.openshift.cron-job.schedule=<your cron schedule> camel.main.duration-max-idle-seconds=1
quarkus.openshift.deployment-kind=CronJob
quarkus.openshift.cron-job.schedule=<your cron schedule>
camel.main.duration-max-idle-seconds=1
您必须将计时器消费者设置为仅执行一次,如下所示:
from("timer:java?delay=0&period=1&repeatCount=1")
from("timer:java?delay=0&period=1&repeatCount=1")
以下是计时器参数:
-
delay=0:启动没有延迟的消费者。 -
period=1:仅运行一次 1s。 -
repeatCount=1: Don't 在第一次运行后运行。