Skip to content

Add Helm charts for installing Agent Substrate #79

Open

Description

Agent Substrate is currently installed through hack/install- ate.sh / hack/install-ate-kind.sh, which apply raw
manifests, run ko, generate prerequisite secrets, and handle
Kind/GKE-specific differences.

We should add Helm-based installation with two charts:

  • agent-substrate-crds: installs only Agent Substrate CRDs.
  • agent-substrate: installs the runtime/control-plane
    system.

Splitting CRDs into their own chart follows current Helm
operational best practice: CRDs are cluster-scoped, upgrade-
sensitive, and often managed by cluster/platform admins
separately from namespaced workloads.

Proposed Chart Layout

charts/
  agent-substrate-crds/
    Chart.yaml
    crds/
      ate.dev_actortemplates.yaml
      ate.dev_workerpools.yaml
    README.md

  agent-substrate/
    Chart.yaml
    values.yaml
    templates/
    README.md

Motivation

A Helm-based install would make it easier to:

  • Install Agent Substrate without relying on repo-local shell
    scripts.
  • Support GitOps tooling such as Argo CD and Flux.
  • Manage CRDs independently from runtime workloads.
  • Configure images, ValKey, TLS, storage, and observability
    through values.yaml.
  • Provide clearer install, upgrade, and uninstall workflows.

Scope

agent-substrate-crds

This chart should install:

  • WorkerPool CRD
  • ActorTemplate CRD
  • Any future ate.dev CRDs

Acceptance criteria:

  • helm install agent-substrate-crds ./charts/agent-substrate-
    crds
  • CRDs are installed using Helm’s crds/ convention.
  • Chart README documents CRD upgrade behavior and uninstall
    caveats.
  • Runtime chart does not template or own CRDs directly.

agent-substrate

This chart should install the core system components:

  • ate-api-server
  • ate-controller
  • atelet
  • atenet-router
  • atenet-dns
  • ValKey, optionally
  • podcertificate-controller
  • RBAC, ServiceAccounts, Services, ConfigMaps, Secrets, and
    projected volumes

The runtime chart should assume CRDs are already installed and
document installing agent-substrate-crds first.

Configuration Requirements

Expose values for:

  • Component images, tags, pull policies.
  • Internal vs external ValKey.
  • Redis/ValKey TLS and auth settings.
  • GCS/S3/local storage backend settings.
  • Kind/local development profile.
  • GKE/cloud profile.
  • OTLP and Prometheus configuration.
  • Existing secret names for session JWT/CA pools and pod
    certificate CAs.

Bootstrap Secret Handling

The current install script generates prerequisite secrets such
as:

  • session-id-jwt-pool
  • session-id-ca-pool
  • service-dns-ca-pool
  • pod-identity-ca-pool
  • valkey-ca-certs
  • ate-api-server-envvars

The chart should document whether these are:

  1. Provided by the user before install.
  2. Generated by Helm hooks or bootstrap Jobs.
  3. Supported through both modes.

Externally supplied secrets should likely be the production/
default path.

Acceptance Criteria

  • helm install agent-substrate-crds ./charts/agent-substrate-
    crds installs CRDs.
  • helm install agent-substrate ./charts/agent-substrate -n
    ate-system --create-namespace installs the core system after
    CRDs exist.
  • helm uninstall agent-substrate -n ate-system removes runtime
    resources cleanly without deleting CRDs.
  • Runtime chart fails clearly or documents behavior when CRDs
    are missing.
  • values.yaml covers current hack/install-ate.sh
    configuration.
  • Kind/local and cloud/GKE install paths are documented.
  • CI validates helm lint and helm template for both charts.
  • Existing script-based install either keeps working or is
    updated to render/apply the Helm charts.

Non-Goals

  • Packaging demo apps into the core runtime chart.
  • Solving production-grade certificate/key rotation in the
    first version.
  • Removing the existing development scripts immediately.

Implementation Notes

Current install logic lives in:

  • hack/install-ate.sh
  • hack/install-ate-kind.sh
  • manifests/ate-install/
  • manifests/ate-install/generated/
  • manifests/ate-install/kind/

The current manifests use ko:// image references. The Helm
charts should decide whether they require pre-published images
or whether development docs continue using ko to publish
images before Helm install.

Activity

  1. BenTheElder commented on May 27, 2026

    @BenTheElder
    Collaborator

    Existing script-based install either keeps working or is
    updated to render/apply the Helm charts.

    I don't think we should make helm a requirement. Not everyone uses it, and it's a pretty heavy dependency.

    I strongly encourage structure-aware yaml manipulation (e.g. kustomize) over text templating.

    I also think the ko based workflows have been very helpful for rapid iteration and I don't think we want to lose that.

    The Helm charts should decide whether they require pre-published images
    or whether development docs continue using ko to publish
    images before Helm install.

    I think it may be slightly premature to start publishing builds. We don't have defined versions and releases yet.
    We will need to do so eventually, but see:
    https://github.com/agent-substrate/substrate/blob/9bd41df2a36d4779206babbad8c4b6bf1f6e0884/README.md#status-and-compatibility

  2. a4-a4s1 commented on May 27, 2026

    @a4-a4s1

    Stepping back from the helm-vs-kustomize debate: both produce manifests that a GitOps tool can sync. The harder constraint may sit elsewhere.

    Two needs #79 is folding together:

    • Install-time UX: helm, kustomize, raw YAML — all work. The productive Q is whether install can be done against already-published images (no ko, no shell scripts at sync time).
    • GitOps reconciliation: ArgoCD/Flux want a deterministic source of truth. Helm and kustomize both deliver that; ko-rendered manifests with build-local SHAs do not — image refs aren't stable across builds.

    Both needs trace back to the same thing: when stable image references become available. The comment above flagging "premature to publish builds" + the README status-and-compatibility note both point there.

    One Q for maintainers: is there a target where stable builds become the goal? That timing probably anchors the packaging shape more than helm-vs-kustomize directly.

    [🤖a4s1]

  3. EItanya commented on May 27, 2026

    @EItanya
    CollaboratorAuthor

    Existing script-based install either keeps working or is
    updated to render/apply the Helm charts.

    I don't think we should make helm a requirement. Not everyone uses it, and it's a pretty heavy dependency.

    I strongly encourage structure-aware yaml manipulation (e.g. kustomize) over text templating.

    I also think the ko based workflows have been very helpful for rapid iteration and I don't think we want to lose that.

    The Helm charts should decide whether they require pre-published images
    or whether development docs continue using ko to publish
    images before Helm install.

    I think it may be slightly premature to start publishing builds. We don't have defined versions and releases yet. We will need to do so eventually, but see: https://github.com/agent-substrate/substrate/blob/9bd41df2a36d4779206babbad8c4b6bf1f6e0884/README.md#status-and-compatibility

    Just to be clear, I’m mostly focused on reproducible installs via popular tooling. From my experience helm is BY FAR the most popular and widely used kubernetes installation mechanism, usually via Argo and other gitops tools at the org level. My main goal in opening this issue is starting the discussion on how users will install/manage installations of substrate.

    I saw #64, but my experience is that GitOps is the preferred method most of the time, so I wanted to get that discussion going here. Happy to modify the issue to be more about reproducible gitops friendly installs if that would help.

  4. a4-a4s1 commented on May 27, 2026

    @a4-a4s1

    +1 on broadening the issue toward "reproducible GitOps-friendly installs" — that reframe sidesteps the tooling-comparison and surfaces the actual question.

    A few observations on how that broader scope intersects with what's already in-tree:

    • ko-rapid-iteration and pre-published images aren't mutually exclusive. Dev loop keeps ko publish for the tight feedback path; release path publishes versioned images that the GitOps install consumes. The two paths don't share a build but can share a manifest shape (kustomize base + overlay), so the "ko vs published" Q collapses into "two consumers of the same manifests."

    • The structural Q the broader scope surfaces: where does manifests/ate-install/ sit relative to the GitOps install path? Today's manifests/ is ko resolve output; a published-image install would either (a) re-render the same base with image refs swapped in, or (b) ship a separate rendered tree. (a) keeps one source of truth; (b) decouples release cadence from manifest changes.

    • ate-operator: Make it easy to install and manage (multiple) substrates #64 (mtaufen ate-operator install) and this issue overlap on the install-time concerns but differ on the operator-vs-charts axis. Worth a forward-link between the two once the scope here settles, so the operator-install path has a place to land.

    If the issue gets retitled, would it be useful to enumerate the install-time decisions explicitly (release artifact format, version pinning, RuntimeClass parameterization, multi-tenant overlay shape) so the conversation can converge on each in turn?

    [🤖a4s1]

  5. thockin commented on May 31, 2026

    @thockin
    Collaborator

    Given how very in-flux things are -- how important is this RIGHT NOW?

    What I want to avoid is having the same set of steps encoded into 2, 3, 4 different places. If we adopt helm, we should EOL the scripts or make them thin wrappers. Building images and things is still needed, so we can't totally get away from scripts?

  6. EItanya commented on Jun 1, 2026

    @EItanya
    CollaboratorAuthor

    I think maybe my wording of this issue was a bit too prescriptive. I think my main goal here is to make it easier for people to try substrate. I totally understand that things are in flux, and we don't want to commit to any specific shape, but requiring cloning and building is a pretty large hurdle. Maybe we can start with publishing images and a manifest to point folks too. Or is the fear that everything is too early for that?

  7. thockin commented on Jun 1, 2026

    @thockin
    Collaborator

    In this regard, my nature is very conservative. I am terrified of the idea that people will try it, and realize how premature it is, and then never come back. "You only get one shot at a first impression"...

  8. BenTheElder commented on Jun 1, 2026

    @BenTheElder
    Collaborator

    In this regard, my nature is very conservative. I am terrified of the idea that people will try it, and realize how premature it is, and then never come back. "You only get one shot at a first impression"...

    Exactly. I'm concerned that offering "install this in your production v1.31 cluster via one copy-paste command" will invite end-users to depend on a very early pre-alpha before it is ready for that, and for those users it will be a bad first impression.

    For the sort of cloud native developer that wants to evaluate an early POC and possibly contribute, the barrier should be pretty low, we've specifically invested in making the local development flow have minimal requirements and it's quite fast.

    We do have room to make it even lower if needed (e.g. we could obtain go and kubectl for you if that's really a barrier, I think for the current audience it's probably not).

    We also assume a lot of interested users are using AI, which can certainly figure out cloning and running the demo scripts. We've tested that of course.

    I totally understand that things are in flux, and we don't want to commit to any specific shape, but requiring cloning and building is a pretty large hurdle.

    I don't think that hurdle is the wrong level at this "pre-alpha" stage.

    I do think eventually we need to have pre-built binaries, but that should probably be when there's some commitment to compatibility.

    At that point, I'd like to avoid requiring helm, but I don't think it's unreasonable to offer it.
    A number of Kubernetes projects do this by having pre-rendered manifests available to patch with your favorite tool alongside a published chart.


    The use of the beta cert APIs is similar, Taahir Ahmed (@ahmedtd) expects we can GA those in k8s alongside GA-ing substrate so it makes sense to continue driving in that direction even though they're an obstacle for older k8s releases.

  9. bnaylor commented on Oct 14, 2026

    @bnaylor

    Claude (tigerteam-planner session) for bnaylor (@bnaylor):

    A data point for this thread from kube-agents (gke-labs/kube-agents#2935), where a platform agent was asked to "create a new cluster for me that has Agent Substrate installed on it."

    We route infrastructure changes through a pull request against the customer's GitOps repo, so nothing installs until a human merges it. For Substrate the cluster half works fine as declarative config: Standard mode, non-E2 machines, the two beta APIs at creation, the snapshot bucket and its Workload Identity grants, the node pool label. The workload half doesn't, because the only install path is install.sh -> ate-setup deploy, which renders manifests/ate-install and fills placeholders (${SUBSTRATE_VERSION_SUFFIX} in atelet.yaml, for one). So today our agent proposes the cluster and then stops, saying there's no declarative package to point at.

    Totally understand the "not ready for one-command installs" concern above, and we're not asking for a Helm chart. Something as small as EItanya's suggestion would cover it: a rendered, versioned manifest bundle attached to each release (or the parameters ate-setup substitutes, documented), so Config Sync / Flux / Argo can sync it and pin a version. It could stay clearly labelled pre-alpha.

    Not urgent on our side. If that's not something you want to publish yet, that's a fine answer and we'll keep the stop.

  10. BenTheElder commented on Oct 14, 2026

    @BenTheElder
    Collaborator

    I think this is something we're strongly considering for GA, but we have SO MANY other things in flight right now that things like ... figuring out upstream binaries (we have made progress on release automation but it's not all there yet) will need to come first before revisiting this.

    I agree having a rendered manifest is something we want.

  11. added a commit that references this issue on Oct 20, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/dev-infrakind/featureAn enhancement / feature request or implementationprio/P1Important but not critical

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions