# Configuring podAntiAffinity for the connectware-agent Helm Chart

## Configuring podAntiAffinity

The `connectware-agent` Helm chart uses Kubernetes inter-pod anti-affinity to distribute configured agents across different Kubernetes nodes. The chart offers three modes of anti-affinity which you can choose with the `podAntiAffinity` value inside the agent’s entry in the `protocolMapperAgents` context of your values.yaml file:

| Mode             | Effect                                                                                                                            |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| `soft` (default) | Will try to schedule agent pods on different Kubernetes nodes, but will schedule them on the same node if not possible otherwise. |
| `hard`           | Will schedule agent pods only on different nodes. If there are not enough matching nodes available, agents will not be scheduled. |
| `none`           | Will not add anti-affinity rules to the agents.                                                                                   |

**Example**

{% code lineNumbers="true" %}

```yaml
protocolMapperAgentDefaults:
    connectwareHost: connectware.cybus # adjust to actual hostname of Connectware
    podAntiAffinity: hard # agents will only be scheduled on different Kubernetes nodes
protocolMapperAgents:
    - name: bender-robots
    - name: welder-robots # will not be scheduled on the same Kubernetes node as bender-robots agent
```

{% endcode %}

## (Advanced) Overriding podAntiAffinity Options

If you want to configure very specific pod anti-affinity rules to match your Kubernetes cluster setup, you can use the values of the `podAntiAffinityOptions` section inside the agent’s entry in the `protocolMapperAgents` section of your values.yaml file.

Configuring podAntiAffinity Topology Key\
To change topology key used for the agent’s pod anti-affinity, specify the topology key in the `podAntiAffinityOptions.topologyKey` value inside the agent’s entry in the `protocolMapperAgents` context of your values.yaml file.

**Example**

{% code lineNumbers="true" %}

```yaml
protocolMapperAgentDefaults:
    connectwareHost: connectware.cybus # adjust to actual hostname of Connectware
    podAntiAffinity: hard # agents will only be scheduled on different availability zones
    podAntiAffinityOptions:
        topologyKey: topology.kubernetes.io/zone
protocolMapperAgents:
    - name: bender-robots
    - name: welder-robots # will not be scheduled on the same availability zone as bender-robots agent
```

{% endcode %}

### Configuring podAntiAffinity Match Expression

To change match expression used for the agent’s pod anti-affinity, specify the values `podAntiAffinityOptions.key`, `podAntiAffinityOptions.operator`, `podAntiAffinityOptions.value`, value inside the agents entry in the `protocolMapperAgents` section of your values.yaml file.

**Example**

{% code lineNumbers="true" %}

```yaml
protocolMapperAgentDefaults:
    connectwareHost: connectware.cybus # adjust to actual hostname of Connectware
    # Agents will not be scheduled on the same Kubernetes nodes as other agents.
    # This is also true for agents installed through other instances of this Helm chart.
    podAntiAffinity: hard
    podAntiAffinityOptions:
        key: app.kubernetes.io/component
        operator: In
        value: protocol-mapper-agent
protocolMapperAgents:
    - name: bender-robots
    - name: welder-robots # will not be scheduled on the same Kubernetes node as bender-robots agent
```

{% endcode %}
