= Affinity Trait

// Start of autogenerated code - DO NOT EDIT! (badges)
// End of autogenerated code - DO NOT EDIT! (badges)
// Start of autogenerated code - DO NOT EDIT! (description)
Allows constraining which nodes the integration pod(s) are eligible to be scheduled on, based on labels on the node,
or with inter-pod affinity and anti-affinity, based on labels on pods that are already running on the nodes.

It's disabled by default.


This trait is available in the following profiles: **Kubernetes, Knative, OpenShift**.

// End of autogenerated code - DO NOT EDIT! (description)
// Start of autogenerated code - DO NOT EDIT! (configuration)
== Configuration

Trait properties can be specified when running any integration with the CLI:
[source,console]
----
$ kamel run --trait affinity.[key]=[value] --trait affinity.[key2]=[value2] integration.yaml
----
The following configuration options are available:

[cols="2m,1m,5a"]
|===
|Property | Type | Description

| affinity.enabled
| bool
| Can be used to enable or disable a trait. All traits share this common property.

| affinity.pod-affinity
| bool
| Always co-locates multiple replicas of the integration in the same node (default `false`).

| affinity.pod-anti-affinity
| bool
| Never co-locates multiple replicas of the integration in the same node (default `false`).

| affinity.node-affinity-labels
| []string
| Defines a set of nodes the integration pod(s) are eligible to be scheduled on, based on labels on the node.

| affinity.pod-affinity-labels
| []string
| Defines a set of pods (namely those matching the label selector, relative to the given namespace) that the
integration pod(s) should be co-located with.

| affinity.pod-anti-affinity-labels
| []string
| Defines a set of pods (namely those matching the label selector, relative to the given namespace) that the
integration pod(s) should not be co-located with.

|===

// End of autogenerated code - DO NOT EDIT! (configuration)

== Examples

* To schedule the integration pod(s) on a specific node using the https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#interlude-built-in-node-labels[built-in node label] `kubernetes.io/hostname`:
+
[source,console]
$ kamel run -t affinity.node-affinity-labels="kubernetes.io/hostname in(node-66-50.hosted.k8s.tld)" ...

* To schedule a single integration pod per node (using the `Exists` operator):
+
[source,console]
$ kamel run -t affinity.pod-anti-affinity-labels="camel.apache.org/integration" ...

* To co-locate the integration pod(s) with other integration pod(s):
+
[source,console]
$ kamel run -t affinity.pod-affinity-labels="camel.apache.org/integration in(it1, it2)" ...

The `*-labels` options follow the requirements from https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/#label-selectors[Label selectors].
They can be multi-valuated, then the requirements list is ANDed, e.g., to schedule a single integration pod per node AND not co-located with the Camel K operator pod(s):

[source,console]
----
$ kamel run -t affinity.pod-anti-affinity-labels="camel.apache.org/integration" -t affinity.pod-anti-affinity-labels="camel.apache.org/component=operator" ...
----

More information can be found in the official Kubernetes documentation about https://kubernetes.io/docs/concepts/configuration/assign-pod-node/[Assigning Pods to Nodes].
