The module lifecycle stageExperimental

The module has requirements for installation

Adding a Helm repository

To add a repository, create a HelmClusterAddonRepository resource:

apiVersion: helm.deckhouse.io/v1alpha1
kind: HelmClusterAddonRepository
metadata:
  name: podinfo
spec:
  url: https://stefanprodan.github.io/podinfo

After creating the repository, view the available Helm charts:

d8 k get helmclusteraddoncharts.helm.deckhouse.io -l repository=podinfo

Example output:

NAME                                                AGE   LABELS
podinfo-chart-podinfo                               11d   chart=podinfo,heritage=deckhouse,repository=podinfo

To view the list of versions available for a specific chart:

d8 k get helmclusteraddonchart podinfo-podinfo -o yaml

Example output:

apiVersion: helm.deckhouse.io/v1alpha1
kind: HelmClusterAddonChart
metadata:
  labels:
    chart: podinfo
    heritage: deckhouse
    repository: podinfo
  name: podinfo-podinfo
status:
  versions:
    - version: 6.11.0
    - version: 6.10.2

Deploying an application

To deploy an application, create a HelmClusterAddon resource specifying the repository name, chart name and version, and the target namespace:

apiVersion: helm.deckhouse.io/v1alpha1
kind: HelmClusterAddon
metadata:
  name: podinfo
spec:
  namespace: test
  chart:
    helmClusterAddonChart: podinfo
    helmClusterAddonRepository: podinfo
    version: 6.10.2

Only one instance of HelmClusterAddon using a specific Helm chart from a specific repository can be deployed at a time. Different Helm charts from the same repository can be deployed simultaneously.

The .spec.chart.version parameter is optional. If omitted, the latest available version of the chart will be installed.

Triggering a manual reconciliation

To trigger an immediate reconciliation of a resource without waiting for the next scheduled sync, annotate it with reconcile.helm.deckhouse.io/force. The controller will detect the annotation, run a full reconciliation cycle, and remove the annotation automatically once processing is complete.

To trigger reconciliation of a HelmClusterAddon:

d8 k annotate helmclusteraddon podinfo reconcile.helm.deckhouse.io/force="$(date -u +%Y-%m-%dT%H:%M:%SZ)" --overwrite

To trigger reconciliation of a HelmClusterAddonRepository:

d8 k annotate helmclusteraddonrepository podinfo reconcile.helm.deckhouse.io/force="$(date -u +%Y-%m-%dT%H:%M:%SZ)" --overwrite

The annotation value is not significant — only its presence on the resource matters. The controller removes the annotation after the reconciliation is complete.

Observing a forced reconciliation

While a forced pass is running, the resource carries the Reconciling condition with the reason ForceReconcile:

d8 k get helmclusteraddonrepository podinfo -o jsonpath='{.status.conditions[?(@.type=="Reconciling")]}'

A synchronization that runs on the ordinary schedule raises the same condition with the reason Synchronization, so the reason tells the two apart.

Once the pass finishes, that condition is removed and .status.lastForceReconcileTime records when the request was processed:

d8 k get helmclusteraddonrepository podinfo -o jsonpath='{.status.lastForceReconcileTime}'

The timestamp records that the request was acted on, not that it succeeded — the outcome is reported by the Ready and Synced conditions.

A HelmClusterAddon in maintenance mode (.spec.maintenance: NoResourceReconciliation) is not reconciled at all, so a force request on it cannot be honoured. The controller discards the annotation instead of holding it until maintenance is lifted, and .status.lastForceReconcileTime is left untouched. Lift maintenance first, then request the reconciliation.