Master Trait
Deprecated since2.9.0 The Master trait allows to configure the integration to automatically leverage Kubernetes resources for doing leader election and starting master routes only on certain instances.
It’s activated automatically when using the master endpoint in a route, e.g. from("master:lockname:telegram:bots")….
| this trait adds special permissions to the integration service account in order to read/write configmaps and read pods. It’s recommended to use a different service account than "default" when running the integration. |
| The Master trait is deprecated and will be removed in future release versions. This trait requires the operator to manage RBAC explicitly, which should be avoided for security and simplicity reasons. Users should manually create the required Role and RoleBinding, then configure Quarkus properties directly: |
-p quarkus.camel.cluster.kubernetes.resource-name=<integration>-lock -p quarkus.camel.cluster.kubernetes.resource-type=Lease -p quarkus.camel.cluster.kubernetes.labels."camel.apache.org/integration"=<integration-name>
This trait is available in the following profiles: Kubernetes, Knative, OpenShift.
Configuration
Trait properties can be specified when running any integration with the CLI:
$ kamel run --trait master.[key]=[value] --trait master.[key2]=[value2] integration.yaml The following configuration options are available:
| Property | Type | Description |
|---|---|---|
|
| Can be used to enable or disable a trait. All traits share this common property. |
|
| Enables automatic configuration of the trait. |
|
| When this flag is active, the operator analyzes the source code to add dependencies required by delegate endpoints. E.g. when using |
|
| Name of the configmap that will be used to store the lock. Defaults to "<integration-name>-lock". Name of the configmap/lease resource that will be used to store the lock. Defaults to "<integration-name>-lock". |
|
| Type of Kubernetes resource to use for locking ("ConfigMap" or "Lease"). Defaults to "Lease". |
|
| Label that will be used to identify all pods contending the lock. Defaults to "camel.apache.org/integration". |
|
| Label value that will be used to identify all pods contending the lock. Defaults to the integration name. |
Migration Guide
The Master trait is deprecated and will be removed in a future release. This trait requires the operator to manage RBAC explicitly, which should be avoided for security and simplicity reasons.
Why Migrate?
-
Reduced Operator Permissions: The operator no longer needs permissions to create Role and RoleBinding resources
-
Explicit RBAC Control: Users have full control over the RBAC configuration
-
Simplified Security Model: Better separation of concerns between integration and infrastructure
Migration Steps
Step 1: Create RBAC Resources Manually
Apply the following RBAC resources to your namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: <integration-name>-master
rules:
- apiGroups:
- coordination.k8s.io
resources:
- leases
verbs:
- create
- delete
- deletecollection
- get
- list
- patch
- update
- watch
- apiGroups:
- ""
resources:
- pods
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: <integration-name>-master
subjects:
- kind: ServiceAccount
name: <service-account-name>
roleRef:
kind: Role
name: <integration-name>-master
apiGroup: rbac.authorization.k8s.io Step 2: Configure Quarkus Properties
Instead of using the trait properties, configure the equivalent Quarkus properties directly:
| Master Trait Property | Quarkus Property | Description |
|---|---|---|
|
| Name of the lock resource |
|
| Type of Kubernetes resource (Lease or ConfigMap) |
|
| Labels for pod identification |
Example Migration
Before (using deprecated trait):
$ kamel run MyRoute.java \
-t master.resource-name=my-lock \
-t master.resource-type=Lease \
-t master.label-key=leader-group \
-t master.label-value=my-group After (using Quarkus properties):
# First apply the RBAC resources
$ kubectl apply -f master-rbac.yaml
# Then run with Quarkus properties
$ kamel run MyRoute.java \
--service-account my-integration-sa \
-p quarkus.camel.cluster.kubernetes.resource-name=my-lock \
-p quarkus.camel.cluster.kubernetes.resource-type=Lease \
-p quarkus.camel.cluster.kubernetes.labels."leader-group"=my-group