A profile is a template, not a running deployment. Instantiating a profile produces a stack draft on a target cluster, which you then review and commit like any other stack change.
Watch a working OpenSearch stack reviewed, parameterised and published as a profile.
Why use profiles
- Standardise a golden stack (monitoring, ingress, security baseline) and reuse it across clusters.
- Parameterise the bits that differ per environment - domains, replica counts, sizes - instead of copy-pasting YAML.
- Version changes with a changelog and channels, and diff any two versions.
- Track drift: a profile shows how many instantiations are behind its latest version.
Anatomy of a profile
Secret-typed parameters and other sensitive values are redacted when a profile is captured, so credentials are never baked into a shared template.
Create a profile
You can create a profile two ways:From an existing stack
Capture a profile directly from a stack already running on a cluster.
Optionally include addon configurations. This is the fastest path - build
and validate the stack first, then snapshot it.
Import
Import a profile from exported IaC content, for sharing across
organisations or storing in Git.
- This organisation keeps it private to members of your organisation.
- Public makes it available to every organisation.
- Specific organisations keeps it private and grants access to the organisation slugs you enter.
Build with drafts
For more control, work in a draft: create a draft (optionally seeded from a cluster’s stack), edit its spec and parameters, validate it, then publish it as a new version.1
Create a draft
POST /org/stack-profiles/drafts - optionally seeded from an existing profile or a source cluster stack.2
Edit and validate
Update the draft’s spec and parameters, then
POST /org/stack-profiles/drafts/{draft_id}/validate to surface any issues before publishing.3
Publish a version
POST /org/stack-profiles/drafts/{draft_id}/publish with a channel and changelog. This creates the profile (or a new version of it).To update an existing profile, always author through a draft (Edit Builder in the portal, or
ankra stack-profiles drafts from the CLI) rather than exporting the IaC, editing it, and re-importing. A draft seeded from the profile keeps the version’s input annotations - titles, descriptions, enum choices, and choices that set other inputs - and publishes a new version of the same profile. Importing an edited export re-detects the inputs from the spec, drops those annotations, and creates a separate new profile.Instantiate a profile
Instantiating turns a profile into a stack on a target cluster:1
Choose a profile and version
Pick the profile and, optionally, a specific version. When no version is
given, the profile’s current version is used - the pinned version,
which can be older than latest after a rollback.
2
Bind parameters
Supply values for the profile’s parameters. Required parameters must be set; others fall back to their defaults.In the portal, Use Profile opens a page of its own rather than a dialog:
the destination and the inputs on the left, and a summary beside them that
stays in view while you scroll, ticking off the target cluster, the stack
name and the required inputs until Create draft is ready. The form opens
on the inputs the profile left blank and folds the ones that already carry a
default behind a disclosure, with a counter for the required inputs still
empty. Each field names the addon or manifest it
writes into, so a key declared on two components stays unambiguous. Secret
inputs can be generated, revealed, and copied, and any input changed away from
its default can be reset. An input whose name ends in
host, hostname,
fqdn, or domain offers Use cluster domain, filling in that hostname
under the target cluster’s delegated zone.3
Review the draft
Instantiation creates a stack draft on the cluster (with the resolved addons and manifests). Review it.
4
Commit
Commit the draft to deploy, exactly like any other stack change.
Choices that set other inputs
Some inputs only make sense together. A chat profile that can run a small model on one GPU or a large one on a bigger card has four inputs that must agree - the model id, the context length, the GPU memory ceiling and the size of the model store - and an operator asked for each one separately has to know all four answers. A profile author can instead give one input options, and have each option set the others:- In the portal, the choice renders as a card of options above the rest of the form, each naming how many inputs it answers. The inputs an option answers show the value it assigned, labelled with the choice that made it; type over one and it is marked customised, and Reset hands it back to the option. A required input an option answers counts as answered.
- From the CLI,
ankra stack-profiles getprints aChoices for model_sizeblock listing what every option sets, andankra stack-profiles apply <profile> --cluster <name> --set model_size=32bdeploys the whole set with no other bindings. A--setof your own on one of those inputs still wins over the option. - The platform resolves the choice server-side, so the AI assistant, the MCP tools and Terraform get the same stack from the same selection, and the deployment’s recorded parameters are the values that actually deployed.
From the CLI
The Ankra CLI can instantiate a profile directly. Inspect a profile’s parameters first, then apply it to a cluster as a draft (or pass--deploy
to deploy in one step):
For secret parameters use
--set-file <name=path> or --set-env <name=ENV_VAR> rather
than --set so the value never appears in your shell history or process list.Protection: backups travel with the profile
A stack you protect with a backup policy keeps that policy when you save it as a profile, and every instance launched from the profile is protected too - so a fleet does not come up unprotected and need protecting again one cluster at a time. What the profile carries is the declaration, never the rendered schedules. The Velero, CloudNativePG and Percona objects a backup policy materialises are bound to one cluster’s vault, storage classes and object prefix; they are recomputed per cluster from the block and are deliberately left out of a capture. The builder renders it as a single Protection section with three inputs:
Retention tiers and the database / volume selection are not launch inputs: they describe what a restore point of this stack contains, which is the profile author’s decision, so they ride the block and the launcher does not retype them.
The vault is resolved at launch
Vault ids differ per organisation, so protection travels by vault name and is resolved against the target organisation when the profile is instantiated:- the profile names a vault the target organisation has, ready → that vault;
- the profile names none and the organisation has exactly one ready vault → that one;
- anything else - no ready vault, no vault by that name, several to choose from - the stack is created without a backup policy, the result carries a warning saying so, and a deploy is stopped with the draft kept rather than bringing a stateful stack up unprotected. Create and verify a vault, or bind
ankra_protection_vaultto the one this cluster should write to, then deploy the draft.
ankra_protection_vault per cluster to send each instance’s restore points to a different vault.
A public profile carries no vault name - naming one would disclose an organisation-internal resource and describe protection the installer cannot have.
enabled: true with no vault is the publishable shape: the organisation launching it supplies its own vault. Making a profile public is refused while any of its versions still names one.Demo a profile before you deploy it
Instantiating a profile puts it on a real cluster. When you only want to see what it deploys - to review a new version, to check a public profile before adopting it, or to show someone the stack running - launch it as a demo instead. A demo installs the profile into its own throwaway namespace on your organisation’s staging cluster, quota-bounded and on a timer, and deletes itself when the timer runs out. Open the profile’s Demos tab to launch one. See Stack Profile Demos.Share with specific organisations
Making a profilepublic exposes it to everyone. When you want to share a golden stack with one partner, customer, or sibling organisation - and nobody else - share it directly instead:
- Shared organisations can list, view, diff, export, and instantiate every version of the profile. They cannot edit, delete, or re-share it.
- The profile keeps its
organisationvisibility; sharing is an explicit per-organisation grant. - The target organisation is identified by its organisation slug (found under organisation settings). Ask the other organisation for theirs.
- Only organisation admins can grant or revoke shares, and a grant re-runs the plaintext-secret scan over every published version - a profile that still carries plaintext secrets cannot be shared. Grants and revokes are recorded in the audit log.
- Revoking a share hides the profile from the other organisation again. Stacks they already deployed from it keep running - they just stop seeing profile updates.
Suggestions: propose and review changes
Sharing is read-only, but improvements can still flow back. Any organisation that can see a profile - shared or public - can open it in the builder with Suggest changes, edit a draft of it, and submit the result as a suggestion. The owning organisation reviews the diff on the profile’s Suggestions tab and either approves it - publishing the proposed contents as the profile’s next version - or rejects it with a note. The proposer can withdraw an open suggestion. The profile stays owner-only throughout: a suggestion changes nothing until an owner approves it. Suggestions are frozen at submit and pass the same plaintext-secret and unbound-placeholder gates as publishing, at submit and again at approve, so no secret value ever travels through one. See Stack Profile Suggestions for both sides of the flow, end to end.Versioning, diffing, and updates
- Save a new version from an updated source stack, or by publishing an edited draft.
- Diff any two versions to see what changed:
GET /org/stack-profiles/{profile_id}/diff?from_version=1&to_version=2. - Diff a draft before publishing it, against the version it was opened from:
GET /org/stack-profiles/drafts/{draft_id}/diff. The draft is redacted first, so the comparison shows what publishing would actually store rather than your working copy. A draft that will create a brand-new profile has no base, so everything in it reads as added. - Update tracking: a profile reports
outdated_instantiation_countandhas_update_availableso you can find the deployments that are behind. - Update a deployment in place: updating a tracked deployment replaces the contents of the stack it already runs with the chosen version - the same stack, so Kubernetes performs a rolling update of the workloads and nothing is deployed twice - and records the deployment at the new version, so the counters above follow. The non-secret inputs it was last applied with are carried forward; secret inputs are asked for again. Do not instantiate the profile a second time to update a deployment: that produces a new stack beside the running one, renamed around the name collision.
- Export IaC for a version to store the template in Git or move it between organisations.
Deprecate a version
A published version cannot be deleted - deployments record which version they run, and that history has to stay readable - but it can be withdrawn. When a version turns out to be incompatible with what clusters run today, to carry a critical bug, or to ship a CVE, the profile’s owner deprecates it with a reason and, optionally, a note and the advisories it relates to:- Nothing deploys the version. The launch page refuses it, and so do
ankra stack-profiles apply --version 3,rollout, a demo launch and an in-place update onto it - every lane answers409with the reason and the note (Version 3 of this profile is deprecated (CVE): Fixed in v4. Deploy another version.), so the person who tried learns what to do instead. - It cannot be made the current version, and the current version cannot be deprecated: every launch that names no version resolves to it, so withdrawing it would leave the profile with nothing to deploy by default. Make another version current first.
- Deployments still running it are flagged: the Deployments tab marks each row deprecated,
ankra stack-profiles deploymentscounts them, and the profile detail reportsupdate_status.deprecated_instantiation_count, so a fleet sitting on a withdrawn version is visible from the profile rather than discovered cluster by cluster.
deprecation (reason, note,
references, deprecated_at, deprecated_by_user_id; null while the version is
deployable), written by POST /org/stack-profiles/{profile_id}/versions/{version}/deprecation
and cleared by DELETE on the same path. Removing a deprecation restores the version exactly
as it was; deployments made before the notice are never touched either way.
See where a profile is deployed
The profile detail page has a Deployments tab listing every stack your organisation has created from the profile: the cluster, the stack (a link to the running stack, or to the still-open draft when it was never committed), its current state, the profile version it runs, the non-secret parameter values it was instantiated with, and when. Rows running a version older than the profile’s current version carry an Update action that opens the update flow pre-filled with the values used last time. A stack that is deleted from its cluster drops off the list, as does a draft that is discarded, so the tab always reflects what is actually running. The same rows are served byGET /org/stack-profiles/{profile_id}/instantiations.
The stack a profile was captured from is not a deployment of it
This matters most for the platform layer - a CNI, ingress or storage stack - where deleting and recreating the stack to get a tracked deployment is not an option. To move such a stack onto a profile version without deleting it, export the version and apply it to the cluster under the stack’s own name:platform.yaml before applying it:
- set
metadata.nameto the target cluster’s name - the export carries the profile’s name there, and applying it unchanged imports a new cluster under that name; - set the stack’s
nameto the stack already running on that cluster.
API
All endpoints are under/org/stack-profiles and require authentication; write operations require a CSRF header for browser-originated requests.
See Stacks for the deploy/commit flow and the API Reference for full schemas.