Camel CLI

Camel Kubernetes 插件

师成师成· 更新于 2026-09-28· 阅读 49 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Camel Kubernetes 插件

将 Camel 集成导出、构建、推送并部署到 Kubernetes —— 先在本地使用 Camel CLI 进行开发,然后推广到任意集群。

前提条件:已安装 kubectl,并已连接到 Kubernetes 集群(远程集群、Kind 或 Minikube)。

启用该插件:

camel plugin add kubernetes
运行 camel kubernetes --help 查看所有子命令。

Kubernetes 导出

将一个 Maven 项目导出为包含 Kubernetes 清单文件(kubernetes.yml)的项目,其中包含 Deployment、Service、ConfigMap 以及其他资源:

camel kubernetes export route.yaml --dir some/path/to/project

默认运行时为 Quarkus(--runtime=quarkus)。构建并部署:

./mvnw package -Dquarkus.container-image.build=true
./mvnw package -Dquarkus.kubernetes.deploy=true
camel kubernetes run 命令将导出、构建、推送和部署整合为一个步骤。

export 命令提供了多个选项来自定义项目:

选项说明
--service-account用于运行应用程序的服务账号。
--dependency添加需要包含的依赖。Camel 组件使用 "camel:" 前缀,Maven 依赖使用 "mvn:org.my1.0"。
--build-propertyMaven/Gradle 构建属性(语法:--build-property=prop1=foo)
--property添加运行时属性,或从文件中添加属性(语法:[my-key=my-value\file:/path/to/my-conf.properties,/path/to/my-conf.properties])。
--config从 ConfigMap 或 Secret 添加运行时配置(语法:[configmap,secret]:name[/key],其中 name 表示 configmap/secret 的名称,key 可选,表示要过滤的 configmap/secret 键)。
--resource从 ConfigMap 或 Secret 添加运行时资源(语法:[configmap,secret]:name[/key][@path],其中 name 表示 configmap/secret 的名称,key 可选,表示要过滤的 configmap/secret 键,path 表示目标路径)。
--open-api添加 OpenAPI 规范(语法:[configmap,file]:name)。
--env在集成容器中设置环境变量,例如 "--env MY_VAR=my-value"。
--volume将卷挂载到集成容器中,例如 "--volume pvcname:/container/path"。
--connect集成需要绑定的 Service,格式为 [[apigroup/]version:]kind:[namespace/]name。
--source将源文件添加到集成中,该文件会被追加到作为命令参数列出的文件列表中。
--annotation为集成添加注解。使用名称-值对,例如 "--annotation my.company=hello"。
--label为集成添加标签。使用名称-值对,例如 "--label my.company=hello"。
--trait为集成添加 trait 配置。使用名称-值对,例如 "--trait trait.name.config=hello"。
--image外部构建的镜像(例如通过 CI/CD 构建)。启用该选项将跳过集成构建阶段。
--image-registry用于存放应用容器镜像的镜像仓库。
--image-group用于推送镜像的镜像仓库分组。
--image-builder用于构建容器镜像的构建器(例如 docker、jib、s2i)。
--image-platform目标平台列表。每个平台由操作系统和架构定义(例如 linux/amd64)。
--base-image用于构建容器镜像的基础镜像(默认为 eclipse-temurin:<java-version>)。
--registry-mirror构建容器镜像时可选的 Docker 镜像仓库镜像,用于拉取镜像。
--cluster-type目标集群类型。不同的集群类型(如 Kind 或 Minikube)可能会应用特殊的配置。
--profile开发者 profile,用于在配置文件中使用特定配置,配置文件采用 application-<profile>.properties 的命名方式。
运行 camel kubernetes export --help 查看所有选项(包括继承的 Camel CLI export 选项)。

健康探针

导出默认包含 camel-observability-services,该组件会为健康探针添加 /observe 前缀:

  • Quarkus:/observe/health/live、/observe/health/ready、/observe/health/started
  • Spring Boot:/observe/health/liveness、/observe/health/readiness

Kubernetes 清单选项

使用 trait(来自 Camel K)自定义 Kubernetes 清单。trait 配置的优先级顺序:

  1. --trait 命令行选项
  2. 前缀为 trait.camel.apache.org/* 的注解
  3. application-<profile>.properties 中前缀为 camel.jbang.trait.* 的属性
  4. application.properties 中前缀为 camel.jbang.trait.* 的属性

Container trait

自定义容器规格(镜像、端口、资源):

属性类型描述
container.portint配置容器暴露的不同端口(默认 8080)。
container.port-namestring为容器暴露的端口配置不同的端口名称。仅当 expose 参数为 true 时,该名称默认为 http。
container.service-portint配置容器端口将通过哪个服务端口对外暴露(默认 80)。
container.service-port-namestring配置容器端口将通过哪个服务端口名称对外暴露(默认 http)。
container.namestring应用容器的名称。
container.imagestringDeployment 所使用的应用容器镜像。
container.image-pull-policyPullPolicy镜像拉取策略:Always\Never\IfNotPresent
container.image-pull-secretsstring[]用于私有镜像仓库的拉取密钥
container.request-cpustring所需的最小 CPU 数量。
container.request-memorystring所需的最小内存量。
container.limit-cpustring所允许的最大 CPU 数量。
container.limit-memorystring所允许的最大内存量。

示例:

camel kubernetes export Sample.java --trait container.name=my-container --trait container.port=8088 --trait container.request-cpu=0.005 --trait container.request-memory=100Mi

CronJob trait

生成 CronJob 而不是 Deployment(需要 enabled=true 且指定 schedule):

camel kubernetes export Sample.java --trait=cronjob.enabled=true --trait=cronjob.schedule="* * * * 2"
属性类型描述
cronjob.enabledboolean生成 CronJob 清单而非 Deployment 清单。(默认=false)
cronjob.schedulestring设置按照 crontab 格式运行工作负载的调度时间。
cronjob.timezonestring设置运行工作负载的时区。
cronjob.startingDeadlineSecondsinteger设置 CronJob 的 StartingDeadlineSeconds 字段。
cronjob.activeDeadlineSecondsinteger设置 CronJob 的 ActiveDeadlineSeconds 字段。
cronjob.backoffLimitinteger设置 CronJob 的 BackoffLimit 字段。
cronjob.durationMaxIdleSecondsinteger设置 camel.main.duration-max-idle-seconds 属性,用于指定 Camel 在自动终止 JVM 之前可以空闲的秒数。(默认 1)

标签与注解

默认情况下,资源带有设置为项目名称的 app.kubernetes.io/name 标签。添加自定义标签与注解:

camel kubernetes export Sample.java --annotation project.team=camel-experts --label env=staging

环境变量

使用 --trait environment.vars=KEY=VALUE 或快捷方式 --env KEY=VALUE 设置环境变量:

camel kubernetes export Sample.java --env MY_ENV=foo --env FOO_ENV=bar

Service trait

当路由暴露 HTTP 端点(例如 platform-http)时,会自动生成 Service 资源。可对其进行自定义:

属性类型描述
service.typestring要使用的服务类型,可选 'ClusterIP'、'NodePort' 或 'LoadBalancer'。
container.service-portint配置容器端口在哪个服务端口下对外暴露(默认 80)。
container.service-port-namestring配置容器端口在哪个服务端口名称下对外暴露(默认 http)。

Knative service trait

使用 Knative serving 运行无服务器工作负载,支持自动扩缩容和缩容至零。

默认禁用 —— 使用 --trait knative-service.enabled=true 启用。

属性 类型 描述

knative-service.enabled

bool

用于启用或禁用某个 trait。所有 trait 都共享这个通用属性。

knative-service.annotations

map[string]string

添加到路由上的注解。可用于设置 Knative Service 特有的注解。CLI 使用示例:-t "knative-service.annotations.'haproxy.router.openshift.io/balance'=true"

knative-service.class

string

配置 Knative 自动扩缩容的 class 属性(例如,设置 hpa.autoscaling.knative.dev 或 kpa.autoscaling.knative.dev 自动扩缩容)。

更多信息请参阅 Knative 文档。

knative-service.autoscaling-metric

string

配置 Knative 自动扩缩容的 metric 属性(例如,设置基于 concurrency 或基于 cpu 的自动扩缩容)。

更多信息请参阅 Knative 文档。

knative-service.autoscaling-target

int

设置每个 Pod 允许的并发级别或 CPU 百分比(取决于所选的自动扩缩容指标)。

更多信息请参阅 Knative 文档。

knative-service.min-scale

int

该集成在任何时刻都应保持运行的最小 Pod 数量。默认为 零,即当集成在配置的一段时间内未被使用时,会被缩容至零。

更多信息请参阅 Knative 文档。

knative-service.max-scale

int

该集成可并行运行的 Pod 数量上限。Knative 自身还有一个上限值,具体取决于安装环境。

更多信息请参阅 Knative 文档。

knative-service.rollout-duration

string

可逐步将流量转移到最新的 Revision,并设置发布时长。默认禁用,必须以 Golang time.Duration 字符串形式表示,并四舍五入到秒的精度。

knative-service.visibility

string

设置为 cluster-local 时,Knative 服务将成为私有服务。具体来说,该选项会为 Knative 服务应用 networking.knative.dev/visibility 标签。

更多信息请参阅 Knative 文档。

knative-service.timeout-seconds

int

请求实例被允许响应请求的最长时长(秒)。该字段会传递到集成 Pod 的 terminationGracePeriodSeconds。

更多信息请参阅 Knative 文档。

Knative 组件 trait

配置 Camel Knative 组件,以便与 Knative eventing 和 Knative serving 交互。导出操作会自动配置该组件以及 Kubernetes 清单。

默认禁用 —— 可通过 --trait knative.enabled=true 启用。

属性 类型 描述

knative.enabled

bool

可用于启用或禁用某个 trait。(默认值:true)

knative.configuration

string

可用于注入 JSON 格式的完整 Knative 配置

knative.channel-sinks

[]string

作为 Camel 路由目标的 channel 列表。可以是简单的 channel 名称,也可以是完整的 Camel URI。

更多信息请参阅 Knative 文档。

knative.channel-sources

[]string

作为 Camel 路由来源的 channel 列表。可以是简单的 channel 名称,也可以是完整的 Camel URI。

knative.endpoint-sinks

[]string

作为 Camel 路由目标的 endpoint 列表。可以是简单的 endpoint 名称,也可以是完整的 Camel URI。

knative.endpoint-sources

[]string

作为 Camel 路由来源的 endpoint 列表。可以是简单的 endpoint 名称,也可以是完整的 Camel URI。

knative.event-sinks

[]string

作为集成路由目标的 endpoint 列表。可以是简单的 endpoint 名称,也可以是完整的 Camel URI。

knative.event-sources

[]string

集成将订阅的事件类型列表。可以是简单的事件类型,也可以是完整的 Camel URI(用于使用不同于 "default" 的特定 broker)。

knative.sink-binding

bool

允许通过 Knative SinkBinding 资源将集成绑定到某个 sink。当集成指向单个 sink 时可以使用该选项。当集成指向单个 sink 时默认启用(集成由 Knative source 拥有的情况除外)。

knative.filters

[]string

设置事件流上的过滤属性(例如事件类型、来源、主题等)。这是一个由过滤属性及其值组成的键值对列表,语法为 KEY=VALUE,例如 source="my.source"。这些过滤属性会被设置到作为该集成一部分而创建的 Knative Trigger 上。

knative.filter-event-type

bool

启用 Knative Trigger 基于事件类型的默认过滤。如果该值为 true,且未给出其他过滤条件,则创建的 Knative Trigger 会使用事件类型作为事件流的过滤条件。(默认值:true)

Knative trigger

当路由从 knative:event 消费消息时,插件会自动在清单中生成一个 Knative Trigger:

- route:
    from:
      uri: knative:event/camel.evt.type
      parameters:
        name: my-broker
      steps:
        - to:
            uri: log:info

使用 camel kubernetes export knative-route.yaml 导出 —— Trigger、Service 以及 knative.json 配置都会自动生成。

Knative 通道订阅

类似地,从 knative:channel/my-channel 消费的路由会自动在清单中生成 Knative Subscription,knative.json 配置也是自动生成的。

Knative Sink 绑定

向 knative:event、knative:channel 或 knative:endpoint 生产消息的路由会自动在清单中获得一个 SinkBinding 资源。Knative 在部署时通过 K_SINK 环境变量注入目标 URL,因此路由无需知道实际的 URL。=== 挂载 trait

配置来自 ConfigMap、Secret 和 PVC 的卷挂载。快捷方式:--volume、--config、--resource。

属性类型说明
mount.configs[]string指向 configmap/secret 的配置列表。这些配置应为 UTF-8 资源,因为它们由运行时的 Camel Context 处理,并尝试按属性文件解析。它们也会被放入 classpath 中,以便在 Route 中直接使用。语法:[configmap\secret]:name[/key],其中 name 表示资源名称,key(可选)表示要过滤的资源键
mount.resources[]string指向 configmap/secret 的资源列表(文本或二进制内容)。这些资源可以是任意资源类型(文本或二进制内容)。目标路径可以是默认位置,也可以是用户指定的任意路径。语法:[configmap\secret]:name[/key][@path],其中 name 表示资源名称,key(可选)表示要过滤的资源键,path 表示目标路径
mount.volumes[]string要挂载的持久卷声明(Persistent Volume Claims)列表。语法:[pvcname:/container/path]

示例:

camel kubernetes export Sample.java --config secret:my-credentials --resource configmap:my-data --volume my-pvc:/container/path

挂载路径遵循 Camel 约定:配置文件挂载到 /etc/camel/conf.d/,资源文件挂载到 /etc/camel/resources.d/,并且应用程序会自动配置为读取这些路径。

Ingress trait

添加 Ingress 资源以将应用程序对外暴露(需要 Service 资源):

属性类型描述
ingress.enabledbool用于启用或禁用某个 trait。所有 trait 都共享这一通用属性(默认为 false)。
ingress.annotationsmap[string]string添加到 ingress 上的注解。可用于设置特定于控制器的注解,例如使用 NGINX Ingress 控制器 时。
ingress.hoststring配置 ingress 暴露的主机名。
ingress.pathstring配置 ingress 暴露的路径(默认为 /)。
ingress.pathTypestring配置 ingress 暴露的路径类型。取值可为 Exact、Prefix、ImplementationSpecific(默认为 Prefix)。
ingress.autobool当路由使用 HTTP 端点消费者时,自动添加 Ingress 资源(默认为 true)。
ingress.tls-hosts[]string配置通过 ingress 的 SNI TLS 扩展暴露的特定主机名。
ingress.tls-secret-namestring指定包含 TLS 私钥和证书的 Secret,用于 TLS。

示例:

camel kubernetes export Sample.java --trait ingress.enabled=true --trait ingress.host=example.com --trait ingress.path=/sample

Route trait(OpenShift)

添加 OpenShift Route 资源,以便从外部访问该应用:

属性类型说明
route.enabledbool可用于启用或禁用某个 trait。所有 trait 都共享这一通用属性(默认为 false)。
route.annotationsmap[string]string添加到路由上的注解。可用于设置 OpenShift 路由特定注解 相关选项。
route.hoststring配置路由对外暴露的主机名。
route.tls-terminationstringTLS 终止类型,例如 edge、passthrough 或 reencrypt。更多信息请参阅 OpenShift 路由文档。
route.tls-certificatestringTLS 证书内容或文件(file:absolute.path)。更多信息请参阅 OpenShift 路由文档。
route.tls-keystringTLS 证书私钥内容或文件(file:absolute.path)。更多信息请参阅 OpenShift 路由文档。
route.tls-ca-certificatestringTLS CA 证书内容或文件(file:absolute.path)。更多信息请参阅 OpenShift 路由文档。
route.tls-destination-ca-certificatestring目标 CA 内容或文件(file:absolute.path)。目标 CA 证书提供最终目标的 CA 证书内容。使用 reencrypt 终止方式时,应提供该文件,以便路由器在对安全连接进行健康检查时使用它。如果未指定该字段,路由器可能会使用其自身的目标 CA,并使用简短的服务名称(service.namespace.svc)执行主机名验证,从而允许自动验证基础设施生成的证书。更多信息请参阅 OpenShift 路由文档。
route.tls-insecure-edge-termination-policystring配置如何处理不安全流量,例如 Allow(允许)、Disable(禁用)或 Redirect(重定向)流量。更多信息请参阅 OpenShift 路由文档。

示例:

camel kubernetes export Sample.java --cluster-type=openshift --trait route.enabled=true --trait route.host=example.com --trait route.tls-termination=edge

Jolokia 特性(Trait)

通过 Jolokia 启用 JMX 访问(需要在应用中配置 Jolokia):

属性类型描述
jolokia.enabledbool用于启用或禁用某个特性(trait)。所有特性都共享此通用属性。(默认 false)。
jolokia.container-portint配置容器对外暴露的 Jolokia 端口(默认 8778)。
jolokia.container-port-namestring配置容器对外暴露端口的端口名称(默认 jolokia)。
jolokia.exposebool用于启用/禁用通过 Kubernetes Service 暴露 Jolokia。(默认 false)。
jolokia.service-portint配置 Service 对外暴露的 Jolokia 端口(默认 8778)。仅当 expose 参数为 true 时生效。
jolokia.service-port-namestring配置 Service 对外暴露端口的端口名称(默认 jolokia)。仅当 expose 参数为 true 时生效。

示例:

camel kubernetes export Sample.java --trait jolokia.enabled=true --trait jolokia.expose=true

OpenAPI 特性

从 ConfigMap 挂载 OpenAPI 规范:

camel kubernetes export Sample.java --open-api configmap:my-spec

部署到 OpenShift

使用 --cluster-type=openshift 可以生成 OpenShift 特有的资源(Route、ImageStream、BuildConfig):

camel kubernetes export Sample.java --cluster-type=openshift

默认的镜像构建器在 OpenShift 上会切换为 S2i。如需改为推送到外部镜像仓库,请使用 --image-builder=jib 覆盖此行为。

使用 S2i 时,请将 --image-group 设置为你的 OpenShift 项目(命名空间)名称,因为 S2i 会将其用作镜像坐标的一部分:image-registry.openshift-image-registry.svc:5000/<project>/<name>:<tag>

Kubernetes run

run 命令会在一步之内完成导出、构建、推送和部署:

camel kubernetes run route.yaml --image-registry=kind

该命令会自动检测本地集群(kind、minikube、OpenShift),并据此配置镜像仓库。可使用 --disable-auto 禁用此功能。

自定义镜像:

camel kubernetes run route.yaml --image-registry=kind --image-group camel-experts
camel kubernetes run route.yaml --image quay.io/camel-experts/demo-app:1.0

run 命令支持与 export 相同的 trait 选项,用于定制 Kubernetes 清单。

使用 --dev 自动重载

监视源文件变化并自动重新构建/重新部署:

camel kubernetes run route.yaml --image-registry=kind --dev

终止进程以停止开发模式——关闭时部署会被自动移除。

在 macOS 上,由于 Java 进程的原生文件操作受限,文件监视机制会较慢。

在运行时设置属性和资源

可以内联设置属性,也可以从文件或 Kubernetes 资源中设置:

camel kubernetes run route.yaml --property my-key=my-val
camel kubernetes run route.yaml --property file:/some/directory/file.properties

从 ConfigMap 和 Secret 中获取属性

使用 --config 将 ConfigMap/Secret 数据挂载为属性文件,并自动配置为 Camel 属性占位符:

camel kubernetes run route.java --config configmap:game-config
camel kubernetes run route.java --config configmap:game-config/game.properties
camel kubernetes run route.java --config secret:my-credentials

挂载路径:--config configmap: 映射到 /etc/camel/conf.d/_configmaps/<name>/<key>,--config secret: 映射到 /etc/camel/conf.d/_secrets/<name>/<key>。每个 ConfigMap 键都会成为一个文件。

挂载通用文件

使用 --resource 可以在不配置属性占位符的情况下挂载文件。语法:[configmap|secret]:name[/key][@path]:

camel kubernetes run route.java --resource configmap:my-data
camel kubernetes run route.java --resource configmap:my-data/config.xml@/etc/my-config.xml

挂载路径:/etc/camel/resources.d/_configmaps/<name>/<key>(或 _secrets)。使用 @path 可覆盖目标路径。

显示日志

从正在运行的部署中流式传输日志输出:

camel kubernetes logs --name=route

删除部署

删除某个部署及其所有资源:

camel kubernetes delete --name=route

Minikube 部署提示

使用 Minikube 进行本地开发的快速入门(Camel 4.10+):

minikube start --addons registry --driver=docker
eval $(minikube -p minikube docker-env)
camel kubernetes run demo.camel.yaml

部署技巧与故障排查

  • 如果 camel kubernetes run 出现任何错误,可设置 --verbose 以显示更多日志。
  • 你可能需要检查 .camel-jbang-run/<name> 中生成的 Maven 项目。
  • 如果在构建容器镜像或部署 Kubernetes 清单时遇到问题,可以考虑使用 --disable-auto 禁用 Kubernetes 集群自动检测。
  • 请注意,这里使用的是 Docker 多平台构建方式。它要求你已遵循这些 Docker 要求。

评论

登录后参与评论

正在加载评论…