This example shows how to integrate Camel with Strimzi: Kafka on Kubernetes/OpenShift.
We will have two routes basically. One for producing messages to Kafka cluster which we will setup via Strimzi and other one is for consuming messages which will consume messages from the Kafka cluster. Here is a very high-level diagram of the routes we will run shortly:
Login your Kubernetes/OpenShift cluster as cluster admin. For installing Strimzi operator you have to be a cluster admin.
After logging into your cluster create a namespace called camel-example-strimzi:
kubectl create namespace camel-example-strimziOr for OpenShift create a project:
oc new-project camel-example-strimziNext apply the Strimzi install files, including ClusterRoles, ClusterRoleBindings and some Custom Resource Definitions (CRDs). The CRDs define the schemas used for declarative management of the Kafka cluster, Kafka topics and users:
curl -L https://github.com/strimzi/strimzi-kafka-operator/releases/download/0.16.2/strimzi-cluster-operator-0.16.2.yaml \
| sed 's/namespace: .*/namespace: camel-example-strimzi/' \
| kubectl apply -f - -n camel-example-strimziFor OpenShift:
curl -L https://github.com/strimzi/strimzi-kafka-operator/releases/download/0.16.2/strimzi-cluster-operator-0.16.2.yaml \
| sed 's/namespace: .*/namespace: camel-example-strimzi/' \
| oc apply -f - -n camel-example-strimziNow we are ready to create a Kafka cluster. We will create an ephemeral Kafka cluster with 3 brokers and 3 zookeeper nodes:
kubectl apply -f src/main/resources/kafka-ephemeral-kubernetes.yaml -n camel-example-strimziFor OpenShift:
oc apply -f src/main/resources/kafka-ephemeral-openshift.yaml -n camel-example-strimziWait while Kubernetes/OpenShift starts the required pods, services and so on:
kubectl wait kafka/my-cluster --for=condition=Ready --timeout=300s -n camel-example-strimziFor OpenShift:
oc wait kafka/my-cluster --for=condition=Ready --timeout=300s -n camel-example-strimziCheck the pods after the cluster is ready:
kubectl get podsFor OpenShift:
oc get podsYou should see the Kafka broker and zookeeper nodes as Ready:
NAME READY STATUS RESTARTS AGE
my-cluster-entity-operator-576b867465-z6wxz 3/3 Running 0 2m11s
my-cluster-kafka-0 2/2 Running 0 2m54s
my-cluster-kafka-1 2/2 Running 0 2m54s
my-cluster-kafka-2 2/2 Running 0 2m54s
my-cluster-zookeeper-0 2/2 Running 0 5m7s
my-cluster-zookeeper-1 2/2 Running 0 5m7s
my-cluster-zookeeper-2 2/2 Running 0 5m7s
strimzi-cluster-operator-75c697fff6-hfsr8 1/1 Running 0 6m59sSince the cluster is ready lets deploy our Camel application to Kubernetes/OpenShift.
Before deploying the example application on Kubernetes/OpenShift we have to run prepare-truststore.sh since our Strimzi cluster uses SSL/TLS for external access.
|
Important
|
Because we will use the same route configuration for both internal and external access to Strimzi cluster, we have to create the truststore as well for the case we deploy our Camel application to Kubernetes/OpenShift. |
chmod +x prepare-truststore.sh && ./prepare-truststore.shThis script will create a truststore.jks in your local application root path, and a configmap with the same file included for Kubernetes/OpenShift deployment.
Now we can deploy the Camel application on Kubernetes/OpenShift run k8s:deploy maven command for platform kubernetes:
mvn k8s:deploy -PkubernetesCheck the application is built, deployed and run properly:
kubectl get pods -wFor OpenShift:
oc get pods -wWhen the application pod state is ready first check that there is a topic created with the name TestLog which is auto-created in the Kafka cluster. To get the topics created we can use custom resources of Strimzi:
kubectl get kafkatopicsFor OpenShift:
oc get kafkatopicsYou should see a topic list like this:
NAME PARTITIONS REPLICATION FACTOR
testlog 1 1|
Note
|
Since the |
Now lets check the logs of the Camel application and see if it consumes the messages properly:
kubectl logs -f $(kubectl get pods -l app=camel-example-spring-boot-strimzi --output=jsonpath={.items..metadata.name})For OpenShift:
oc logs -f $(oc get pods -l app=camel-example-spring-boot-strimzi --output=jsonpath={.items..metadata.name})You should see logs like this:
12:16:02.377 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:03.130 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:04.182 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:05.553 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:06.170 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:08.057 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:09.739 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:10.156 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:10.157 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environment
12:16:11.255 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from kubernetes environmentYou can see the Camel Consumer Route consumes the message and prints it in the log in Kubernetes/OpenShift environment.
|
Warning
|
This part of the example is only shown on OpenShift because there are different configurations for external access on Kubernetes -via Ingress- and OpenShift -via Routes- which is much easier to demonstrate. You can always setup a Kubernetes Ingress and configure in your Strimzi Kafka cluster resource regarding to this configuration. |
Only thing you have to do is to change the camel.component.kafka.brokers to Route URL of the service that is provided by Strimzi cluster. You can do it either manually or with using sed command in a linux environment:
sed -i 's/KAFKA_BOOTSTRAP_ROUTE_URL/'$(oc get route my-cluster-kafka-bootstrap --output=jsonpath={.spec.host})':443/g' src/main/resources/application-local.propertiesFor Mac:
sed -i '' 's/KAFKA_BOOTSTRAP_ROUTE_URL/'$(oc get route my-cluster-kafka-bootstrap --output=jsonpath={.spec.host})':443/g' src/main/resources/application-local.propertiesOnce you changed the kafka.bootstrap.url you can run the application via maven -with using local profile:
|
Tip
|
It is optional to scale down the current Camel-Strimzi example application that’s already running on OpenShift for consuming the logs that are produced only from local environment. oc scale dc/camel-example-spring-boot-strimzi --replicas=0 |
SPRING_PROFILES_ACTIVE=local
mvn spring-boot:runAfter application running you should see logs like this:
15:16:02.377 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:03.130 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:04.182 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:05.553 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:06.170 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:08.057 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:09.739 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:10.156 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:10.157 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environment
15:16:11.255 [Camel (camel) thread #1 - KafkaConsumer[testlog]] INFO Consumer Route - Hi, this is Camel-Strimzi example from local environmentCongratulations! You have just consumed and produced messages via Apache Camel routes, through Strimzi’s Apache Kafka cluster.
If you hit any problem using Camel or have some feedback, then please let us know.
We also love contributors, so get involved :-)
The Camel riders!
