Install Coral with Helm

The coral-agent chart installs the same agent a zoorikctl connect does, for teams on Helm, Argo CD or Flux.

Updated 16 October 2026 · Published by Zoorik

Before you install

  • Kubernetes 1.30 or later, with nodes on amd64 or arm64.
  • A connect token from the Connect dialog in the Zoorik console. A token works once, within an hour of being issued. Coral is in early access — book a demo (opens in a new tab) for a console account.
  • The control plane origin the console names. It is the origin only: no path and no trailing slash.
  • The cloud identity, if Zoorik is to remove nodes. Install Coral with Terraform + Helm creates it as code, or zoorikctl cluster grant-node-deletion creates it from the command line.

Install

helm install coral-agent \
  oci://ghcr.io/getzoorik/charts/coral-agent \
  --kube-context <context> \
  --namespace default \
  --set controlPlaneUrl=<control plane origin> \
  --set connectToken.value=<connect token>

Install the release in any namespace except zoorik-agent and zoorik-node. The chart creates those two namespaces itself with their Pod Security labels, so --namespace zoorik-agent --create-namespace fails with an ownership error.

The agent redeems the token when it starts and keeps the cluster credential it receives in the Secret zoorik-agent/zoorik-agent-credential, which it creates and owns. The agent Deployment sets minReadySeconds: 120, so helm install --wait takes at least two minutes.

Already connected with zoorikctl? Objects it applied carry no Helm ownership, so helm install refuses them. Run zoorikctl cluster disconnect first, then install the chart with a new connect token.

Values

ValueDefaultWhat it sets
controlPlaneUrl
required
controlPlaneUrl in ConfigMap zoorik-agent-config
connectToken.value
required unless existingSecret is set
Secret zoorik-agent-bootstrap, and the agent pod annotation coral.zoorik.com/connect-token (the token’s key id)
connectToken.existingSecret
empty
a Secret in zoorik-agent that holds the token under bootstrap-token, used instead of zoorik-agent-bootstrap
clusterName
empty
clusterName in zoorik-agent-config; empty lets the control plane name the cluster
clusterResourceId
empty
clusterResourceId in zoorik-agent-config, the cloud resource id of the cluster
scrapeIntervalSeconds
30
scrapeIntervalSeconds in zoorik-agent-config
image.repository
ghcr.io/getzoorik/coral/agent
the agent and webhook image, and agentRegistry in zoorik-agent-release-params
image.tag
the chart’s appVersion
the agent and webhook image tag
image.digest
the chart’s released digest when image.tag is empty
the image digest
serviceAccount.annotations
empty
annotations on ServiceAccount zoorik-agent, for the cloud identity
agentEnv
empty
ConfigMap zoorik-agent-env, read by the agent as environment variables
agent.resources
the bundle’s
the agent container’s resources
webhook.resources
the bundle’s
the webhook container’s resources
webhook.hostNetwork
false
runs the pod webhook on the host network on port 10263, for a control plane that cannot reach pod IPs (EKS with an overlay CNI, some hosted control planes); sets zoorik-agent to the privileged Pod Security level; not for OpenShift
openshift
false
drops the fixed runAsUser, runAsGroup and fsGroup, so OpenShift assigns them

The agent’s resources suit clusters of up to 5,000 pods. For larger clusters, raise them as zoorikctl does, and keep cpu: 100m (agent) and cpu: 50m (webhook) in the requests when you set them:

Podsagent.resources memorywebhook.resources memory
up to 20,000
512Mi request, 1Gi limit
256Mi request, 512Mi limit
up to 50,000
1Gi request, 2Gi limit
512Mi request, 1Gi limit

Cloud identity

The agent reads the cloud through the identity bound to its ServiceAccount. Set it with serviceAccount.annotations:

ClusterAnnotation
AKS, with workload identity
azure.workload.identity/client-id: <client id of the managed identity>. The identity’s federated credential names the subject system:serviceaccount:zoorik-agent:zoorik-agent.
EKS, with IAM roles for service accounts
eks.amazonaws.com/role-arn: <role arn>
EKS, with Pod Identity
No annotation. The association lives in AWS.

On the command line, for AKS:

--set-string 'serviceAccount.annotations.azure\.workload\.identity/client-id=<client id>'

A change to these annotations restarts the agent, because the cloud credential is injected only when a pod is created.

With Argo CD or Flux

To keep the token out of your values, set connectToken.existingSecret to the name of a Secret in zoorik-agent with the token under the key bootstrap-token. The chart creates that namespace, so create the Secret after the install, or deliver it with the same GitOps application. The agent pod waits for it.

The pod webhook, the agent and the node daemon write to some objects after the install. Ignore these fields in an Argo CD application:

ignoreDifferences:
  - group: admissionregistration.k8s.io
    kind: MutatingWebhookConfiguration
    name: zoorik-agent-webhook
    jqPathExpressions:
      - .webhooks[].clientConfig.caBundle
      - .webhooks[] | select(.name == "pods.webhook.coral.zoorik.com") | .objectSelector
      - .metadata.annotations["coral.zoorik.com/webhook-state"]
  - kind: Secret
    name: zoorik-agent-webhook-tls
    jsonPointers: [/data]
  - kind: Secret
    name: zoorik-node-tls
    jsonPointers: [/data]
  - kind: Secret
    name: zoorik-node-ca
    jsonPointers: [/data]
  - kind: ConfigMap
    name: zoorik-rollout-markers
    jsonPointers: [/data]
  - kind: ConfigMap
    name: zoorik-agent-forced-drains
    jsonPointers: [/data]
  - kind: ConfigMap
    name: zoorik-agent-live-migrations
    jsonPointers: [/data]

Upgrade

A Helm-installed agent does not upgrade itself. Each chart version pins one agent release, and helm upgrade to a newer chart version moves it. Helm installs the custom resource definitions only on the first install; the agent applies the definitions its own release carries every time it starts.

Connect again with a new token

helm upgrade coral-agent \
  oci://ghcr.io/getzoorik/charts/coral-agent \
  --kube-context <context> --namespace default \
  --reuse-values --set connectToken.value=<new connect token>

The new token changes the pod annotation, so the agent restarts and enrols with it. With existingSecret, replace the token in the Secret and run kubectl --context <context> -n zoorik-agent rollout restart deployment/zoorik-agent.

Uninstall

helm uninstall removes the objects this chart installed, including both namespaces. It does not undo what the agent changed on nodes and workloads (Zoorik cordons and taints, HPA and VPA holds, rollout markers and deletion-cost settings); zoorikctl cluster disconnect does. Helm leaves the custom resource definitions in place.

Find your own number

One line in your cloud console. One PDF report with your estimated saving at list price.

Estimate your saving

Talk to the builders

Thirty minutes with the people who build Coral.

Book a demo (opens in a new tab)

Or write to founders@zoorik.com