0

I am programmatically creating my CamelContext and successfully creating the ClusterServiceProvider using the KubernetesClusterService implementation. When running in my kubernetes cluster, it is electing a leader and responding appropriately to "master:" routes. All good.

However, I would like to limit the Pod/Deployments that are detected in the cluster member negotiation/inspection. It currently has knowledge of (finds) every Pod in the cluster namespace which includes completely unrelated deployments/instances.

The overall question is how to select what Pods/Deployments should be included in the particular camel cluster?

I see in the KubernetesLockConfiguration there is an attribute called clusterLabels however it is unclear to me how or what that is used for. When I do set the clusterLabels to something syntactically common in kubernetes (e.g. app -> my-app), then the cluster finds no members.

I mention that I am doing this programmatically as there is no spring-boot or other commonly documented configuration of camel involved. Running in Play-Framework Scala.

First, I create a CamelContext

val context = new DefaultCamelContext()
val rb = new RouteBuilder() {
  def configure() = {
    val policy = ClusteredRoutePolicy.forNamespace("default")
    from(s"master:ip:timer://master-timer?fixedRate=true&period=60000")
      .routePolicy(policy)
      .bean(classOf[MasterTimer], "execute()")
      .log("Current Leader ${routeId}")
  }
}

Second, I create a ClusterServiceProvider

import org.apache.camel.component.kubernetes.cluster.KubernetesClusterService
val crc = new ClusteredRouteController()
val service = new KubernetesClusterService
service.setCamelContext(cc)
service.setKubernetesNamespace("default")

//
// if I set clusterLabels here, no camel cluster is realize/created.
//   assumption is the my syntax for CamelKubernetes is wrong however
//   it is unclear from documentation how to make this work.
//
// if I do not set clusterLabels, every pod in my kubernetes cluster is 
//   part of a cluster-member (CamelKubernetesLeaderNotifier logs that
//   the list of cluster members has changed).   So I get completely 
//   un-related deployments in the context of something that I want
//   to specifically related, namely all pods with an "app" label of
//   "my-app"
//
service.setClusterLabels(Map("app" -> "my-app").asJava)

crc.setNamespace("default")
crc.setClusterService(service)

camelContext.addService(service)
camelContext.setRouteController(crc)
camelContext.start()
camelContext.getRouteController().startAllRoutes()

Brad Rust
  • 1
  • 1

0 Answers0