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.이 콘텐츠는 선택한 언어로 제공되지 않습니다.
Chapter 3. Developing and running Camel K integrations
This chapter explains how to set up your development environment and how to develop and deploy simple Camel K integrations written in Java and YAML. It also shows how to use the kamel
command line to manage Camel K integrations at runtime. For example, this includes running, describing, logging, and deleting integrations.
- Section 3.1, “Setting up your Camel K development environment”
- Section 3.2, “Developing Camel K integrations in Java”
- Section 3.3, “Developing Camel K integrations in YAML”
- Section 3.4, “Running Camel K integrations”
- Section 3.5, “Running Camel K integrations in development mode”
- Section 3.6, “Running Camel K integrations using modeline”
- Section 3.7, “Build”
- Section 3.8, “Promoting across environments”
3.1. Setting up your Camel K development environment
You must set up your environment with the recommended development tooling before you can automatically deploy the Camel K quick start tutorials. This section explains how to install the recommended Visual Studio (VS) Code IDE and the extensions that it provides for Camel K.
- The Camel K VS Code extensions are community features.
- VS Code is recommended for ease of use and the best developer experience of Camel K. This includes automatic completion of Camel DSL code and Camel K traits. However, you can manually enter your code and tutorial commands using your chosen IDE instead of VS Code.
Prerequisites
You must have access to an OpenShift cluster on which the Camel K Operator and OpenShift Serverless Operator are installed:
Procedure
Install VS Code on your development platform. For example, on Red Hat Enterprise Linux:
Install the required key and repository:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc $ sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
Update the cache and install the VS Code package:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow yum check-update sudo yum install code
$ yum check-update $ sudo yum install code
For details on installing on other platforms, see the VS Code installation documentation.
-
Enter the
code
command to launch the VS Code editor. For more details, see the VS Code command line documentation. Install the VS Code Camel Extension Pack, which includes the extensions required for Camel K. For example, in VS Code:
- In the left navigation bar, click Extensions.
- In the search box, enter Apache Camel.
Select the Extension Pack for Apache Camel by Red Hat, and click Install.
For more details, see the instructions for the Extension Pack for Apache Camel by Red Hat.
Additional resources
- VS Code Getting Started documentation
- VS Code Tooling for Apache Camel K by Red Hat extension
- VS Code Language Support for Apache Camel by Red Hat extension
- Apache Camel K and VS Code tooling example
- To upgrade your Camel application from Camel 3.x to 3.y see, Camel 3.x Upgrade Guide.
3.2. Developing Camel K integrations in Java
This section shows how to develop a simple Camel K integration in Java DSL. Writing an integration in Java to be deployed using Camel K is the same as defining your routing rules in Camel. However, you do not need to build and package the integration as a JAR when using Camel K.
You can use any Camel component directly in your integration routes. Camel K automatically handles the dependency management and imports all the required libraries from the Camel catalog using code inspection.
Prerequisites
Procedure
Enter the
kamel init
command to generate a simple Java integration file. For example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel init HelloCamelK.java
$ kamel init HelloCamelK.java
Open the generated integration file in your IDE and edit as appropriate. For example, the
HelloCamelK.java
integration automatically includes the Cameltimer
andlog
components to help you get started:Copy to Clipboard Copied! Toggle word wrap Toggle overflow // camel-k: language=java import org.apache.camel.builder.RouteBuilder; public class HelloCamelK extends RouteBuilder { @Override public void configure() throws Exception { // Write your routes here, for example: from("timer:java?period=1s") .routeId("java") .setBody() .simple("Hello Camel K from ${routeId}") .to("log:info"); } }
// camel-k: language=java import org.apache.camel.builder.RouteBuilder; public class HelloCamelK extends RouteBuilder { @Override public void configure() throws Exception { // Write your routes here, for example: from("timer:java?period=1s") .routeId("java") .setBody() .simple("Hello Camel K from ${routeId}") .to("log:info"); } }
Next steps
3.3. Developing Camel K integrations in YAML
This section explains how to develop a simple Camel K integration in YAML DSL. Writing an integration in YAML to be deployed using Camel K is the same as defining your routing rules in Camel.
You can use any Camel component directly in your integration routes. Camel K automatically handles the dependency management and imports all the required libraries from the Camel catalog using code inspection.
Prerequisites
Procedure
Enter the
kamel init
command to generate a simple YAML integration file. For example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel init hello.camelk.yaml
$ kamel init hello.camelk.yaml
Open the generated integration file in your IDE and edit as appropriate. For example, the
hello.camelk.yaml
integration automatically includes the Cameltimer
andlog
components to help you get started:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Write your routes here, for example:
# Write your routes here, for example: - from: uri: "timer:yaml" parameters: period: "1s" steps: - set-body: constant: "Hello Camel K from yaml" - to: "log:info"
3.4. Running Camel K integrations
You can run Camel K integrations in the cloud on your OpenShift cluster from the command line using the kamel run
command.
Prerequisites
- Setting up your Camel K development environment.
- You must already have a Camel integration written in Java or YAML DSL.
Procedure
Log into your OpenShift cluster using the
oc
client tool, for example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc login --token=my-token --server=https://my-cluster.example.com:6443
$ oc login --token=my-token --server=https://my-cluster.example.com:6443
Ensure that the Camel K Operator is running, for example:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pod
$ oc get pod NAME READY STATUS RESTARTS AGE camel-k-operator-86b8d94b4-pk7d6 1/1 Running 0 6m28s
Enter the
kamel run
command to run your integration in the cloud on OpenShift. For example:Java example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel run HelloCamelK.java
$ kamel run HelloCamelK.java integration "hello-camel-k" created
YAML example
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel run hello.camelk.yaml
$ kamel run hello.camelk.yaml integration "hello" created
Enter the
kamel get
command to check the status of the integration:Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel get
$ kamel get NAME PHASE KIT hello Building Kit myproject/kit-bq666mjej725sk8sn12g
When the integration runs for the first time, Camel K builds the integration kit for the container image, which downloads all the required Camel modules and adds them to the image classpath.
Enter
kamel get
again to verify that the integration is running:Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel get
$ kamel get NAME PHASE KIT hello Running myproject/kit-bq666mjej725sk8sn12g
Enter the
kamel log
command to print the log tostdout
:Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel log hello
$ kamel log hello [1] 2021-08-11 17:58:40,573 INFO [org.apa.cam.k.Runtime] (main) Apache Camel K Runtime 1.7.1.fuse-800025-redhat-00001 [1] 2021-08-11 17:58:40,653 INFO [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [1] 2021-08-11 17:58:40,844 INFO [org.apa.cam.k.lis.SourcesConfigurer] (main) Loading routes from: SourceDefinition{name='camel-k-embedded-flow', language='yaml', location='file:/etc/camel/sources/camel-k-embedded-flow.yaml', } [1] 2021-08-11 17:58:41,216 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup summary (total:1 started:1) [1] 2021-08-11 17:58:41,217 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started route1 (timer://yaml) [1] 2021-08-11 17:58:41,217 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 3.10.0.fuse-800010-redhat-00001 (camel-1) started in 136ms (build:0ms init:100ms start:36ms) [1] 2021-08-11 17:58:41,268 INFO [io.quarkus] (main) camel-k-integration 1.6.6 on JVM (powered by Quarkus 1.11.7.Final-redhat-00009) started in 2.064s. [1] 2021-08-11 17:58:41,269 INFO [io.quarkus] (main) Profile prod activated. [1] 2021-08-11 17:58:41,269 INFO [io.quarkus] (main) Installed features: [camel-bean, camel-core, camel-k-core, camel-k-runtime, camel-log, camel-support-common, camel-timer, camel-yaml-dsl, cdi] [1] 2021-08-11 17:58:42,423 INFO [info] (Camel (camel-1) thread #0 - timer://yaml) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from yaml] ...
-
Press
Ctrl-C
to terminate logging in the terminal.
Additional resources
-
For more details on the
kamel run
command, enterkamel run --help
- For faster deployment turnaround times, see Running Camel K integrations in development mode
- For details of development tools to run integrations, see VS Code Tooling for Apache Camel K by Red Hat
- See also Managing Camel K integrations
Running An Integration Without CLI
You can run an integration without a CLI (Command Line Interface) and create an Integration Custom Resource with the configuration to run your application.
For example, execute the following sample route.
kamel run Sample.java -o yaml
kamel run Sample.java -o yaml
It returns the expected Integration Custom Resource.
apiVersion: camel.apache.org/v1 kind: Integration metadata: creationTimestamp: null name: my-integration namespace: default spec: sources: - content: " import org.apache.camel.builder.RouteBuilder; public class Sample extends RouteBuilder { @Override public void configure() throws Exception { from(\"timer:tick\") .log(\"Hello Integration!\"); } }" name: Sample.java status: {}
apiVersion: camel.apache.org/v1
kind: Integration
metadata:
creationTimestamp: null
name: my-integration
namespace: default
spec:
sources:
- content: "
import org.apache.camel.builder.RouteBuilder;
public class Sample extends RouteBuilder {
@Override
public void configure()
throws Exception {
from(\"timer:tick\")
.log(\"Hello Integration!\");
}
}"
name: Sample.java
status: {}
Save this custom resource in a yaml file, my-integration.yaml
. Now, run the integration that contains the Integration Custom Resource using the oc
command line, the UI, or the API to call the OpenShift cluster. In the following example, oc
CLI is used from the command line.
oc apply -f my-integration.yaml ... integration.camel.apache.org/my-integration created
oc apply -f my-integration.yaml
...
integration.camel.apache.org/my-integration created
The operator runs the Integration.
- Kubernetes supports Structural Schemas for CustomResourceDefinitions.
- For more details about Camel K traits see, Camel K trait configuration reference.
Schema changes on Custom Resources
The strongly-typed Trait API imposes changes on the following CustomResourceDefinitions: integrations
, integrationkits', and `integrationplatforms.
Trait properties under spec.traits.<trait-id>.configuration
are now defined directly under spec.traits.<trait-id>.
traits: container: configuration: enabled: true name: my-integration
traits:
container:
configuration:
enabled: true
name: my-integration
↓↓↓
traits: container: enabled: true name: my-integration
traits:
container:
enabled: true
name: my-integration
Backward compatibility is possible in this implementation. To achieve backward compatibility, the Configuration
field with RawMessage
type is provided for each trait type, so that the existing integrations and resources are read from the new Red Hat build of Apache Camel K version.
When the old integrations and resources are read, the legacy configuration in each trait (if any) is migrated to the new Trait API fields. If the values are predefined on the new API fields, they precede the legacy ones.
type Trait struct { // Can be used to enable or disable a trait. All traits share this common property. Enabled *bool `property:"enabled" json:"enabled,omitempty"` // Legacy trait configuration parameters. // Deprecated: for backward compatibility. Configuration *Configuration `json:"configuration,omitempty"` } // Deprecated: for backward compatibility. type Configuration struct { RawMessage `json:",inline"` }
type Trait struct {
// Can be used to enable or disable a trait. All traits share this common property.
Enabled *bool `property:"enabled" json:"enabled,omitempty"`
// Legacy trait configuration parameters.
// Deprecated: for backward compatibility.
Configuration *Configuration `json:"configuration,omitempty"`
}
// Deprecated: for backward compatibility.
type Configuration struct {
RawMessage `json:",inline"`
}
3.5. Running Camel K integrations in development mode
You can run Camel K integrations in development mode on your OpenShift cluster from the command line. Using development mode, you can iterate quickly on integrations in development and get fast feedback on your code.
When you specify the kamel run
command with the --dev
option, this deploys the integration in the cloud immediately and shows the integration logs in the terminal. You can then change the code and see the changes automatically applied instantly to the remote integration Pod on OpenShift. The terminal automatically displays all redeployments of the remote integration in the cloud.
The artifacts generated by Camel K in development mode are identical to those that you run in production. The purpose of development mode is faster development.
Prerequisites
- Setting up your Camel K development environment.
- You must already have a Camel integration written in Java or YAML DSL.
Procedure
Log into your OpenShift cluster using the
oc
client tool, for example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc login --token=my-token --server=https://my-cluster.example.com:6443
$ oc login --token=my-token --server=https://my-cluster.example.com:6443
Ensure that the Camel K Operator is running, for example:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pod
$ oc get pod NAME READY STATUS RESTARTS AGE camel-k-operator-86b8d94b4-pk7d6 1/1 Running 0 6m28s
Enter the
kamel run
command with--dev
to run your integration in development mode on OpenShift in the cloud. The following shows a simple Java example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel run HelloCamelK.java --dev
$ kamel run HelloCamelK.java --dev Condition "IntegrationPlatformAvailable" is "True" for Integration hello-camel-k: test/camel-k Integration hello-camel-k in phase "Initialization" Integration hello-camel-k in phase "Building Kit" Condition "IntegrationKitAvailable" is "True" for Integration hello-camel-k: kit-c49sqn4apkb4qgn55ak0 Integration hello-camel-k in phase "Deploying" Progress: integration "hello-camel-k" in phase Initialization Progress: integration "hello-camel-k" in phase Building Kit Progress: integration "hello-camel-k" in phase Deploying Integration hello-camel-k in phase "Running" Condition "DeploymentAvailable" is "True" for Integration hello-camel-k: deployment name is hello-camel-k Progress: integration "hello-camel-k" in phase Running Condition "CronJobAvailable" is "False" for Integration hello-camel-k: different controller strategy used (deployment) Condition "KnativeServiceAvailable" is "False" for Integration hello-camel-k: different controller strategy used (deployment) Condition "Ready" is "False" for Integration hello-camel-k Condition "Ready" is "True" for Integration hello-camel-k [1] Monitoring pod hello-camel-k-7f85df47b8-js7cb ... ... [1] 2021-08-11 18:34:44,069 INFO [org.apa.cam.k.Runtime] (main) Apache Camel K Runtime 1.7.1.fuse-800025-redhat-00001 [1] 2021-08-11 18:34:44,167 INFO [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [1] 2021-08-11 18:34:44,362 INFO [org.apa.cam.k.lis.SourcesConfigurer] (main) Loading routes from: SourceDefinition{name='HelloCamelK', language='java', location='file:/etc/camel/sources/HelloCamelK.java', } [1] 2021-08-11 18:34:46,180 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup summary (total:1 started:1) [1] 2021-08-11 18:34:46,180 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started java (timer://java) [1] 2021-08-11 18:34:46,180 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 3.10.0.fuse-800010-redhat-00001 (camel-1) started in 243ms (build:0ms init:213ms start:30ms) [1] 2021-08-11 18:34:46,190 INFO [io.quarkus] (main) camel-k-integration 1.6.6 on JVM (powered by Quarkus 1.11.7.Final-redhat-00009) started in 3.457s. [1] 2021-08-11 18:34:46,190 INFO [io.quarkus] (main) Profile prod activated. [1] 2021-08-11 18:34:46,191 INFO [io.quarkus] (main) Installed features: [camel-bean, camel-core, camel-java-joor-dsl, camel-k-core, camel-k-runtime, camel-log, camel-support-common, camel-timer, cdi] [1] 2021-08-11 18:34:47,200 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] [1] 2021-08-11 18:34:48,180 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] [1] 2021-08-11 18:34:49,180 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] ...
Edit the content of your integration DSL file, save your changes, and see the changes displayed instantly in the terminal. For example:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow ... integration "hello-camel-k" updated ... [2] 2021-08-11 18:40:54,173 INFO [org.apa.cam.k.Runtime] (main) Apache Camel K Runtime 1.7.1.fuse-800025-redhat-00001 [2] 2021-08-11 18:40:54,209 INFO [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [2] 2021-08-11 18:40:54,301 INFO [org.apa.cam.k.lis.SourcesConfigurer] (main) Loading routes from: SourceDefinition{name='HelloCamelK', language='java', location='file:/etc/camel/sources/HelloCamelK.java', } [2] 2021-08-11 18:40:55,796 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup summary (total:1 started:1) [2] 2021-08-11 18:40:55,796 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started java (timer://java) [2] 2021-08-11 18:40:55,797 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 3.10.0.fuse-800010-redhat-00001 (camel-1) started in 174ms (build:0ms init:147ms start:27ms) [2] 2021-08-11 18:40:55,803 INFO [io.quarkus] (main) camel-k-integration 1.6.6 on JVM (powered by Quarkus 1.11.7.Final-redhat-00009) started in 3.025s. [2] 2021-08-11 18:40:55,808 INFO [io.quarkus] (main) Profile prod activated. [2] 2021-08-11 18:40:55,809 INFO [io.quarkus] (main) Installed features: [camel-bean, camel-core, camel-java-joor-dsl, camel-k-core, camel-k-runtime, camel-log, camel-support-common, camel-timer, cdi] [2] 2021-08-11 18:40:56,810 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] [2] 2021-08-11 18:40:57,793 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] ...
... integration "hello-camel-k" updated ... [2] 2021-08-11 18:40:54,173 INFO [org.apa.cam.k.Runtime] (main) Apache Camel K Runtime 1.7.1.fuse-800025-redhat-00001 [2] 2021-08-11 18:40:54,209 INFO [org.apa.cam.qua.cor.CamelBootstrapRecorder] (main) bootstrap runtime: org.apache.camel.quarkus.main.CamelMainRuntime [2] 2021-08-11 18:40:54,301 INFO [org.apa.cam.k.lis.SourcesConfigurer] (main) Loading routes from: SourceDefinition{name='HelloCamelK', language='java', location='file:/etc/camel/sources/HelloCamelK.java', } [2] 2021-08-11 18:40:55,796 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Routes startup summary (total:1 started:1) [2] 2021-08-11 18:40:55,796 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Started java (timer://java) [2] 2021-08-11 18:40:55,797 INFO [org.apa.cam.imp.eng.AbstractCamelContext] (main) Apache Camel 3.10.0.fuse-800010-redhat-00001 (camel-1) started in 174ms (build:0ms init:147ms start:27ms) [2] 2021-08-11 18:40:55,803 INFO [io.quarkus] (main) camel-k-integration 1.6.6 on JVM (powered by Quarkus 1.11.7.Final-redhat-00009) started in 3.025s. [2] 2021-08-11 18:40:55,808 INFO [io.quarkus] (main) Profile prod activated. [2] 2021-08-11 18:40:55,809 INFO [io.quarkus] (main) Installed features: [camel-bean, camel-core, camel-java-joor-dsl, camel-k-core, camel-k-runtime, camel-log, camel-support-common, camel-timer, cdi] [2] 2021-08-11 18:40:56,810 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] [2] 2021-08-11 18:40:57,793 INFO [info] (Camel (camel-1) thread #0 - timer://java) Exchange[ExchangePattern: InOnly, BodyType: String, Body: Hello Camel K from java] ...
-
Press
Ctrl-C
to terminate logging in the terminal.
Additional resources
-
For more details on the
kamel run
command, enterkamel run --help
- For details of development tools to run integrations, see VS Code Tooling for Apache Camel K by Red Hat
- Managing Camel K integrations
- Configuring Camel K integration dependencies
3.6. Running Camel K integrations using modeline
You can use the Camel K modeline to specify multiple configuration options in a Camel K integration source file, which are executed at runtime. This creates efficiencies by saving you the time of re-entering multiple command line options and helps to prevent input errors.
The following example shows a modeline entry from a Java integration file that enables 3scale and limits the integration container memory.
Prerequisites
- Setting up your Camel K development environment
- You must already have a Camel integration written in Java or YAML DSL.
Procedure
Add a Camel K modeline entry to your integration file. For example:
ThreeScaleRest.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow // camel-k: trait=3scale.enabled=true trait=container.limit-memory=256Mi 1 import org.apache.camel.builder.RouteBuilder; public class ThreeScaleRest extends RouteBuilder { @Override public void configure() throws Exception { rest().get("/") .to("direct:x"); from("direct:x") .setBody().constant("Hello"); } }
// camel-k: trait=3scale.enabled=true trait=container.limit-memory=256Mi 1 import org.apache.camel.builder.RouteBuilder; public class ThreeScaleRest extends RouteBuilder { @Override public void configure() throws Exception { rest().get("/") .to("direct:x"); from("direct:x") .setBody().constant("Hello"); } }
Enables both the container and 3scale traits, to expose the route through 3scale and to limit the container memory.
Run the integration, for example:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel run ThreeScaleRest.java
kamel run ThreeScaleRest.java
The
kamel run
command outputs any modeline options specified in the integration, for example:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Modeline options have been loaded from source files Full command: kamel run ThreeScaleRest.java --trait=3scale.enabled=true --trait=container.limit-memory=256Mi
Modeline options have been loaded from source files Full command: kamel run ThreeScaleRest.java --trait=3scale.enabled=true --trait=container.limit-memory=256Mi
Additional resources
- Camel K modeline options
- For details of development tools to run modeline integrations, see Introducing IDE support for Apache Camel K Modeline.
3.7. Build
A Build resource describes the process of assembling a container image that copes with the requirement of an Integration or IntegrationKit.
The result of a build is an IntegrationKit that must be reused for multiple Integrations.
type Build struct { Spec BuildSpec Status BuildStatus } type BuildSpec struct { Tasks []Task }
type Build struct {
Spec BuildSpec
Status BuildStatus
}
type BuildSpec struct {
Tasks []Task
}
The full go definition can be found here.

3.7.1. Build strategy
You can choose from different build strategies. The build strategy defines how a build must be executed and following are the available strategies.
- buildStrategy: pod (each build is ran in a separate pod, the operator monitors the pod state)
- buildStrategy: routine (each build is ran as a go routine inside the operator pod)
Routine is the default strategy.
The following description allows you to decide when to use which strategy.
Routine: provides slightly faster builds as no additional pod is started, and loaded build dependencies (e.g. Maven dependencies) are cached between builds. Good for normal amount of builds being executed and only few builds running in parallel.
Pod: prevents memory pressure on the operator as the build does not consume CPU and memory from the operator go runtime. Good for many builds being executed and many parallel builds.
3.7.2. Build queues
IntegrationKits and its base images must be reused for multiple Integrations to accomplish an efficient resource management and to optimize build and startup times for Camel K Integrations.
To reuse images, the operator is going to queue builds in sequential order. This way the operator is able to use efficient image layering for Integrations.
By default, builds are queued sequentially based on their layout (e.g. native, fast-jar) and the build namespace.
However, builds may not run sequentially but in parallel to each other based on certain criteria.
- For instance, native builds will always run in parallel to other builds.
- Also, when the build requires to run with a custom IntegrationPlatform it may run in parallel to other builds that run with the default operator IntegrationPlatform.
- In general, when there is no chance to reuse the build’s image layers, the build is eager to run in parallel to other builds.
Therefore, to avoid having many builds running in parallel, the operator uses a maximum number of running builds setting that limits the amount of builds running.
You can set this limit in the IntegrationPlatform settings.
The default values for this limitation is based on the build strategy.
- buildStrategy: pod (MaxRunningBuilds=10)
- buildStrategy: routine (MaxRunningBuilds=3)
3.8. Promoting across environments
As soon as you have an Integration running in your cluster, you can move that integration to a higher environment. That is, you can test your integration in a development environment, and, after obtaining the result, you can move it into a production environment.
Camel K achieves this goal by using the kamel promote
command. With this command you can move an integration from one namespace to another.
Prerequisites
- Setting up your Camel K development environment
- You must already have a Camel integration written in Java or YAML DSL.
-
Ensure that both the source operator and the destination operator are using the same container registry, default registry (if Camel K operator is installed via OperatorHub) is
registry.redhat.io
- Also ensure that the destination namespace provides the required Configmaps, Secrets or Kamelets required by the integration.
To use the same container registry, you can use the --registry
option during installation phase or change the IntegrationPlatform to reflect that accordingly.
Code example
Following is a simple integration that uses a Configmap to expose some message on an HTTP endpoint. You can start creating such an integration and testing in a namespace called
development
.Copy to Clipboard Copied! Toggle word wrap Toggle overflow kubectl create configmap my-cm --from-literal=greeting="hello, I am development!" -n development
kubectl create configmap my-cm --from-literal=greeting="hello, I am development!" -n development
PromoteServer.java
Copy to Clipboard Copied! Toggle word wrap Toggle overflow import org.apache.camel.builder.RouteBuilder; public class PromoteServer extends RouteBuilder { @Override public void configure() throws Exception { from("platform-http:/hello?httpMethodRestrict=GET").setBody(simple("resource:classpath:greeting")); } }
import org.apache.camel.builder.RouteBuilder; public class PromoteServer extends RouteBuilder { @Override public void configure() throws Exception { from("platform-http:/hello?httpMethodRestrict=GET").setBody(simple("resource:classpath:greeting")); } }
Now run it.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel run --dev -n development PromoteServer.java --config configmap:my-cm [-t service.node-port=true]
kamel run --dev -n development PromoteServer.java --config configmap:my-cm [-t service.node-port=true]
You must tweak the service trait, depending on the Kubernetes platform and the level of exposure you want to provide. After that you can test it.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow curl http://192.168.49.2:32116/hello hello, I am development!
curl http://192.168.49.2:32116/hello hello, I am development!
After testing of your integration, you can move it to a production environment. You must have the destination environment (a Openshift namespace) ready with an operator (sharing the same operator source container registry) and any configuration, such as the configmap you have used here. For that scope, create one on the destination namespace.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kubectl create configmap my-cm --from-literal=greeting="hello, I am production!" -n production
kubectl create configmap my-cm --from-literal=greeting="hello, I am production!" -n production
NoteFor security reasons, there is a check to ensure that the expected resources such as Configmaps, Secrets and Kamelets are present on the destination. If any of these resources are missing, the integration does not move.
You can now promote your integration.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow kamel promote promote-server -n development --to production kamel logs promote-server -n production
kamel promote promote-server -n development --to production kamel logs promote-server -n production
Test the promoted integration.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow curl http://192.168.49.2:30764/hello hello, I am production!
curl http://192.168.49.2:30764/hello hello, I am production!
Since the Integration is reusing the same container image, the new application is executed immediately. Also, the immutability of the Integration is assured as the container used is exactly the same as the one tested in development (changes are just the configurations).
NoteThe integration running in the test is not altered in any way and keeps running until you stop it.