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 |