Helm interoperability with Flux
Flux AIO can be used as a bridge between Timoni and Helm, enabling Timoni
to orchestrate Helm chart deployments by leveraging Flux's declarative Helm APIs
such as HelmRepository and HelmRelease kinds.
With Flux, Timoni users can take full advantage of existing Helm charts. Timoni Bundles can refer to Helm charts hosted on Helm HTTPS and OCI repositories, and supports setting Helm release values in the same way you would do for Timoni instances.
Install Flux helm-controller
Install Flux helm-controller on a Kubernetes cluster with:
bundle: {
    apiVersion: "v1alpha1"
    name:       "flux-aio"
    instances: {
        "flux": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-aio"
            namespace: "flux-system"
            values: {
                controllers: {
                    helm: enabled:         true
                    kustomize: enabled:    false
                    notification: enabled: false
                }
                hostNetwork:     false
                securityProfile: "privileged"
            }
        }
    }
}
Apply the bundle with:
timoni bundle apply -f flux-aio.cue
Deploy Helm charts
To deploy Helm charts on clusters with Flux installed, you'll be using
the flux-helm-release
Timoni module. This module generates Flux HelmRepository and HelmRelease objects and allows
the configuration of the Helm repository HTTP/S or OCI URL, auth token, chart name, and Helm release values.
Public repositories
Example of deploying cert-manager and ingress-nginx Helm charts to a Kubernetes cluster:
bundle: {
    apiVersion: "v1alpha1"
    name:       "cluster-addons"
    instances: {
        "cert-manager": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-helm-release"
            namespace: "cert-manager"
            values: {
                repository: url: "https://charts.jetstack.io"
                chart: {
                    name:    "cert-manager"
                    version: "1.x"
                }
                helmValues: {
                    installCRDs: true
                }
            }
        }
        "ingress-nginx": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-helm-release"
            namespace: "ingress-nginx"
            values: {
                repository: url: "https://kubernetes.github.io/ingress-nginx"
                chart: {
                    name:    "ingress-nginx"
                    version: "4.x"
                }
                helmValues: {
                    controller: service: type: "NodePort"
                }
            }
        }
    }
}
Apply the bundle with:
timoni bundle apply -f cluster-addons.cue
Timoni will create the Flux Helm repositories, will wait for Flux to install
the cert-manager release, then will proceed with the ingress-nginx installation.
After the releases are installed, Flux will scan for new chart versions every hour,
and will upgrade a release if a new chart version is found. To disable the automated
upgrade, you can set a fix version for each chart under values: chart: version.
Private repositories
When using Helm charts from a private Helm HTTPS or OCI repository, you can provide the auth credentials in the Bundle using Timoni runtime attributes.
Example of deploying the podinfo Helm chart from GitHub Container Registry
using a GitHub PAT for auth:
bundle: {
    apiVersion: "v1alpha1"
    name:       "podinfo"
    instances: {
        "podinfo": {
            module: url: "oci://ghcr.io/stefanprodan/modules/flux-helm-release"
            namespace: "podinfo"
            values: {
                repository: {
                    url: "oci://ghcr.io/stefanprodan/charts"
                    auth: {
                        username: "flux"
                        password: string @timoni(runtime:string:GITHUB_TOKEN)
                    }
                }
                chart: {
                    name:    "podinfo"
                    version: "*"
                }
                helmValues: {
                    logLevel: "info"
                }
            }
        }
    }
}
Assuming the GITHUB_TOKEN is set in your environment, apply the bundle
using the --runtime-from-env flag and Timoni will fill in the token value:
timoni bundle apply -f podinfo.cue --runtime-from-env
Timoni will create a Kubernetes Secret with the Helm credentials, and will configure Flux to use the Secret when pulling the Helm OCI charts from the container registry.