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
| Label | Description |
|---|---|
app | The component. (e.g. primehub, prometheus-operator, efk) |
release | The individual release (e.g. keycloak, hub, admin-ui, ...) |
Here are the available releases
| Release | App | Description |
|---|---|---|
| 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.
| File | Description |
|---|---|
.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 |