Skip to main content
Version: v1alpha5

Helm Values

Overview

Holos simplifies integrating multiple Helm charts by adding valuable capabilities to Helm and Kustomize:

  1. Inject the same value into multiple charts more safely than using Helm alone.
  2. Add strong type checking and validation for Helm input values.
  3. Implement the rendered manifests pattern.

In this tutorial, we'll manage the prometheus and blackbox Helm charts. By default, the upstream values.yaml files are misconfigured, causing Prometheus to connect to Blackbox at the wrong host and port.

The Code

Generating the structure

Use holos to generate a minimal platform directory structure. First, create and navigate into a blank directory, then use the holos init platform command:

mkdir holos-helm-values-tutorial
cd holos-helm-values-tutorial
holos init platform v1alpha5

Make an initial commit to track changes:

git init . && git add . && git commit -m "initial commit"

Managing the Components

Create the prometheus and blackbox component directories, then add each of the following file contents.

mkdir -p components/prometheus components/blackbox
cat <<EOF > components/prometheus/prometheus.cue
package holos

// Produce a helm chart build plan.
holos: Helm.BuildPlan

Helm: #Helm & {
Chart: {
name: "prometheus"
version: "25.27.0"
repository: {
name: "prometheus-community"
url: "https://prometheus-community.github.io/helm-charts"
}
}
}
EOF

Register the Components

Register the components with the platform by adding the following file to the platform directory.

cat <<EOF > platform/prometheus.cue
package holos

Platform: Components: {
prometheus: {
name: "prometheus"
path: "components/prometheus"
}
blackbox: {
name: "blackbox"
path: "components/blackbox"
}
}
EOF

Render the platform.

holos render platform

Commit the results.

git add . && git commit -m 'add blackbox and prometheus'

Importing Helm Values

Holos renders Helm charts with their default values. We can import these default values into CUE to work with them as structured data instead of text markup.

holos cue import \
--package holos \
--path 'Helm: Values:' \
--outfile components/prometheus/values.cue \
components/prometheus/vendor/25.27.0/prometheus/values.yaml
holos cue import \
--package holos \
--path 'Helm: Values:' \
--outfile components/blackbox/values.cue \
components/blackbox/vendor/9.0.1/prometheus-blackbox-exporter/values.yaml

These commands convert the YAML data into CUE code and nest the values under the Values field of the Helm struct.

important

CUE unifies values.cue with the other \*.cue files in the same directory.

Render the platform using holos render platform and commit the results.

holos render platform
git add . && git commit -m 'import values'

Managing Common Configuration

To manage shared configuration for both Helm charts, define a structure that holds the common configuration values. Place this configuration in the components directory to ensure it is accessible to all components.

cat <<EOF > components/blackbox.cue
package holos

// Schema Definition
#Blackbox: {
// host constrained to a lower case dns label
host: string & =~"^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$"
// port constrained to a valid range
port: int & >0 & <=65535
}

// Concrete values must validate against the schema.
Blackbox: #Blackbox & {
host: "blackbox"
port: 9115
}
EOF
important
  1. CUE loads and unifies all *.cue files from the root directory containing cue.mod to the leaf component path directory.
  2. CUE validates types and constraints. Validation with CUE is better than languages with only type checking.

Add and commit the configuration.

git add . && git commit -m 'add blackbox configuration'

Using Common Configuration Across Components

Referencing common configuration across multiple components is straightforward and reliable using Holos and CUE.

To apply the common configuration, patch the two values.cue files, or manually edit them to reference Blackbox.host and Blackbox.port.

patch -p1 < values.patch
important

Both charts now use the same values in lock step. Holos and CUE integrate them safely and easily.

Remove the patch file, then commit the changes.

rm values.patch
git add . && git commit -m 'integrate blackbox and prometheus together'

Reviewing Changes

Holos makes it easy to view and review platform-wide changes. Render the platform to observe how both Prometheus and Blackbox update in sync.

holos render platform

Changes are easily visible in version control.

git diff

From the diff, we can see this change will:

  1. Reconfigure the Blackbox Exporter host from prometheus-blackbox-exporter to blackbox.
  2. Have no effect on the Blackbox service port, as it was already using the default 9115.
  3. Reconfigure Prometheus to query the Blackbox Exporter at the correct host and port, blackbox:9115.

Without this change, Prometheus incorrectly assumed Blackbox was listening at blackbox on port 80 when it was actually listening at prometheus-blackbox-exporter on port 9115. Going forward, changing the Blackbox host or port will reconfigure both charts correctly.

Commit the changes and proceed to deploy them.

git add . && git commit -m 'render integrated blackbox and prometheus manifests'

Trying Locally

Optionally, apply the manifests rendered by Holos to a Local Cluster.

Next Steps

In this tutorial, we learned how Holos simplifies the holistic integration of the prometheus and blackbox charts, ensuring they are configured consistently. By using Holos, we overcome the limitations of relying solely on Helm, which lacks an effective method to configure both charts to use the same service endpoint.