Optimizing Chart Performance
1. Minimizing Template Complexity
| Anti-pattern | Fix |
|---|---|
| Deeply nested conditionals | Extract to named template |
Repeated include | Cache result in variable |
| Complex inline expressions | Compute once into variable |
2. Caching Template Results
Example: Cache expensive include
{{- $labels := include "myapp.labels" . -}}
metadata:
labels: {{- $labels | nindent 4 }}
---
spec:
template:
metadata:
labels: {{- $labels | nindent 8 }}
3. Reducing Value Lookups
Example: Bind once with with
{{- with .Values.resources }}
resources:
requests: { cpu: {{ .cpuRequest }}, memory: {{ .memRequest }} }
limits: { cpu: {{ .cpuLimit }}, memory: {{ .memLimit }} }
{{- end }}
4. Optimizing Loop Iterations
| Practice | Why |
|---|---|
| Filter before range | Reduce iteration count |
| Hoist invariants | Compute outside range |
| Avoid nested ranges | O(n²) renders are slow |
5. Using Conditional Rendering
Example: Skip unused blocks
{{- if .Values.metrics.enabled }}
{{- include "myapp.metrics-service" . }}
{{- include "myapp.servicemonitor" . }}
{{- end }}
6. Minimizing File Reads
| Practice | Detail |
|---|---|
Cache .Files.Get | Read once into variable, reuse |
Use Glob | Iterate matched files instead of listing manually |
| Avoid huge files | Move large blobs to ConfigMap mounted at runtime |
7. Reducing Chart Size
| Action | Effect |
|---|---|
Add .helmignore | Exclude tests, docs, CI files from package |
| Remove unused subcharts | Use condition: |
| Minify embedded files | Strip whitespace from JSON/YAML blobs |
8. Optimizing Dependencies
9. Using Lazy Evaluation
Example: Short-circuit expensive checks
{{- if and .Values.lookup.enabled (eq .Release.IsInstall false) }}
{{- $existing := lookup "v1" "Secret" .Release.Namespace "db-creds" -}}
{{- end }}