Camel Kubernetes 插件
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=truecamel kubernetes run 命令将导出、构建、推送和部署整合为一个步骤。 |
|---|
export 命令提供了多个选项来自定义项目:
| 选项 | 说明 | |
|---|---|---|
--service-account | 用于运行应用程序的服务账号。 | |
--dependency | 添加需要包含的依赖。Camel 组件使用 "camel:" 前缀,Maven 依赖使用 "mvn:org.my1.0"。 | |
--build-property | Maven/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 配置的优先级顺序:
--trait命令行选项- 前缀为
trait.camel.apache.org/*的注解 application-<profile>.properties中前缀为camel.jbang.trait.*的属性application.properties中前缀为camel.jbang.trait.*的属性
Container trait
自定义容器规格(镜像、端口、资源):
| 属性 | 类型 | 描述 | ||
|---|---|---|---|---|
container.port | int | 配置容器暴露的不同端口(默认 8080)。 | ||
container.port-name | string | 为容器暴露的端口配置不同的端口名称。仅当 expose 参数为 true 时,该名称默认为 http。 | ||
container.service-port | int | 配置容器端口将通过哪个服务端口对外暴露(默认 80)。 | ||
container.service-port-name | string | 配置容器端口将通过哪个服务端口名称对外暴露(默认 http)。 | ||
container.name | string | 应用容器的名称。 | ||
container.image | string | Deployment 所使用的应用容器镜像。 | ||
container.image-pull-policy | PullPolicy | 镜像拉取策略:Always\ | Never\ | IfNotPresent |
container.image-pull-secrets | string[] | 用于私有镜像仓库的拉取密钥 | ||
container.request-cpu | string | 所需的最小 CPU 数量。 | ||
container.request-memory | string | 所需的最小内存量。 | ||
container.limit-cpu | string | 所允许的最大 CPU 数量。 | ||
container.limit-memory | string | 所允许的最大内存量。 |
示例:
camel kubernetes export Sample.java --trait container.name=my-container --trait container.port=8088 --trait container.request-cpu=0.005 --trait container.request-memory=100MiCronJob trait
生成 CronJob 而不是 Deployment(需要 enabled=true 且指定 schedule):
camel kubernetes export Sample.java --trait=cronjob.enabled=true --trait=cronjob.schedule="* * * * 2"| 属性 | 类型 | 描述 |
|---|---|---|
cronjob.enabled | boolean | 生成 CronJob 清单而非 Deployment 清单。(默认=false) |
cronjob.schedule | string | 设置按照 crontab 格式运行工作负载的调度时间。 |
cronjob.timezone | string | 设置运行工作负载的时区。 |
cronjob.startingDeadlineSeconds | integer | 设置 CronJob 的 StartingDeadlineSeconds 字段。 |
cronjob.activeDeadlineSeconds | integer | 设置 CronJob 的 ActiveDeadlineSeconds 字段。 |
cronjob.backoffLimit | integer | 设置 CronJob 的 BackoffLimit 字段。 |
cronjob.durationMaxIdleSeconds | integer | 设置 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=barService trait
当路由暴露 HTTP 端点(例如 platform-http)时,会自动生成 Service 资源。可对其进行自定义:
| 属性 | 类型 | 描述 |
|---|---|---|
service.type | string | 要使用的服务类型,可选 'ClusterIP'、'NodePort' 或 'LoadBalancer'。 |
container.service-port | int | 配置容器端口在哪个服务端口下对外暴露(默认 80)。 |
container.service-port-name | string | 配置容器端口在哪个服务端口名称下对外暴露(默认 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.enabled | bool | 用于启用或禁用某个 trait。所有 trait 都共享这一通用属性(默认为 false)。 |
ingress.annotations | map[string]string | 添加到 ingress 上的注解。可用于设置特定于控制器的注解,例如使用 NGINX Ingress 控制器 时。 |
ingress.host | string | 配置 ingress 暴露的主机名。 |
ingress.path | string | 配置 ingress 暴露的路径(默认为 /)。 |
ingress.pathType | string | 配置 ingress 暴露的路径类型。取值可为 Exact、Prefix、ImplementationSpecific(默认为 Prefix)。 |
ingress.auto | bool | 当路由使用 HTTP 端点消费者时,自动添加 Ingress 资源(默认为 true)。 |
ingress.tls-hosts | []string | 配置通过 ingress 的 SNI TLS 扩展暴露的特定主机名。 |
ingress.tls-secret-name | string | 指定包含 TLS 私钥和证书的 Secret,用于 TLS。 |
示例:
camel kubernetes export Sample.java --trait ingress.enabled=true --trait ingress.host=example.com --trait ingress.path=/sampleRoute trait(OpenShift)
添加 OpenShift Route 资源,以便从外部访问该应用:
| 属性 | 类型 | 说明 |
|---|---|---|
route.enabled | bool | 可用于启用或禁用某个 trait。所有 trait 都共享这一通用属性(默认为 false)。 |
route.annotations | map[string]string | 添加到路由上的注解。可用于设置 OpenShift 路由特定注解 相关选项。 |
route.host | string | 配置路由对外暴露的主机名。 |
route.tls-termination | string | TLS 终止类型,例如 edge、passthrough 或 reencrypt。更多信息请参阅 OpenShift 路由文档。 |
route.tls-certificate | string | TLS 证书内容或文件(file:absolute.path)。更多信息请参阅 OpenShift 路由文档。 |
route.tls-key | string | TLS 证书私钥内容或文件(file:absolute.path)。更多信息请参阅 OpenShift 路由文档。 |
route.tls-ca-certificate | string | TLS CA 证书内容或文件(file:absolute.path)。更多信息请参阅 OpenShift 路由文档。 |
route.tls-destination-ca-certificate | string | 目标 CA 内容或文件(file:absolute.path)。目标 CA 证书提供最终目标的 CA 证书内容。使用 reencrypt 终止方式时,应提供该文件,以便路由器在对安全连接进行健康检查时使用它。如果未指定该字段,路由器可能会使用其自身的目标 CA,并使用简短的服务名称(service.namespace.svc)执行主机名验证,从而允许自动验证基础设施生成的证书。更多信息请参阅 OpenShift 路由文档。 |
route.tls-insecure-edge-termination-policy | string | 配置如何处理不安全流量,例如 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=edgeJolokia 特性(Trait)
通过 Jolokia 启用 JMX 访问(需要在应用中配置 Jolokia):
| 属性 | 类型 | 描述 |
|---|---|---|
jolokia.enabled | bool | 用于启用或禁用某个特性(trait)。所有特性都共享此通用属性。(默认 false)。 |
jolokia.container-port | int | 配置容器对外暴露的 Jolokia 端口(默认 8778)。 |
jolokia.container-port-name | string | 配置容器对外暴露端口的端口名称(默认 jolokia)。 |
jolokia.expose | bool | 用于启用/禁用通过 Kubernetes Service 暴露 Jolokia。(默认 false)。 |
jolokia.service-port | int | 配置 Service 对外暴露的 Jolokia 端口(默认 8778)。仅当 expose 参数为 true 时生效。 |
jolokia.service-port-name | string | 配置 Service 对外暴露端口的端口名称(默认 jolokia)。仅当 expose 参数为 true 时生效。 |
示例:
camel kubernetes export Sample.java --trait jolokia.enabled=true --trait jolokia.expose=trueOpenAPI 特性
从 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.0run 命令支持与 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=routeMinikube 部署提示
使用 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 要求。
评论
登录后参与评论
KnowForge