Spring Boot Camel Singleton Services Kubernetes

Implementation of the Singleton Service Pattern with clustered Camel routes deployed on Kubernetes/Red Hat OpenShift

Prerequisites

  • Maven

  • A Red Hat Openshift or Kubernetes instance

  • A java jdk 8 or 11

Running the example on Openshift

Important
You need to run this example on Container Development Kit 3.3 or OpenShift 4.8. Both of these products have suitable Fuse images pre-installed. If you run it in an environment where those images are not preinstalled follow the steps described in Running the Quickstart on a single-node Kubernetes/OpenShift cluster without preinstalled images.

To deploy this quickstart to a running OpenShift cluster:

  1. Download the project and extract the archive on your local filesystem.

  2. Log in to your OpenShift cluster:

    $ oc login -u developer -p developer
  3. Create a new OpenShift project for the quickstart:

    $ oc new-project MY_PROJECT_NAME
  4. Change the directory to the folder that contains the extracted quickstart application (for example, my_openshift/camel-springboot-singleton-services-kubernetes) :

$ cd my_openshift/camel-springboot-singleton-services-kubernetes
  1. Build and deploy the project to the OpenShift cluster:

    $ mvn clean -DskipTests oc:deploy -Popenshift
  2. List all the running pods:

    $ oc get pods
  3. Find the name of the pod that runs this quickstart. Output the logs from the running pods and see the messages sent by Camel:

    $ oc logs <name of pod>
    2022-01-20 11:04:57.997  INFO 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-vm8bl] The cluster has no leaders. Trying to acquire the leadership...
    2022-01-20 11:04:58.005  INFO 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-vm8bl] The cluster has no leaders. Trying to acquire the leadership...
    2022-01-20 11:04:58.337  INFO 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-vm8bl] Leadership acquired by current pod with immediate effect
    2022-01-20 11:04:58.342  WARN 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-vm8bl] Unable to create the ConfigMap, it may have been created by other cluster members concurrently. If the problem persists, check if the service account has the right permissions to create it
    2022-01-20 11:04:58.342  INFO 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-vm8bl] Unable to acquire the leadership, it may have been acquired by another pod
    2022-01-20 11:04:58.359  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The list of cluster members has changed: [springboot-camel-singleton-services-kubernetes-1-vm8bl, springboot-camel-singleton-services-kubernetes-1-5cn7h, springboot-camel-singleton-services-kubernetes-1-lvwb6]
    2022-01-20 11:04:58.382  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The cluster has a new leader: Optional[springboot-camel-singleton-services-kubernetes-1-vm8bl]
    2022-01-20 11:04:58.387  INFO 1 --- [sLeaderNotifier] o.a.c.component.master.MasterConsumer    : Leadership taken: consumer started: timer://clock
    2022-01-20 11:04:58.387  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The list of cluster members has changed: [springboot-camel-singleton-services-kubernetes-1-vm8bl, springboot-camel-singleton-services-kubernetes-1-5cn7h, springboot-camel-singleton-services-kubernetes-1-lvwb6]
    2022-01-20 11:04:59.438  INFO 1 --- [- timer://clock] route1                                   : Hello World!
    2022-01-20 11:05:00.388  INFO 1 --- [- timer://clock] route1                                   : Hello World!
    2022-01-20 11:05:01.388  INFO 1 --- [- timer://clock] route1                                   : Hello World!
    2022-01-20 11:05:02.388  INFO 1 --- [- timer://clock] route1                                   : Hello World!
    2022-01-20 11:05:03.390  INFO 1 --- [- timer://clock] route1                                   : Hello World!
  4. The output of the other two pod in the cluster should waiting for the lock:

    2022-01-20 11:05:00.125  INFO 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-5cn7h] The cluster has no leaders. Trying to acquire the leadership...
    2022-01-20 11:05:00.154  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The cluster has a new leader: Optional[springboot-camel-singleton-services-kubernetes-1-vm8bl]
    2022-01-20 11:05:00.182  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The list of cluster members has changed: [springboot-camel-singleton-services-kubernetes-1-vm8bl, springboot-camel-singleton-services-kubernetes-1-5cn7h, springboot-camel-singleton-services-kubernetes-1-lvwb6]
    2022-01-20 11:05:00.280  INFO 1 --- [rshipController] c.c.k.c.l.KubernetesLeadershipController : Pod[springboot-camel-singleton-services-kubernetes-1-5cn7h] Leadership acquired by current pod with immediate effect
    2022-01-20 11:05:00.308  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The cluster has a new leader: Optional[springboot-camel-singleton-services-kubernetes-1-5cn7h]
    2022-01-20 11:05:00.309  INFO 1 --- [sLeaderNotifier] i.f.q.camel.singleton.CustomService      : CustomService has been started on the master pod
    2022-01-20 11:05:00.309  INFO 1 --- [sLeaderNotifier] o.a.c.c.k.c.lock.TimedLeaderNotifier     : The list of cluster members has changed: [springboot-camel-singleton-services-kubernetes-1-vm8bl, springboot-camel-singleton-services-kubernetes-1-5cn7h, springboot-camel-singleton-services-kubernetes-1-lvwb6]

Running the Quickstart on a single-node Kubernetes/OpenShift cluster without preinstalled images

A single-node Kubernetes/OpenShift cluster provides you with access to a cloud environment that is similar to a production environment.

If you have a single-node Kubernetes/OpenShift cluster, such as Minishift or the Red Hat Container Development Kit, installed and running, you can deploy your quickstart there.

  1. Log in to your OpenShift cluster:

    $ oc login -u developer -p developer
  2. Create a new OpenShift project for the quickstart:

    $ oc new-project MY_PROJECT_NAME
  3. Import base images in your newly created project (MY_PROJECT_NAME) according to documentation.

  4. Change the directory to the folder that contains the extracted quickstart application (for example, my_openshift/camel-springboot-singleton-services-kubernetes) :

    $ cd my_openshift/camel-springboot-singleton-services-kubernetes
  5. Build and deploy the project to the OpenShift cluster:

    $ mvn clean -DskipTests oc:deploy -Popenshift -Djkube.generator.fromMode=istag -Djkube.generator.from=MY_PROJECT_NAME/fuse-java-openshift:1.13
  6. In your browser, navigate to the MY_PROJECT_NAME project in the OpenShift console. Wait until you can see that the pods for the camel-springboot-singleton-services-kubernetes-* have started up.

  7. On the project’s Overview page, navigate to the details page deployment of the camel-springboot-singleton-services-kubernetes application: https://OPENSHIFT_IP_ADDR:8443/console/project/MY_PROJECT_NAME/browse/pods/camel-springboot-singleton-services-kubernetes-NUMBER_OF_DEPLOYMENT?tab=details.

  8. Switch to tab Logs and then see the messages sent by Camel.