Skip to main content

When the Helm abstraction is limiting Gimlet specific content

Helm charts need to cater to many different deployment options. At the far end of the spectrum, a Helm chart must template every single Kubernetes manifest field. In practice, many Helm charts fall into this trap, but a Helm chart maintainer must know where to draw the line.

We drew the line at the 30 most common deployment variations with OneChart.

If your company outgrows it, you always have the option to fork it and maintain your supported feature set.

Gimlet also allows for Helm chart post-processing. You can place a Kustomize patch in the Gimlet environment manifest file and have it applied on the rendered manifest that comes out of Helm. Eventually, you can also use raw Kubernetes yamls, if none of the abstractions and escape hatches work for you.

When the Helm abstraction is limiting

It is important for a developer platform not to stand in the way of experienced users. Gimlet provides convenient escape hatches for situations when the abstraction is limiting.

In manifesting, Gimlet's chosen abstraction is the Helm chart. Helm charts cannot cater to all kinds of customizations, so Gimlet provides two alternative ways for manifests.

Using Helm charts

app: myapp
env: staging
namespace: my-team
chart:
repository: https://chart.onechart.dev
name: onechart
version: 0.32.0
values:
replicas: 1
image:
repository: myapp
tag: "{{ .GIT_SHA }}"

Using raw manifests

app: myapp
env: staging
namespace: my-team
manifests: |
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: my-team
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: onechart
app.kubernetes.io/instance: myapp
template:
metadata:
labels:
app.kubernetes.io/name: onechart
app.kubernetes.io/instance: myapp
spec:
containers:
- name: myapp
image: "myapp:{{ .GIT_SHA }}"

Using Helm charts with a Kustomize escape hatch

app: myapp
env: staging
namespace: my-team
chart:
repository: https://chart.onechart.dev
name: onechart
version: 0.32.0
values:
replicas: 1
image:
repository: myapp
tag: 1.1.0
strategicMergePatches: |
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: my-team
spec:
template:
spec:
containers:
- name: myapp
volumeMounts:
- name: azure-file
mountPath: /azure-bucket
volumes:
- name: azure-file
azureFile:
secretName: my-azure-secret
shareName: my-azure-share
readOnly: false

You can find more examples at: https://github.com/gimlet-io/gimlet-cli/tree/main/examples