Skip to main content
In the previous lesson we covered Helm charts and how to deploy them in a Kubernetes cluster using Flux’s HelmRelease controller. In this lesson we’ll deploy a packaged Helm chart (.tgz) that is published in a Helm repository (hosted via GitHub Pages / Artifact Hub). We’ll use Flux’s source-controller Helm API to register the Helm repository and a HelmRelease to install the chart into the cluster. This demo uses a packaged Helm chart (block-buster-helm-app) published as a GitHub Release and indexed on Artifact Hub. The release contains the Helm artifact block-buster-helm-app-7.6.0.tgz and a sample values.yaml.
A dark‑theme GitHub releases page for the repository "sidd-harth/block-buster-helm-app" showing the 7.6.0 release. The page lists assets including a block-buster-helm-app-7.6.0.tgz and source code archives.
Artifact Hub lists the package entry (this version does not include a README in Artifact Hub):
A dark-themed ArtifactHUB package page screenshot showing the message "This package version does not provide a README file" and a bar chart of views over the last 30 days. The right sidebar shows chart version and a security report with vulnerability counts, and related packages are listed below.
You can install the chart locally with Helm for quick testing:
In this lesson we will instead register the Helm repository with Flux, create a HelmRelease that references that HelmRepository, and let Flux reconcile and install the chart.

Overview of the steps

  1. Create a HelmRepository source in Flux.
  2. Prepare a values.yaml (optional customization).
  3. Create a HelmRelease that references the HelmRepository.
  4. Inspect how Flux source-controller stores index and chart artifacts.
  5. Verify the HelmRelease and the deployed resources.

1) Create a HelmRepository source in Flux

Register the Helm repository URL (the GitHub Pages URL shown on Artifact Hub) using a HelmRepository resource. You can either write the manifest directly or use the flux CLI to create/export it. Example HelmRepository manifest:
Create/export with the flux CLI:
This registers the Helm repository as a Flux source. The source-controller will periodically fetch the repository index.yaml and store a local artifact.

2) Prepare a values file for the release

Create a values file (for example 6-demo-values.yml) to override chart defaults. This demo sets two replicas, uses NodePort service on port 30006, and injects labels and namespace configuration. Example 6-demo-values.yml:
Remember to save the values file before running the flux create helmrelease command that references it — otherwise the CLI export won’t include the values.

3) Create a HelmRelease that uses the HelmRepository source

Declare which chart and version to install, the target namespace, and the values file with a HelmRelease. You can create/export it with the flux CLI:
Example exported HelmRelease manifest:
Apply both the HelmRepository and HelmRelease manifests to your cluster (commit to the Git repo Flux watches or apply directly with kubectl).

4) How Flux source-controller fetches Helm artifacts (explanation)

  • The HelmRepository resource tells source-controller to fetch the repository index.yaml from the Helm repo URL. The index.yaml maps chart names and versions to artifact URLs (for example, a GitHub Releases tarball URL).
  • The HelmRepository artifact stored by source-controller contains index metadata and the URLs, but not the expanded chart contents.
  • When a HelmRelease references a chart from that HelmRepository, the Helm controller creates a HelmChart reference and source-controller fetches the chart tarball (.tgz) and stores it as a HelmChart artifact. That tarball contains Chart.yaml, values.yaml, templates/, README, etc. — the actual chart contents that Helm will render.
Inspecting what source-controller stores:
  1. Check the registered Flux Helm sources and readiness:
  1. Exec into the source-controller pod to inspect on-disk artifacts:
Sample trimmed index.yaml entry (shows the tarball URL):
  1. When the chart is fetched for the HelmRelease, the helmchart directory contains the downloaded artifact. You can list and inspect the tarball:
Sample tar listing:
Summary of the difference:

5) Verify the HelmRelease and deployed resources

After committing/applying the manifests, Flux will reconcile and install the release. Check HelmReleases:
Verify the namespace and resources — the HelmRelease targeted targetNamespace: 6-demo, replicaCount=2, and nodePort=30006:
Access the application in the browser at http://localhost:30006 (or the appropriate node IP and nodePort) to confirm the running app and version. The application UI (Block Buster demo) is accessible and interactive:
A colorful "BLOCK BUSTER" arcade-style Breakout screen showing rows of colored bricks, a paddle and a ball. The top panel displays pod/app info (Pod Name, Pod IP, Namespace, K8S Node, App Version) with level, score and lives, and a "START GAME" button at the bottom.
Using NodePort exposes the application on cluster nodes — ensure this is acceptable for your environment. For production, consider LoadBalancer services or an Ingress controller with authentication and TLS.

Summary

  • Registered a Helm repository in Flux using a HelmRepository source.
  • Prepared a values file and created a HelmRelease that points to the HelmRepository.
  • The source-controller fetched the repository index.yaml (which contains chart URLs). When the HelmRelease reconciled, Flux fetched the .tgz chart package and installed it into the cluster.
  • Deployed application version 7.6.0 is running in namespace 6-demo with two replicas and NodePort 30006.

That’s it for this lesson — deploying a packaged Helm chart from a Helm repository using Flux’s HelmRepository and HelmRelease.

Watch Video

Practice Lab