Install the agent
The agent is a single Deployment inside your cluster. It dials out to Seylo over an outbound WebSocket. It has no Service, no Ingress, no NodePort and no inbound port.
What you need: admin in Seylo, and cluster-admin (or enough rights to
create a namespace, ServiceAccount and RBAC objects) on the target cluster.
Use the guided install page
Section titled “Use the guided install page”-
Register the cluster.
Clusters → Add cluster, connection method In-cluster agent. Give it an ID you will recognise — it appears in the install command and in every audit row.
-
Open the install page.
Clusters → Agent install / status for that cluster. It walks three steps and renders the exact command for your cluster, with the server URL already filled in.
-
Choose the scope.
Cluster-wide, or namespace-scoped to a list you provide. This is not cosmetic — Seylo re-renders the RBAC objects in all three output formats from your choice. Read choose an RBAC posture first; the namespace-scoped option has one real consequence for metrics.
-
Issue the enrollment token.
It is shown once, is single-use, and expires in about an hour. Until you issue one, the rendered command carries the literal placeholder
<enrollment-token>rather than anything that looks runnable.You can re-issue one at any time if it expires.
-
Copy the command and run it inside your cluster.
Helm, kubectl and raw YAML are rendered side by side, each with Copy, plus a download of the rendered manifest.
-
Watch step 3 of the page.
It polls Never enrolled → Waiting for agent… → Connected and stops once the agent attaches, showing its version, protocol version, last-seen time and the namespace and deployment counts it reported.
Verify the signature first
Section titled “Verify the signature first”Do this once per version. One command, and it is the difference between “I pulled a container off the internet” and “I checked who built it”.
Both the image and the chart are signed with cosign keyless: the signature is made by the release workflow using its OIDC identity and recorded in the public Rekor transparency log. There is no key to distribute.
# The IMAGE.cosign verify \ --certificate-identity-regexp '^https://github.com/seylo-inc/k8s-deploy/\.github/workflows/release-agent\.yml@refs/tags/agent-v' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com \ ghcr.io/seylo-inc/seylo-agent:0.1.0
# The CHART. A Helm OCI artifact is signed the same way; `helm pull` on its# own verifies nothing.cosign verify \ --certificate-identity-regexp '^https://github.com/seylo-inc/k8s-deploy/\.github/workflows/release-agent\.yml@refs/tags/agent-v' \ --certificate-oidc-issuer https://token.actions.githubusercontent.com \ ghcr.io/seylo-inc/charts/seylo-agent:0.1.0Expect Verified OK. If it fails, do not install — the bytes are not what
we published.
Full detail, including the SBOM attestation and how to pin a digest: verify what you install.
Install
Section titled “Install”Installs the published chart straight from the OCI registry. No helm repo add,
no clone, no registry login.
helm upgrade --install seylo-agent \ oci://ghcr.io/seylo-inc/charts/seylo-agent --version 0.1.0 \ --namespace seylo-agent --create-namespace \ --set serverUrl=wss://portal.seylo.in/agent/connect \ --set clusterId=your-cluster-id \ --set enrollmentToken=k8sdt-enroll_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXThe image comes from the chart’s own defaults, at the digest that chart version was released with, so there is nothing to pass for it.
Namespace-scoped variant. watchNamespaces is required here: a
namespace-scoped agent is bound with a Role inside each managed namespace and
cannot list namespaces itself, so the chart refuses to render without it.
helm upgrade --install seylo-agent \ oci://ghcr.io/seylo-inc/charts/seylo-agent --version 0.1.0 \ --namespace seylo-agent --create-namespace \ --set serverUrl=wss://portal.seylo.in/agent/connect \ --set clusterId=your-cluster-id \ --set enrollmentToken=k8sdt-enroll_XXXX \ --set rbac.scope=namespaced \ --set 'watchNamespaces={prod,staging}'Read it before you run it, if you would rather read than trust:
helm show values oci://ghcr.io/seylo-inc/charts/seylo-agent --version 0.1.0
helm template seylo-agent \ oci://ghcr.io/seylo-inc/charts/seylo-agent --version 0.1.0 \ --set serverUrl=wss://x/agent/connect --set clusterId=x --set enrollmentToken=xThe install page renders the full manifest. Save it and apply it:
kubectl apply -f agent.yamlThe file contains the one-time enrollment token. Treat it as a secret, and delete it once the agent is connected.
If the cluster has egress to Seylo for a plain HTTP GET, you can skip the file:
kubectl apply -f "https://portal.seylo.in/api/admin/clusters/<cluster-id>/agent/manifest?token=<enrollment-token>"That endpoint is administrator-only and simply renders the manifest with your token substituted.
Confirm it worked
Section titled “Confirm it worked”kubectl -n seylo-agent logs -f deploy/seylo-agent# expect: ENROLLED (first install), then "reporting inventory every 30s"In the portal, the cluster shows a green Agent: Connected chip with its
version and last-seen time, and dashboard rows for that cluster carry a small
agent badge so operators can see the data path.
Once connected, delete the one-time enrollment Secret:
kubectl -n seylo-agent delete secret seylo-agent-enrollmentSee verify the install for what “connected” should actually look like.
How the two secrets work
Section titled “How the two secrets work”| Enrollment token | Per-agent credential | |
|---|---|---|
| Prefix | k8sdt-enroll_ |
k8sdt-agent_ |
| Lifetime | ~1 hour, single use | Long-lived, held by the agent |
| Where it lives | The Secret you install with; delete it after | The agent’s own Secret in your cluster |
| Stored by Seylo as | A hash | A hash |
Neither is ever stored in plaintext by Seylo, and a token cannot be recovered from its hash. The enrollment token is never written to the audit log, and the install page uses a POST so a freshly issued token never appears in a URL — and therefore never in a reverse proxy’s access log.
After the first enrollment the agent holds its own credential, which survives upgrades. You do not need a new enrollment token to upgrade.
- Choose an RBAC posture — what the agent may do
- Verify the install
- Behind a proxy or TLS inspection?
- It installed but never connected