Red Hat Camel K is deprecated
Red Hat Camel K is deprecated and the End of Life date for this product is June 30, 2025. For help migrating to the current go-to solution, Red Hat build of Apache Camel, see the Migration Guide.迁移指南 Camel K 到 Camel Extensions for Quarkus
从 Camel K 迁移到 Camel Extensions for Quarkus
摘要
前言
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 概述
Camel K 设置为弃用,而是使用统一的 Camel 方法进行 OpenShift。以 Red Hat Build of Camel for Quarkus 为目标,我们的目标是为现有客户提供迁移路径,以转换其 Camel K 集成。这种方法可确保无缝迁移到 Apache Camel for Quarkus 的红帽构建,在考虑 Camel K 支持的功能和红帽构建的 Apache Camel for Quarkus 时,需要最少的工作。
您必须了解构建、配置、部署和运行应用程序的 Quarkus 方法。
1.1. 假设
- 要迁移所需的源文件位于 java、xml 或 yaml 中。
- 要部署的目标系统是一个 OpenShift Cluster 4.15+。
- Camel K 版本为 1.10.7。
- 迁移是红帽构建的 Apache Camel for Quarkus。
Camel K 操作使用 Kamel CLI 运行集成,而 Camel K Operator 则管理并部署为运行的 pod 以及各种 Kubernetes 对象,包括 Deployment、Service、Route、ConfigMap、Secret 和 Knative。
运行的 java 程序是 Camel on Quarkus 应用程序。
当使用红帽构建的 Apache Camel for Quarkus 时,起点是一个 Maven 项目,其中包含构建和运行集成所需的所有工件。此项目将包括 Deployment、Service、ConfigMap 和其他资源,虽然它们的配置可能与 Camel K 中的配置不同。例如,属性可能会存储在 application.properties 文件中,并且 Knative 配置可能需要单独的文件。主要目标是确保集成路由已在 OpenShift 集群中部署并运行。
1.1.1. 要求
要执行迁移,需要遵循一组工具和配置。
- Camel JBang 4.7.0.
- JDK 17 或 21。
- Maven (mvn cli) 3.9.5。
- oc cli.
- OpenShift 集群 4.12+。
1.1.2. 超出范围
1.1.3. 使用案例
Camel K 集成可能会有所不同,通常由几个与集成路由和配置对应的文件组成。集成路由可以在 Java、XML 或 YAML 中定义,而配置可以在属性文件或 kamel run
命令中指定。此迁移文档解决 ConfigMap 中涉及 KameletBinding、Kamelet、Knative 和属性的用例。
1.1.4. 版本
Camel K 1.10.7 使用红帽构建的 Apache Camel for Quarkus 的不同 Camel 和 Quarkus 版本。
工件 | Camel K | Red Hat build of Apache Camel for Quarkus |
---|---|---|
JDK | 11 | 21 (首选)、17 (支持) |
Camel | 3.18.6.redhat-00009 | 4.4.0.redhat-00025 |
Camel for Quarkus | 2.13.3.redhat-00011 | 3.8.0.redhat-00006 |
Quarkus 平台 | 2.13.9.SP2-redhat-00003 | 3.8.5.redhat-00003 |
kamelet Catalog | 1.10.7 | 2.3.x |
从 Camel K 迁移到 Apache Camel for Quarkus 构建同时更新多个库。因此,由于底层库的不同,在构建或运行 Apache Camel for Quarkus 中的集成时可能会遇到一些错误。
1.1.5. 项目和机构
Camel K 集成路由源自 java、yaml 或 xml 中的单个文件。没有项目的概念来组织依赖项和构建。结束时,每个 kamel run <my app>
; 都会产生一个正在运行的 pod。
红帽构建的 Apache Camel 需要一个 maven 项目。使用 camel export <many files&
gt; 来生成 maven 项目。在构建项目时,容器镜像包含项目中定义的所有集成路由。
如果需要每个集成路由有一个 pod,您必须为每个集成路由创建一个 maven 项目。虽然有许多复杂方法,使用带有多个集成路由和自定义构建的单一 maven 项目来生成容器镜像来启动 pod,但这超出了此迁移指南的范围。
1.2. 遍历
Camel K 中的特征为 operator 提供了一种简单的方法,从 kamel cli 化参数到 kubernetes 对象和配置。Camel K 1.10 中只支持几个特征,在此迁移路径中涵盖这些特征。不需要涵盖以下特征的迁移路径中的配置: camel, platform, deployment, dependencies, deployer, openapi。
以下列表包含其参数的特征,以及 Red Hat build of Apache Camel for Quarkus 中的等效项。
红帽构建的 Apache Camel for Quarkus 的属性必须在 application.properties
中设置。在构建项目时,位于 target/kubernetes/openshift.yml
中的 kubernetes 必须包含属性。
有关属性的更多信息,请参阅 Quarkus OpenShift Extension。
遍历参数 | Quarkus 参数 |
---|---|
|
将属性添加到 |
遍历参数 | Quarkus 参数 |
---|---|
|
|
| Quarkus 中没有替换,因为此属性用于无源 Camel K 集成,红帽构建的 Apache Camel for Quarkus 中不被支持。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在属性名称中设置端口名称。语法为: |
| 将 quarkus maven 依赖项添加到 pom.xml <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-health</artifactId> </dependency> 它还会将启动探测添加到容器。请注意,延迟、超时和周期值可能会有所不同。 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在属性名称中设置端口名称。语法为:
另外,请确保将路由端口名称设置为 |
遍历参数 | Quarkus 参数 |
---|---|
|
|
|
您必须使用以下值设置代理主机: |
遍历参数 | Quarkus 参数 |
---|---|
| 您必须在集成路由中手动添加 Error Handler。 |
遍历参数 | Quarkus 参数 |
---|---|
|
|
|
|
| 没有替换。 |
|
|
|
编辑 将 camel 日志级别增加到 debug 的示例: ENV JAVA_OPTS="$JAVA_OPTS -Dquarkus.log.category.\"org.apache.camel\".level=debug" 注: Docker 配置依赖于基础镜像,OpenJDK 21 的配置。 |
|
您必须在 maven 项目上设置 classpath,因此依赖项的完整列表将在 |
遍历参数 | Quarkus 参数 |
---|---|
affinity.pod-affinity affinity.pod-affinity-labels affinity.pod-anti-affinity affinity.pod-anti-affinity-labels affinity.node-affinity-labels |
Quarkus 中没有 |
遍历参数 | Quarkus 参数 |
---|---|
|
Quarkus 中没有 |
遍历参数 | Quarkus 参数 |
---|---|
|
对于原生构建,可使用 |
遍历参数 | Quarkus 参数 |
---|---|
|
将 maven 依赖项 quarkus.kubernetes.deployment-target=knative quarkus.container-image.group=<group-name> quarkus.container-image.registry=image-registry.openshift-image-registry.svc:5000
|
|
|
| 在 knative.json 中配置。 |
| 在 knative.json 中配置。 |
| 在 knative.json 中配置。 |
| 在 knative.json 中配置。 |
| 在 knative.json 中配置。 |
| 在 knative.json 中配置。 |
| 在 knative.json 中配置。 |
|
没有替换,您必须创建 |
| 没有替换。 |
|
您必须将标签 |
遍历参数 | Quarkus 参数 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 红帽构建的 Apache Camel for Quarkus 中不需要此行为。 |
遍历参数 | Quarkus 参数 |
---|---|
| 将以下 maven 依赖项添加到 pom.xml <dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-micrometer</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-micrometer-registry-prometheus</artifactId> </dependency>
注: Camel K 创建一个 |
|
|
|
没有可用于设置自定义标签的 quarkus 属性,但您可以在部署前在 |
遍历参数 | Quarkus 参数 |
---|---|
pdb.enabled pdb.min-available pdb.max-unavailable |
|
遍历参数 | Quarkus 参数 |
---|---|
|
|
遍历参数 | Quarkus 参数 |
---|---|
|
|
|
|
|
|
|
|
|
|
| 没有 quarkus 属性从 secret 读取证书。 |
|
|
| 没有从 secret 读取密钥的 quarkus 属性。 |
|
|
| 没有 quarkus 属性从 secret 读取 CA 证书。 |
|
|
| 没有从 secret 读取目标证书的 quarkus 属性。 |
|
|
遍历参数 | Quarkus 参数 |
---|---|
|
|
1.3. kamel run 配置
以下列出的 kamel run
命令中有一个额外的配置参数,以及它们在红帽构建的 Apache Camel for Quarkus 中对应的配置参数,它们必须添加到 src/main/resources/application.properties
或 pom.xml
中。
kamel run 参数 | Quarkus 参数 |
---|---|
|
|
|
在 |
|
在 |
|
|
|
|
|
在 |
|
|
|
|
1.4. kamelets, KameletBindings 和 Pipes
Camel K Operator 捆绑 Kamelets,并将其安装为 kubernetes 对象。对于红帽构建的 Apache Camel for Quarkus 项目,您必须在 maven 项目中管理 kamelets yaml 文件。
管理 kamelets yaml 文件的方法有两种。
-
kamelets 被打包并发布为 maven 工件
org.apache.camel.kamelets:camel-kamelets
。https://github.com/apache/camel-kamelets您可以将这个依赖项添加到pom.xml
中,并在 camel 路由启动时,它会在 classpath 中从该 jar 文件中加载 kamelet yaml 文件。
有开源 kamelet 和由红帽生成的,其工件后缀为 redhat-000nnn
。例如:'1.10.7.redhat-00015'。它们可从 红帽 maven 存储库获取。
2. 将 kamelet yaml 文件添加到 src/main/resources/kamelets
目录中,稍后被打包在最终的可部署工件中。不要在 pom.xml
中声明 org.apache.camel.kamelets:camel-kamelets
。这样,camel 路由会从打包的项目加载 Kamelet yaml 文件。
KameletBinding
被重命名为 Pipe
。因此,请考虑了解用例 3。虽然 kubernetes 资源名称 KameletBinding
仍然被支持,但它已被弃用。我们建议尽快将其重命名为 Pipe
。
我们建议更新 Kamelets,因为 Camel K 1.10.7 开始有很多更新。例如,您可以比较 1.10 和 2.3的 jms-amqp-10-sink.kamelet.yaml。
如果您有自定义 Kamelets,您必须相应地更新它们。
-
将
流
重命名为 Kamelet 文件中的模板
。 -
将
属性
重命名为 bean 属性的属性。
1.4.1. Knative
当在 Camel K 中运行与 Knative 端点的集成路由时,Camel K Operator 会创建一些 Knative 对象,如 SinkBindings
、Trigger
、Subscription
。另外,Camel K Operator 会创建 knative.json
环境文件,需要 camel-knative 组件与集群中部署的 Knative 对象交互。
knative.json 示例
{ "services": [ { "type": "channel", "name": "messages", "url": "{{k.sink}}", "metadata": { "camel.endpoint.kind": "sink", "knative.apiVersion": "messaging.knative.dev/v1", "knative.kind": "Channel", "knative.reply": "false" } } ] }
红帽构建的 Apache Camel for Quarkus 是一个 maven 项目。您必须手动创建这些 Knative 文件并提供额外的配置。如需了解将集成路由与 Knative 端点迁移,请参阅用例 2。
1.4.2. 监控
我们建议您添加自定义标签来标识集群中安装的 kubernetes 对象,以便更轻松地找到这些 kubernetes。默认情况下,quarkus openshift 扩展会添加标签 app.kubernetes.io/name=<app name
>,以便您可以搜索使用此标签创建的对象。
为了监控目的,您可以使用 HawtIO diagnose 控制台 来监控 Camel 应用程序。
1.5. 迁移过程
迁移过程由以下步骤组成:
任务 | 描述 |
---|---|
创建 maven 项目 | 使用 Camel JBang 的 camel cli 导出文件,它将创建一个 maven 项目。 |
调整配置 | 通过添加和更改文件来配置项目。 |
Build | 构建项目将生成 JAR 文件。构建容器镜像并推送到容器注册表。 |
部署 | 将 kubernetes 对象部署到 Openshift 集群并运行 pod。 |
1.5.1. 迁移步骤
1.5.1.1. 使用案例 1 - 使用配置简单集成路由
根据以下集成路由,带有 rest 和 kamelet 端点。
import org.apache.camel.builder.RouteBuilder; public class Http2Jms extends RouteBuilder { @Override public void configure() throws Exception { rest() .post("/message") .id("rest") .to("direct:jms"); from("direct:jms") .log("Sending message to JMS {{broker}}: ${body}") .to("kamelet:jms-amqp-10-sink?remoteURI=amqp://myhost:61616&destinationName=queue"); } }
http2jms.properties 文件
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
它使用注解构建并运行 pod。环境变量和属性文件作为 ConfigMap 添加并挂载到 pod 中。
1.5.1.1.1. 第 1 步 - 创建 maven 项目
使用 camel jbang 将文件导出到 maven 项目。
camel export \ --runtime=quarkus \ --quarkus-group-id=com.redhat.quarkus.platform \ --quarkus-version=3.8.5.redhat-00003 \ --repos=https://maven.repository.redhat.com/ga \ --dep=io.quarkus:quarkus-openshift \ --gav=com.mycompany:ceq-app:1.0 \ --dir=ceq-app1 \ Http2Jms.java
参数的描述:
参数 | 描述 |
---|---|
| 使用 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
设置 docker
构建策略。
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
将 pom.xml 中的编译器版本更改为 21 (可选)
<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
如果要使用这些参数自定义镜像和容器 registry 设置:
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
将以下属性添加到 application.properties
,以便 Quarkus 挂载 ConfigMap
。
quarkus.openshift.app-config-map=ceq-app
1.5.1.1.3. 第 3 步 - 构建
构建用于本地检查的软件包。
./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
您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。
1.5.1.1.5. 第 5 步 - 测试
验证集成路由是否正常工作。
如果项目可以在本地运行,您可以尝试以下操作:
mvn -ntp quarkus:run
按照 pod 容器日志进行操作
oc logs -f `oc get pod -l app.kubernetes.io/name=app -oname`
它必须显示类似如下的输出:
INFO exec -a "java" java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -cp "." -jar /deployments/quarkus-run.jar INFO running in /deployments __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting [org.apa.cam.mai.BaseMainSupport] (main) Property-placeholders summary [org.apa.cam.mai.BaseMainSupport] (main) [MicroProfilePropertiesSource] broker=amqp://172.30.177.216:61616 [org.apa.cam.mai.BaseMainSupport] (main) [MicroProfilePropertiesSource] queue=qtest [org.apa.cam.mai.BaseMainSupport] (main) [ms-amqp-10-sink.kamelet.yaml] destinationName=qtest [org.apa.cam.mai.BaseMainSupport] (main) [ms-amqp-10-sink.kamelet.yaml] connectionFactoryBean=connectionFactoryBean-1 [org.apa.cam.mai.BaseMainSupport] (main) [ms-amqp-10-sink.kamelet.yaml] remoteURI=amqp://172.30.177.216:61616 [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:3) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started route1 (direct://jms) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started rest (rest://post:/message) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started jms-amqp-10-sink-1 (kamelet://source) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 17ms (build:0ms init:0ms start:17ms) [io.quarkus] (main) app 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.115s. Listening on: http://0.0.0.0:8080 [io.quarkus] (main) Profile prod activated. [io.quarkus] (main) Installed features: [camel-amqp, camel-attachments, camel-core, camel-direct, camel-jms, camel-kamelet, camel-microprofile-health, camel-platform-http, camel-rest, camel-rest-openapi, camel-yaml-dsl, cdi, kubernetes, qpid-jms, smallrye-context-propagation, smallrye-health, vertx]
请参阅 MicroProfilePropertiesSource
行,它显示添加为 ConfigMap 的属性文件的内容,并挂载到容器集。
1.5.1.2. 使用案例 2 - Knative 集成路由
这个用例有两个 Knative 集成路由。Feed
路由定期向 Knative 频道发送文本信息,第二个路由 Printer
接收来自 Knative 频道的信息并打印它。
对于 Camel K,有两个 pod,各自运行一个集成路由。因此,此迁移必须创建两个项目,各自具有一个集成路由。
之后,您可以将其自定义为单一 pod 中具有两个集成路由的单个 maven 项目。
Feed
集成路由。
import org.apache.camel.builder.RouteBuilder; public class Feed extends RouteBuilder { @Override public void configure() throws Exception { from("timer:clock?period=15s") .setBody().simple("Hello World from Camel - ${date:now}") .log("sent message to messages channel: ${body}") .to("knative:channel/messages"); } }
打印机
集成路由。
import org.apache.camel.builder.RouteBuilder; public class Printer extends RouteBuilder { @Override public void configure() throws Exception { from("knative:channel/messages") .convertBodyTo(String.class) .to("log:info"); } }
kamel run 命令显示如何使用 Camel K 运行。
kamel run Feed.java kamel run Printer.java
将有两个 pod 正在运行。
1.5.1.2.1. 第 1 步 - 创建 maven 项目
使用 camel jbang 将文件导出到完整的 maven 项目
导出 源
集成。
camel export \ --runtime=quarkus \ --quarkus-group-id=com.redhat.quarkus.platform \ --quarkus-version=3.8.5.redhat-00003 \ --repos=https://maven.repository.redhat.com/ga \ --dep=io.quarkus:quarkus-openshift \ --gav=com.mycompany:ceq-feed:1.0 \ --dir=ceq-feed \ Feed.java
导出 打印机
集成。
camel export \ --runtime=quarkus \ --quarkus-group-id=com.redhat.quarkus.platform \ --quarkus-version=3.8.5.redhat-00003 \ --repos=https://maven.repository.redhat.com/ga \ --dep=io.quarkus:quarkus-openshift \ --gav=com.mycompany:ceq-printer:1.0 \ --dir=ceq-printer \ Printer.java
将为每个集成创建一个 maven 项目。
1.5.1.2.2. 第 2 步 - 配置项目
此步骤是配置 maven 项目和工件以适合您的环境。使用案例 1 包含有关 ConfigMap 中的标签、注解和配置的信息。
进入 maven 项目
cd ceq-feed
设置 docker
构建策略。
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
将 pom.xml 中的编译器版本更改为 21 (可选)
<maven.compiler.release>21</maven.compiler.release>
将 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>
在 application.properties
中添加以下属性,以允许 Knative 控制器将 K_SINK
环境变量注入部署。
quarkus.openshift.labels."bindings.knative.dev/include"=true
在 src/main/resources
中添加 knative.json
。这是 Camel 连接到 Knative 频道所需的配置。
有 k.sink
属性占位符。当 pod 运行时,它将查看名为 K_SINK
的环境变量,并在 url
值中替换。
{ "services": [ { "type": "channel", "name": "messages", "url": "{{k.sink}}", "metadata": { "camel.endpoint.kind": "sink", "knative.apiVersion": "messaging.knative.dev/v1", "knative.kind": "Channel", "knative.reply": "false" } } ] }
添加以下属性以允许 Camel 加载 Knative 环境配置。
camel.component.knative.environmentPath=classpath:knative.json
要使注入工作,您必须创建一个 Knative SinkBinding
对象。
将 SinkBinding
文件添加到 src/main/kubernetes/openshift.yml
cat <<EOF >> src/main/kubernetes/openshift.yml apiVersion: sources.knative.dev/v1 kind: SinkBinding metadata: finalizers: - sinkbindings.sources.knative.dev name: ceq-feed spec: sink: ref: apiVersion: messaging.knative.dev/v1 kind: Channel name: messages subject: apiVersion: apps/v1 kind: Deployment name: ceq-feed EOF
现在,配置 ceq-printer
项目。
cd ceq-printer
设置 docker
构建策略。
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
将 pom.xml 中的编译器版本更改为 21 (可选)
<maven.compiler.release>21</maven.compiler.release>
将 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>
在 src/main/resources
中添加 knative.json
。这是 Camel 连接到 Knative 频道所需的配置。
{ "services": [ { "type": "channel", "name": "messages", "path": "/channels/messages", "metadata": { "camel.endpoint.kind": "source", "knative.apiVersion": "messaging.knative.dev/v1", "knative.kind": "Channel", "knative.reply": "false" } } ] }
添加以下属性以允许 Camel 加载 Knative 环境配置。
camel.component.knative.environmentPath=classpath:knative.json
从频道到 sink 的消息发送需要 Knative 订阅
。
将 Subscription
文件添加到 src/main/kubernetes/knative.yml
apiVersion: messaging.knative.dev/v1 kind: Subscription metadata: finalizers: - subscriptions.messaging.knative.dev name: ceq-printer spec: channel: apiVersion: messaging.knative.dev/v1 kind: Channel name: messages subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: ceq-printer uri: /channels/messages
1.5.1.2.3. 第 3 步 - 构建
构建用于本地检查的软件包。
./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
您可以跟踪 maven 输出中的镜像构建。构建后,您可以看到 pod 正在运行。
1.5.1.2.5. 第 5 步 - 测试
验证集成路由是否正常工作。
按照 pod 容器日志进行操作
oc logs -f `oc get pod -l app.kubernetes.io/name=ceq-feed -oname`
它必须显示类似如下的输出:
CEQ-feed pod
INFO exec -a "java" java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -cp "." -jar /deployments/quarkus-run.jar INFO running in /deployments __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting [org.apa.cam.mai.BaseMainSupport] (main) Auto-configuration summary [org.apa.cam.mai.BaseMainSupport] (main) [MicroProfilePropertiesSource] camel.component.knative.environmentPath=classpath:knative.json [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting [org.apa.cam.mai.BaseMainSupport] (main) Property-placeholders summary [org.apa.cam.mai.BaseMainSupport] (main) [OS Environment Variable] k.sink=http://hello-kn-channel.cmiranda-camel.svc.cluster.local [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:1) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started route1 (timer://clock) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 43ms (build:0ms init:0ms start:43ms) [io.quarkus] (main) ceq-feed 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.386s. Listening on: http://0.0.0.0:8080 [io.quarkus] (main) Profile prod activated. [io.quarkus] (main) Installed features: [camel-attachments, camel-cloudevents, camel-core, camel-knative, camel-platform-http, camel-rest, camel-rest-openapi, camel-timer, cdi, kubernetes, smallrye-context-propagation, vertx] [route1] (Camel (camel-1) thread #1 - timer://clock) sent message to hello channel: Hello World from Camel - Thu Aug 01 13:54:41 UTC 2024 [route1] (Camel (camel-1) thread #1 - timer://clock) sent message to hello channel: Hello World from Camel - Thu Aug 01 13:54:56 UTC 2024 [route1] (Camel (camel-1) thread #1 - timer://clock) sent message to hello channel: Hello World from Camel - Thu Aug 01 13:55:11 UTC 2024
请参阅 Property-placeholders
。它显示 k.sink
属性值。
CEQ-printer pod
INFO exec -a "java" java -Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager -cp "." -jar /deployments/quarkus-run.jar INFO running in /deployments __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting [org.apa.cam.mai.BaseMainSupport] (main) Auto-configuration summary [org.apa.cam.mai.BaseMainSupport] (main) [MicroProfilePropertiesSource] camel.component.knative.environmentPath=classpath:knative.json [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:1) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started route1 (knative://channel/hello) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 10ms (build:0ms init:0ms start:10ms) [io.quarkus] (main) ceq-printer 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.211s. Listening on: http://0.0.0.0:8080 [io.quarkus] (main) Profile prod activated. [io.quarkus] (main) Installed features: [camel-attachments, camel-cloudevents, camel-core, camel-knative, camel-log, camel-platform-http, camel-rest, camel-rest-openapi, cdi, kubernetes, smallrye-context-propagation, vertx] [info] (executor-thread-1) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World from Camel - Thu Aug 01 13:54:41 UTC 2024] [info] (executor-thread-1) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World from Camel - Thu Aug 01 13:54:56 UTC 2024] [info] (executor-thread-1) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello World from Camel - Thu Aug 01 13:55:11 UTC 2024]
1.5.1.3. 使用案例 3 - Pipe
将以下集成路由指定为 KameletBinding。
apiVersion: camel.apache.org/v1alpha1 kind: KameletBinding metadata: name: sample spec: source: ref: kind: Kamelet apiVersion: camel.apache.org/v1alpha1 name: timer-source properties: period: 5000 contentType: application/json message: '{"id":"1","field":"hello","message":"Camel Rocks"}' steps: - ref: kind: Kamelet apiVersion: camel.apache.org/v1alpha1 name: extract-field-action properties: field: "message" sink: ref: kind: Kamelet apiVersion: camel.apache.org/v1 name: log-sink properties: showStreams: true
1.5.1.3.1. 第 1 步 - 创建 maven 项目
使用 camel jbang 将文件导出到 maven 项目。
camel export \ --runtime=quarkus \ --quarkus-group-id=com.redhat.quarkus.platform \ --quarkus-version=3.8.5.redhat-00003 \ --repos=https://maven.repository.redhat.com/ga \ --dep=io.quarkus:quarkus-openshift \ --gav=com.mycompany:ceq-timer2log-kbind:1.0 \ --dir=ceq-timer2log-kbind \ timer-2-log-kbind.yaml
您可以使用 camel export --help
查看更多参数
1.5.1.3.2. 第 2 步 - 配置项目
这是配置 maven 项目和工件以适合您的环境的步骤。
您可以遵循常见配置的用例 1 和 2,我们将提供 KameletBinding 配置所需的步骤。
您可以尝试使用 camel jbang 在本地运行集成路由,以了解它在构建和部署到 Openshift 前如何工作。
进入 maven 项目
cd ceq-timer2log-kbind
请参阅关于如何管理 Kamelets 的开头的备注。对于此迁移用例,我在 pom.xml
中使用 org.apache.camel.kamelets:camel-kamelets
依赖项。
在导出时,它会在 application.properties
中添加以下属性,但您可以将其删除。
quarkus.native.resources.includes camel.main.routes-include-pattern
设置 docker
构建策略。
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
此步骤在本地构建 maven 工件(JAR 文件),并在 target/kubernetes
目录中生成 Openshift 清单文件。
跟踪 target/kubernetes/openshift.yml
,以了解部署到 Openshift 集群的部署。
1.5.1.3.4. 第 4 步 - 构建和部署
构建软件包并部署到 Openshift。
./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`
它必须显示类似如下的输出:
[org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) Bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [org.apa.cam.mai.MainSupport] (main) Apache Camel (Main) 4.4.0.redhat-00025 is starting [org.apa.cam.cli.con.LocalCliConnector] (main) Management from Camel JBang enabled [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) is starting [org.apa.cam.mai.BaseMainSupport] (main) Property-placeholders summary [org.apa.cam.mai.BaseMainSupport] (main) [timer-source.kamelet.yaml] period=5000 [org.apa.cam.mai.BaseMainSupport] (main) [timer-source.kamelet.yaml] message={"id":"1","field":"hello","message":"Camel Rocks"} [org.apa.cam.mai.BaseMainSupport] (main) [timer-source.kamelet.yaml] contentType=application/json [org.apa.cam.mai.BaseMainSupport] (main) [log-sink.kamelet.yaml] showStreams=true [org.apa.cam.mai.BaseMainSupport] (main) [ct-field-action.kamelet.yaml] extractField=extractField-1 [org.apa.cam.mai.BaseMainSupport] (main) [ct-field-action.kamelet.yaml] field=message [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup (started:4) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started sample (kamelet://timer-source) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started timer-source-1 (timer://tick) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started log-sink-2 (kamelet://source) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started extract-field-action-3 (kamelet://source) [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 4.4.0.redhat-00025 (camel-1) started in 276ms (build:0ms init:0ms start:276ms) [io.quarkus] (main) ceq-timer2log-kbind 1.0 on JVM (powered by Quarkus 3.8.5.redhat-00004) started in 1.867s. Listening on: http://0.0.0.0:8080 [io.quarkus] (main) Profile prod activated. [io.quarkus] (main) Installed features: [camel-attachments, camel-cli-connector, camel-console, camel-core, camel-direct, camel-jackson, camel-kamelet, camel-log, camel-management, camel-microprofile-health, camel-platform-http, camel-rest, camel-rest-openapi, camel-timer, camel-xml-jaxb, camel-yaml-dsl, cdi, kubernetes, smallrye-context-propagation, smallrye-health, vertx] [log-sink] (Camel (camel-1) thread #2 - timer://tick) Exchange[ExchangePattern: InOnly, BodyType: org.apache.camel.converter.stream.InputStreamCache, Body: "Camel Rocks"]
1.5.2. 取消部署 kubernetes 资源
要删除 quarkus-maven-plugin 安装的所有 resouces,您必须运行以下命令:
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
您必须将计时器消费者设置为仅执行一次,如下所示:
from("timer:java?delay=0&period=1&repeatCount=1")
以下是计时器参数:
-
delay=0
:启动没有延迟的消费者。 -
period=1
:仅运行一次 1s。 -
repeatCount=1
: Don't 在第一次运行后运行。
1.6. 故障排除
1.6.1. 产品支持
如果您在迁移过程中遇到任何问题,您可以创建一个支持问题单,我们将帮助您解决问题。
1.6.2. 忽略使用 camel jbang 导出时的加载错误
使用 camel jbang 导出时,可能无法加载路由。在这里,您可以使用 --ignore-loading-error
参数,如下所示:
camel export --ignore-loading-error <parameters>
1.6.3. 增加日志记录
您可以通过在 org.apache.camel.component.knative
类别的 application.properties
中的以下属性设置为 debug 级别来设置类别日志记录。
quarkus.log.category."org.apache.camel.component.knative".level=debug
1.6.4. 禁用健康检查
您的应用 Pod 可能会失败,CrashLoopBackOff
,日志 Pod 会出现以下错误:
Get "http://127.0.0.1:8080/q/health/ready": dial tcp 127.0.0.1:8080: connect: connection refused
如果您不希望容器健康检查,您可以通过从 pom.xml 中删除这个 maven 依赖项来禁用容器健康检查
<dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-microprofile-health</artifactId> </dependency>
1.7. 已知问题
有几个与迁移集成路由相关的已知问题及其临时解决方案。这些临时解决方案不是红帽构建的 Apache Camel for Quarkus 的限制,而是迁移过程的一部分。迁移完成后,生成的 Maven 项目可以自定义以满足客户的需求。
1.7.1. Camel K 功能在 Camel for Quarkus 中不可用
一些 Camel K 功能在 Quarkus 或 Camel 中不能作为 quarkus 属性提供。这些功能可能需要额外的配置步骤,以便在红帽构建的 Apache Camel for Quarkus 中构建和部署时获得相同的功能。
1.7.1.1. 所有者 Trait
owner trait 为所有创建的资源设置 kubernetes owner 字段,简化了跟踪谁创建了 kubernetes 资源的过程。
一个 open Quarkus 问题 #13952 请求此功能。
没有临时解决方案来设置所有者字段。
1.7.1.2. 关联性 Trait
节点关联性特征 允许您限制调度集成 pod 运行的节点。
存在一个开放的 Quarkus 问题,请求 此功能。
解决办法是在 maven 软件包步骤后实施后处理任务,将关联性配置添加到 target/kubernetes/openshift.yml
中。
1.7.1.3. PodDisruptionBudget Trait
PodDisruptionBudget trait 允许为集成 pod 配置 PodDisruptionBudget 资源。
Quarkus 中有配置来生成 PodDisruptionBudget
资源。
解决办法是在 maven 软件包步骤后实施后处理任务,将 PodDisruptionBudget
配置添加到 target/kubernetes/openshift.yml
中。
1.7.2. Camel Jbang 无法添加 camel-quarkus-direct 依赖项
如果集成路由包含 rest
和一个 直接
端点,如下例所示,请验证 pom.xml
是否包含 camel-quarkus-direct
依赖项。如果缺少,您必须添加它。
rest() .post("/message") .id("rest") .to("direct:foo"); from("direct:foo") .log("hello");
camel-quarkus-direct
依赖项,以添加到 pom.xml
<dependency> <groupId>org.apache.camel.quarkus</groupId> <artifactId>camel-quarkus-direct</artifactId> </dependency>
1.7.3. Quarkus 构建失败并显示
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
客户端不信任服务器证书。因此,您必须将服务器公钥添加到客户端,或信任服务器证书。如果要测试,您可以在 src/main/resources/application.properties
中添加以下属性并重建它。
quarkus.kubernetes-client.trust-certs=true
1.7.4. Camel Jbang 无法导出路由
当路由包含 kamelet 端点时,Camel Jbang 无法导出路由,该端点由 bean 支持。如果端点包含 kamelet,带有属性占位符 {{broker}}
,且在 kamelet 中有一个 type: " installationclass:org.apache.qpid.jms.jms.JmsConnectionFactory"
来初始化 camel 组件,它可能会失败。
from("direct:jms") .to("kamelet:jms-amqp-10-sink?remoteURI={{broker}}&destinationName={{queue}}");
此错误由以下错误组成:
org.apache.camel.RuntimeCamelException: org.apache.camel.VetoCamelContextStartException: Failure creating route from template: jms-amqp-10-sink Caused by: org.apache.camel.VetoCamelContextStartException: Failure creating route from template: jms-amqp-10-sink Caused by: org.apache.camel.component.kamelet.FailedToCreateKameletException: Error creating or loading Kamelet with id jms-amqp-10-sink (locations: classpath:kamelets,github:apache:camel-kamelets/kamelets) Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route jms-amqp-10-sink-1 at: >>> To[jms:{{destinationType}}:{{destinationName}}?connectionFactory=#bean:{{connectionFactoryBean}}] Caused by: org.apache.camel.ResolveEndpointFailedException: Failed to resolve endpoint: jms://Queue:$%7Bqueue%7D?connectionFactory=%23bean%3AconnectionFactoryBean-1 due to: Error binding property (connectionFactory=#bean:connectionFactoryBean-1) Caused by: org.apache.camel.PropertyBindingException: Error binding property (connectionFactory=#bean:connectionFactoryBean-1) with name: connectionFactory on bean: Caused by: java.lang.IllegalStateException: Cannot create bean: #class:org.apache.qpid.jms.JmsConnectionFactory Caused by: org.apache.camel.PropertyBindingException: Error binding property (remoteURI=@@[broker]@@) with name: remoteURI on bean: org.apache.qpid.jms.JmsConnectionFactory@a2b54e3 with value: @@[broker]@@ Caused by: java.lang.IllegalArgumentException: Invalid remote URI: @@[broker]@@ Caused by: java.net.URISyntaxException: Illegal character in path at index 2: @@[broker]@@
如何修复:
将 kamelet 端点 {{broker}}
和 {{queue}}
中的属性占位符替换为任何值,例如: remoteURI=broker&destinationName=queue
。现在,导出该文件,您可以在 src/main/ 目录中的导出路由中添加属性占位符。
1.8. 参考文档
有关 Camel 产品的详情,请参考以下链接:
- 红帽构建的 Apache Camel for Quarkus 版本
- Red Hat build of Apache Camel for Quarkus 文档,包括迁移到 Camel Spring Boot
- Camel K 文档
- 将 Camel Spring Boot 应用程序部署到 OpenShift
- 部署红帽构建的 Apache Camel for Quarkus 应用程序
- 将红帽构建的 Quarkus 应用程序部署到 OpenShift Container Platform
- 红帽构建的 Quarkus 开发人员资源
- Kubernetes 的 Quarkus 配置
- Openshift 的 Quarkus 配置