Self-hosted service
apache/camel-k avatar
apache/camel-k

Apache Camel K: running Camel routes as Kubernetes workloads

Apache Camel K is a lightweight integration platform, born on Kubernetes, with serverless superpowers

934 stars408 forksGoApache-2.0

At a glance

What is it?
Apache Camel K is a Go implementation that takes Camel DSL routes and runs them on a Kubernetes cluster without a hand-built container image. It suits teams whose integration code already lives in Camel and who want cluster-native deployment, and it suits less well anyone who needs documented rollback, version pinning, or a cluster-free workflow.
Who is it for?
Camel K fits teams that already write Camel routes and already run Kubernetes, and it removes the container build step from that work. It does not fit teams without a cluster, or teams that need the README to explain rollback, upgrade paths, or version selection.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly Go, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Camel K maps a Camel route onto a Kubernetes cluster

Apache Camel K exists to remove the packaging step from integration work. The README describes it as a lightweight integration framework built from Apache Camel that runs natively on Kubernetes and is specifically designed for serverless and microservice architectures. The practical effect is that a route becomes a cluster workload without you first writing a container image, a deployment manifest, or a build pipeline around the application that hosts it.

The implementation is written in Go. The module path declared in go.mod is github.com/apache/camel-k/v2, with source under cmd/ and pkg/. The dependency list is dominated by Kubernetes machinery: k8s.io/api, k8s.io/client-go, k8s.io/apimachinery, k8s.io/cli-runtime and sigs.k8s.io/controller-runtime sit alongside the operator-framework/api module. The repository topics list operator, knative, openshift and serverless next to camel and kubernetes, and the top level of the tree carries install/ and helm/ directories, which is where the operator itself is packaged for a cluster.

The kamel CLI is the only tool the quickstart needs

The shortest documented path is one file and one command. Save the following as hello.yaml:

yaml
- from:
    uri: "timer:tick?period=3000"
    steps:
      - setBody:
          constant: "Hello world from Camel K"
      - to: "log:info"

Then run it with the kamel command line interface, which the README points at as a downloadable release:

bash
kamel run hello.yaml

What you should see is a timer firing every three seconds and each tick logging the same fixed body, because setBody with a constant replaces whatever arrived rather than transforming it. Two things are worth noting about the shape of this flow. The route is pure data in YAML, so nothing here needs a compiler step on your machine. And nothing here is specific to a timer, since the same file could point at a file endpoint or a message broker component.

The README points to a separate installation page for the procedure, and it states plainly that to use Camel K you need to be connected to a cloud environment or to a local cluster created for development purposes. The cluster is therefore a precondition, not an optional extra.

Traits are where the Kubernetes mapping is changed

Most of the behaviour you would want to tune is not in the route file. The README states that the details of how the integration is mapped into Kubernetes resources can be customized using traits, and links to a traits section of the official documentation. That is the project's central extension point: the route says what the integration does, and traits say what the cluster object looks like.

This design has a consequence worth stating plainly. Nothing in the quickstart shows you what those resources look like, because they are produced for you. If your requirement involves a specific resource kind, a specific mount, a specific configuration setting, or a specific scheduling rule, then the trait configuration becomes the piece of the system you have to learn first, and it is documented outside the repository rather than inside the README. For an evaluation this matters: the route in the quickstart tells you very little about what you will actually end up running.

Component dependencies resolve themselves, versions do not

The README says you can use any of the Apache Camel components available and that the related dependencies will be resolved automatically. That is the sharpest advantage over assembling an application by hand, because it removes the step where a route references a connector whose library is missing from the build.

Automatic resolution is not the same as explicit control, and the repository gives no guidance on how a specific component version is chosen. The go.mod file at the root of the operator itself pins a different set of things, including gopkg.in/yaml.v2, github.com/spf13/cobra for the command line surface and github.com/spf13/viper for configuration, but those are the operator's own dependencies, not the ones a route gets. If a route needs a component that is no longer in the default set, or a specific version of one that is, the rules for that choice live in the dependencies and components documentation, not in the code shown here. Plan to read that page before you commit to a component set.

Languages vary, but the runtime provider is pinned to Quarkus

Camel K is not limited to Java. The README states that Camel K supports multiple languages for writing integrations and links to a languages page, so the choice of language is a supported surface rather than an accident of the implementation being written in Go.

Underneath, the Makefile shows how much of that is fixed. It sets DEFAULT_RUNTIME_PROVIDER to plain-quarkus and DEFAULT_RUNTIME_VERSION to 3.40.1, and it carries a separate CK_RUNTIME_CATALOG_VERSION of 3.15.3 with a comment explaining that the last camel-k-runtime catalog is kept in use until the project supports the CamelCatalog CR. That comment is a small but useful signal: the runtime component catalog that decides what a route can use is currently a pinned constant in the build, and moving to a newer catalog depends on a capability that has not landed yet. Upgrade cost therefore includes the runtime version, not just the operator version.

Where Camel K is the wrong tool for the job

Camel K needs a cluster to do anything at all, and that is the first thing to weigh. The README does not document rollback, so if you deploy a route that behaves badly you are left to work out how to revert it with the tooling you have. It also does not explain how to pin a route to a particular component version, or how to reproduce a deployment months later, because the quickstart covers exactly one command and one file.

The release history makes a second point. The listing shows v2.11.0 published on 2026-08-31 alongside nightly builds v2.11.0-nightly and v2.12.0-nightly, and the Makefile carries VERSION ?= 2.12.0-SNAPSHOT with LAST_RELEASED_VERSION ?= 2.11.0. Nightly artefacts moving at a different pace from the release line means two streams of versions exist at once, and picking between them is a decision the project leaves to you.

The alternative approach is to build and ship a Camel application yourself, as a container image you control, and let your existing deployment pipeline schedule it. You take on image builds, dependency pinning and the full upgrade surface, but you keep the version you deployed and you can roll it back through your own release tooling. Choose that path when reproducibility and rollback matter more than zero build steps, and choose Camel K when cluster-native operation is the reason you moved to Camel in the first place.

Releases, the operator image, and what the licence covers

The repository is not archived, and the last push was on 2026-10-20, so the code is being changed on a current basis. The build defines LAST_RELEASED_IMAGE_NAME as camel-k-operator, and it pins toolchain versions for the release process itself, including CONTROLLER_GEN_VERSION v0.22.0, OPERATOR_SDK_VERSION v1.30.0 and KUSTOMIZE_VERSION v5.7.1, which indicates that the operator image is built and installed rather than run directly from source.

The licence is Apache-2.0, as stated in the repository licence field and in the README's licensing section, which points at the LICENSE file in the repository root. Apache-2.0 is permissive and carries an explicit patent grant, and the NOTICE file in the tree is part of the standard distribution. That matters for the Camel components a route pulls in, since each component arrives with its own licensing terms, and the route you write inherits the terms of everything it depends on. Check those component licences before shipping a route to customers under contractual obligations. The project also ships a SECURITY.md and a KEYS file, so vulnerability reports and release signing are handled as part of the normal process.

Editorial conclusion

Camel K fits teams that already write Camel routes and already run Kubernetes, and it removes the container build step from that work. It does not fit teams without a cluster, or teams that need the README to explain rollback, upgrade paths, or version selection. Before adopting it, check what your cluster already provides, because the README states that you need to be connected to a cloud environment or to a local cluster created for development purposes, then confirm on a scratch cluster that kamel run hello.yaml behaves as the timer's three second period suggests before anything depends on it.

Frequently asked questions

What is Apache Camel K and what is it used for?

The README describes it as a lightweight integration framework built from Apache Camel that runs natively on Kubernetes and is designed for serverless and microservice architectures. It lets you run Camel DSL integration code on a cloud provider without building a container image first.

How do I run a first integration with Apache Camel K?

Save a route as a YAML file, for example one that uses a timer endpoint and a setBody step, then run kamel run hello.yaml with the kamel CLI. The README states that you need to be connected to a cloud environment or to a local cluster created for development purposes.

Does Apache Camel K only support Java?

No. The README states that Camel K supports multiple languages for writing integrations and points to a languages page for the list. The operator itself is written in Go, and the build defaults to the plain-quarkus runtime provider at version 3.40.1.

How do I change how an integration is deployed in Apache Camel K?

Through traits. The README states that the details of how the integration is mapped into Kubernetes resources can be customized using traits, and links to the traits section of the official documentation for the full list.

How do I install the Apache Camel K operator?

The README points at the official installation procedure page and states that you need a connection to a cloud environment or a local development cluster. The repository also contains install/ and helm/ directories for deploying the operator itself.

Official sources

  1. apache/camel-k on GitHub
  2. License: Apache-2.0
  3. Project website
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/apache-camel-k.svg)](https://hysenlabs.com/projects/apache-camel-k)

Was this useful?