Install Helper

There are a lot of charts and components required to be installed and managed for PrimeHub. We need a way to manage common settings across all these components. And provide a way to template the helm value files by feature flags.

Design

In the common helm installation, it may look like the following command.

helm install \
  --name primehub \
  --namespace hub \
  --values primehub-value.yaml \
  modules/charts/primehub

However, it is not convenient to issue this long command for each installation and not easy to be source-controlled as well. To solve this problem, we make use of helmfile. The above command would turn into the yaml file below.

# primehub.yaml
charts:
  - name: primehub
    namespace: primehub
    chart: modules/charts/primehub
    version: ~0.1.0
    values:
      - primehub-values.yaml

and the install command would change to

helmfile -f primehub.yaml

In this way, we make the installation declarative and easy to run. All these helmfiles are located at helm/helmfile.d.

As more and more releases need to be installed, we also categorize these releases by label. There are two labels defined

LabelDescription

app

The component. (e.g. primehub, prometheus-operator, efk)

release

The individual release (e.g. keycloak, hub, admin-ui, ...)

Here are the available releases

ReleaseAppDescription

primehub

primehub

Primehub

keycloak

keycloak

Keycloak. The identify service

elasticsearch

efk

ElasticSearch

elasticsearch-curator

efk

Tool to manage ElasticSearch

fluentd-elasticsearch

efk

Fluentd. Log collector

kibana

efk

Kibana. Dashboard for Elasticsearch

prometheus-operator

prometheus-operator

Prometheus, Grafana, and Exporters

primehub-grafana-dashboard-basic

prometheus-operator

Dashboard for PrimeHub

primehub-grafana-dashboard-rook

prometheus-operator

Dashboard for rook

cert-manager

cert-manager

Certification Manager

rook-operator

rook-operator

Rook

To diff, install/upgrade the helm release, we can use these commands

helmfile -f helm/helmfile.d -l release=<release> diff
helmfile -f helm/helmfile.d -l release=<release> charts
helmfile -f helm/helmfile.d -l app=<app> diff
helmfile -f helm/helmfile.d -l app=<app> charts

or these equivalent make commands

make release-diff-<release>
make release-install-<release>
make component-diff-<app>
make component-install-<app>

Template the Value

Helm provides a great way to template the kubernetes resources. In the helm installation or upgrade, helm consolidates all the values to a single value tree and uses it to generate the final resource YAMLs and apply them to cluster.

However, helm does not provide a way to template the value, this is why helmfile templating comes in. Helmfile provides a way to template the value files by environment valuable.

We can notice that in the helm/<component>/*, these values file have .yaml.gotmpl file extension. When helmfile is run, it would template these value files and output the final plain values.

The environment variable is from the <config-path>/.env. And the config path is searched in the following order

  • ~/.primehub/config/<cluster name>/ ( is kubectl config current-context )

  • ./etc

The helper script bin/phenv would find if ${CONFIG_PATH}/.env is in the folder and determine if it is qualified as a config folder.

Configuration Files

In the previous section, we talk about the config folder. In addition to .env file, the folder also contains these files and folders.

FileDescription

.env

The environment variables for helmfile templating

helm_override/*.yaml

The final value file to override. All customization for helm values should go here.

inventory.yaml

The ansible inventory file if any

cluster.yml

The rke configuration file if any

cluster-bootstrap.yml

The rke configuration file (for bootstrapping) if any

Last updated