# 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 [Installing Connectware Agents using the connectware-agent Helm Chart](https://docs.cybus.io/2-0-6/documentation/agents/agents-in-kubernetes/installing-connectware-agents-using-the-connectware-agent-helm-chart).

## Deploying Agents Manually

{% hint style="warning" %}
Manual deployment offers more control but 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 Kubernetes manifest file with the necessary configuration. Set the same environment variables as in other deployment methods.
2. Create a Kubernetes secret containing your Cybus registry credentials. This is required for pulling Connectware container images from the registry.
3. Deploy the manifest. The example below uses an `emptyDir` volume for agent data, but for production, use a persistent volume for data durability.

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

{% code lineNumbers="true" %}

```sh
kubectl create secret docker-registry cybus-docker-registry \
  --docker-server=registry.cybus.io \
  --docker-username=${YOUR_USERNAME} \
  --docker-password=${YOUR_PASSWORD} \
  --docker-email=${YOUR_EMAIL}
```

{% 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 example shows a Kubernetes manifest for deploying a Connectware agent. Update the image tag to match your Connectware version.

{% file src="<https://639096190-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FfDpOJO2upcq5EpoSahvK%2Fuploads%2Fgit-blob-e5dba4857935e6e91c4b39e73777d67fde22ba9a%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:2.0.0
          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_HOSTNAME_INGRESS
              value: 'connectware'
          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 %}
