# Installing Agents via Kubernetes

To ensure a smooth and standardized deployment of Connectware agents on your Kubernetes cluster, we recommend that you use the connectware-agent Helm chart. This approach streamlines the installation process and provides a more robust and maintainable solution compared to manual deployment.

## Deploying Agents Using the connectware-agent Helm Chart

The connectware-agent Helm chart simplifies the deployment of Connectware agents on Kubernetes. Here is an overview of the steps:

1. Add the Cybus Helm repository to your local Helm installation.
2. Update your local Helm chart repository.
3. Install the connectware-agent chart via Helm commands.

For detailed instructions on how to install agents via the connectware-agent Helm chart, see the [Cybus Learn article](https://www.cybus.io/learn/installing-connectware-agents-using-the-connectware-agent-helm-chart/).

## Deploying Agents Manually

{% hint style="warning" %}
While manual deployment offers more control, it requires a deeper understanding of Kubernetes concepts and involves more steps than using the Helm chart.
{% endhint %}

To manually deploy agents on a Kubernetes cluster:

1. Prepare a YAML manifest file with the necessary configurations. You'll need to set the same parameters as in other deployment methods.
2. Create a Kubernetes secret containing the Cybus registry credentials. This is required for pulling Connectware container images from the registry.
3. Deploy the manifest, which typically uses an `emptyDir` volume for storing agent data. However, for production environments, we recommend replacing this with a persistent volume to ensure data durability.

* Use the following command to create a secret named `cybus-docker-registry`:

{% code lineNumbers="true" %}

```yaml
kubectl create secret docker-registry cybus-docker-registry \
--docker-server=registry.cybus.io \
--docker-username=john.doe \
--docker-password=abcd123 \
--docker-email=john.doe@example.org
```

{% endcode %}

Depending on your setup, use one of the following sets of credentials:

If you have a Cybus Portal account:

* `docker-username`: Your Cybus Portal username
* `docker-password`: Your Cybus Portal password

If you're using a Connectware license key:

* `docker-username`: `license`
* `docker-password`: Your Connectware license key

## Example for Manual Agent Deployment

The following code example allows you to manually create an example manifest file:

{% file src="<https://1495428842-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FPRxCI5iN2a8F6qzT9n0T%2Fuploads%2Fgit-blob-07db084247a7b974b2a93068ae15e346858dcb84%2Fagent-deployment.yaml?alt=media>" %}

{% code lineNumbers="true" %}

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
    # The id for this kubernetes object
    name: connectware-agent-deployment
    labels:
        # Attach labels for easy group selection
        app: protocol-mapper-agent
spec:
    replicas: 1
    selector:
        matchLabels:
            app: protocol-mapper-agent
    template:
        metadata:
            labels:
                app: protocol-mapper-agent
        spec:
            # Configure volumes used by the agent to store data across restarts
            volumes:
                - name: agent-data-volume
                  emptyDir: {}
            containers:
                - name: protocol-mapper-agent
                  # Container image. Watch out: Must use identical version tag to current Connectware version!
                  image: registry.cybus.io/cybus/protocol-mapper:1.0.32
                  env:
                      # Make the protocol-mapper runs as an agent
                      - name: CYBUS_AGENT_MODE
                        value: 'distributed'
                        # Set the name of the agent. This must match the agentName used in the commissioning file.
                      - name: CYBUS_AGENT_NAME
                        value: 'myAgent'
                        # The IP address or hostname where the Connectware is running
                      - name: CYBUS_MQTT_HOST
                        value: '10.11.12.13'
                  ports:
                      # Expose the ports used by the agent.
                      - containerPort: 443
                  # Configure mount points
                  volumeMounts:
                      - mountPath: /data
                        name: agent-data-volume
                  # Configure resource limits
                  resources:
                      limits:
                          cpu: 4000m
                          memory: 4Gi
            # Kubernetes secret used to pull the images from the Cybus registry
            imagePullSecrets:
                - name: cybus-docker-registry
```

{% endcode %}
