hull multi-install
Install one package as the same release into several clusters in a single invocation.
When to use it
- Rolling the same release out to many clusters with identical parameters — per-region copies of a platform service, or a fleet of edge clusters.
- Fan-out installs from CI where you want one command, one result table, and an optional all-or-nothing guarantee across clusters.
Each target is a kubeconfig context named in --to. For a single cluster use
hull install; to drive many releases across contexts from a
workspace file, see hull workspace.
What happens
- Reads the target contexts from
--to(comma-separated). At least one is required. - Installs
<release-name>from<package-path>into each context in parallel, up to--parallelat a time, applying the same values,--setoverrides,--profile, and--envto every target. All installs use the namespace from-n/--namespace. - Waits for each cluster’s resources to become ready (up to
--timeout) unless--no-waitis set. - Prints one result row per context. With
--atomic-cross-cluster, if any context fails, the successful installs are rolled back and the command exits non-zero; without it, each install stands on its own (eventual consistency).
This mutates every target cluster and requires all named contexts to be reachable.
Usage
hull multi-install <release-name> <package-path> [flags]
Flags
| Flag | Type | Default | Description |
|---|---|---|---|
--to |
strings | — | kubeconfig contexts to install into (comma-separated); required |
--atomic-cross-cluster |
— | false | if any context fails, roll back the successful ones and fail |
--parallel |
int | 4 | number of contexts to install into concurrently |
--timeout |
duration | 5m0s | per-cluster wait for resources to become ready |
--no-wait |
— | false | do not wait for resources to be ready in any cluster |
--profile |
string | — | profile to apply |
--env |
string | — | environment name declared in hull.yaml’s environments: section |
-f, --values |
stringArray | — | values file override (repeatable) |
--set |
stringArray | — | key=value override (repeatable) |
--set-string |
stringArray | — | key=value forced as string (repeatable) |
--set-file |
stringArray | — | key=path; value read from path (repeatable) |
--set-json |
stringArray | — | key= |
Persistent flags inherited from hull
| Flag | Type | Description |
|---|---|---|
--debug |
— | enable debug output |
--kube-context |
string | Kubernetes context to use |
--kubeconfig |
string | path to kubeconfig file |
-n, --namespace |
string | Kubernetes namespace |
Worked example
INPUT — install web into three regional clusters:
hull multi-install web ./web \
--to ctx-eu,ctx-us,ctx-ap \
-n prod --set image.tag=1.5.0
OUTPUT — one row per target context:
CONTEXT STATUS DETAIL
ctx-eu ok revision 1, status deployed
ctx-us ok revision 1, status deployed
ctx-ap ok revision 1, status deployed
With --atomic-cross-cluster, one bad cluster rolls back the rest:
hull multi-install web ./web \
--to ctx-eu,ctx-us,ctx-ap \
-n prod --atomic-cross-cluster
CONTEXT STATUS DETAIL
ctx-eu ok revision 1, status deployed
ctx-us ok revision 1, status deployed
ctx-ap FAIL wait timed out after 5m0s
Atomic cross-cluster install failed — rolling back successful installs.
The command exits non-zero, and ctx-eu and ctx-us are uninstalled so no
cluster is left in a partial state.