skip to content

How do you choose between publishing your Helm charts to a static index.yaml repository and to a registry?

level: principalimportance: should knowfreq 40%

answer

  1. The artefact is identical either way
  2. Decide on hosting, identity, mirroring, discovery
  3. One catalogue file versus none
  4. Inventory everything that fetches a chart
  5. Dual publishing needs an end date

basics

~20 s

Both channels ship the identical .tgz, so decide on operations, not features: a static index is one file on any web host carrying the whole catalogue; a registry reuses the credentials, replication and retention you already run.

solid answer

~50 s

The artefact does not change - `helm package` produces the same tarball for either channel. What changes is everything around it. A static repository is a directory plus a generated `index.yaml`: no server to run, trivial mirroring, one catalogue file every client downloads whole on update, and whatever authentication the web host offers. A registry gives charts the same identity, access control, replication and retention machinery your container images already use, at the price of losing the single searchable catalogue and requiring every consumer reference and automation to move to `oci://`. I decide on four things: what already exists operationally (do we run a registry with real access control?), how consumers fetch charts and whether their tooling supports the reference form, how the artefacts cross into restricted or air-gapped networks, and catalogue size. Dual publishing is a migration state with an end date, not a destination.

code

bash · 10 lines
bash
helm package ./digest-builder          # -> digest-builder-2.7.3.tgz

# channel A: static repository
cp digest-builder-2.7.3.tgz site/charts/
cp site/charts/index.yaml previous-index.yaml
helm repo index site/charts --merge previous-index.yaml \
  --url https://charts.internal.example/charts

# channel B: registry, same tarball unmodified
helm push digest-builder-2.7.3.tgz oci://registry.internal.example/charts

go deeper

for a junior

Know that both destinations carry the same packaged chart and that the difference is where consumers point. You are not expected to run this decision, but do not assume one of the two is obsolete.

for a middle

Be able to contrast the two concretely: a generated catalogue file plus static hosting on one side, artefacts in a registry with no catalogue file on the other, and what each means for searching and for authentication.

for a senior

Bring the migration reality: the inventory of everything that fetches a chart, credentials in each of those places, how mirroring into restricted networks works today, and how you sequence a cutover without a window where a version exists in only one channel.

for a principal

Own the framing - this is hosting, identity and mirroring, not a chart-format question - and be explicit about what the move does not buy. Set the authoritative channel, the cutover date, and the enforcement point for publishing rights.

This is a distribution-channel decision, not a chart decision, and framing it that way removes most of the noise from the argument. ## What does not change The packaged chart is identical. `helm package` produces a `.tgz` that either channel carries unmodified; nothing in `Chart.yaml` names a destination, and a chart is not rebuilt or converted to move channels. So the choice cannot be made on chart-authoring grounds at all - it is made on hosting, identity, discovery and mirroring. ## What each channel actually is **Static repository.** A directory of tarballs plus a generated `index.yaml` behind an HTTP URL. There is no service to operate, patch or scale; availability is your object store's availability. The catalogue is one file that lists every version of every chart in the repository, and every client downloads that file whole each time it refreshes. Publishing is a file copy plus a regeneration of the index, which is state you must not corrupt or race on. Access control is whatever the web host offers, which typically means a shared credential rather than per-team identity. **Registry.** Charts are pushed as artefacts alongside images, and inherit the platform you already run for images: the same login, the same per-repository access rules, the same replication between regions or into restricted networks, the same retention and immutability settings if the product supports them. There is no catalogue file, so there is nothing equivalent to searching a repository index; discovery has to come from a portal, documentation, or the registry's own listing API. Consumers reference charts by `oci://` rather than by a repository alias, which is the part that touches every pipeline, values file and controller definition you own. ## The four questions I actually ask **What already exists?** Most organisations already run a registry with authentication, quotas, replication and someone on call for it, and do not run a chart repository at all. Putting charts on the path images already take usually removes more operational surface than it adds, and it unifies the answer to "who may publish" and "who may pull". **What fetches the charts?** In-cluster reconcilers, delivery pipelines and infrastructure tools all need to understand the reference form and hold credentials for it. This is a concrete inventory exercise, not a philosophical one: every consumer of a chart is a place that has to change, and one that cannot is a hard constraint on the timeline rather than an argument against the destination. **How do artefacts cross boundaries?** For an air-gapped or restricted enclave, a static repository mirrors as a file copy - sync the tarballs, regenerate the index with the internal base URL so entries point inside the enclave. A registry mirrors with the registry-to-registry copy the platform already performs for images, which usually already crosses that boundary under review. Whichever path is already trusted and audited tends to decide this. **How big is the catalogue?** With one chart and 63 versions, the index file is trivial. With a few hundred charts and years of versions it becomes a multi-megabyte file that every client, every CI job and every developer machine pulls on refresh - a real cost, and one that grows monotonically because you never delete published versions casually. A registry has no equivalent per-refresh whole-catalogue download. ## Two arguments I do not accept "Classic repositories are deprecated." They are not. The documentation recommends the registry path, and the tool supports both; "deprecated" is a claim someone should be asked to substantiate. "Moving to a registry fixes trust." It does not sign anything, does not make versions immutable by itself, and does not stop a bad chart from being pulled. Those are separate decisions that happen to be easier to enforce where a platform already has the hooks - which is a reason, but a different reason, and conflating them produces a migration that claims security benefits it did not deliver. ## Dual publishing Publishing the same tarball to both channels is a reasonable migration state: it lets consumers move at their own pace. It must be one step that fails the build if either upload fails, one channel must be declared authoritative for what "released" means, and it needs an end date. Left alone it becomes two catalogues that drift, and the failure mode is a version present in one and absent in the other with no way to tell which is correct.

  • You publish to both channels during a migration. What is the risk, and how do you bound it?
    Two catalogues that drift. A job failing halfway leaves a version in one channel and not the other, and consumers on different channels disagree about what exists. Make both uploads one step that fails the build if either fails, declare one channel authoritative for what counts as released, publish a dated cutover, and remove the second path on that date. Indefinite dual publishing is two sources of truth with no tie-breaker.
  • What does moving charts to a registry not give you?
    It signs nothing, makes nothing immutable on its own, and does not stop a bad chart from being pulled. It also removes the single searchable catalogue, so discovery has to be replaced with something. Those are all achievable, but as separate decisions - a migration sold on security benefits it did not actually deliver is worse than one sold honestly as consolidating operations.
  • Consumers are inside an air-gapped enclave. How does that affect the choice?
    It often decides it. A static repository mirrors as a file copy: sync the tarballs in and regenerate the index with the internal base URL so entries point inside. A registry mirrors with the same registry-to-registry copy the platform already runs for images, under a review path that already exists. Whichever route is already trusted and audited is worth far more than any feature comparison.

saying these in an interview costs you the question

  • Claims classic index.yaml repositories are deprecated
  • Says charts must be repackaged for a registry
  • Assumes a registry makes versions immutable by default
  • Ignores that every consumer reference has to change
  • Picks a channel before inventorying what fetches charts
  • Treats indefinite dual publishing as the end state

context