helm-chart-scaffolding
Design, organize, and manage Helm charts for templating and packaging Kubernetes applications with reusable configurations. Use when creating Helm charts, packaging Kubernetes applications, or implementing templated deployments.
ID: helm-chart-scaffoldingHelm Chart Scaffolding
Comprehensive guidance for creating, organizing, and managing Helm charts for packaging and deploying Kubernetes applications.
Purpose
This skill provides step-by-step instructions for building production-ready Helm charts, including chart structure, templating patterns, values management, and validation strategies.
When to Use This Skill
Use this skill when you need to:
- Create new Helm charts from scratch
- Package Kubernetes applications for distribution
- Manage multi-environment deployments with Helm
- Implement templating for reusable Kubernetes manifests
- Set up Helm chart repositories
- Follow Helm best practices and conventions
Helm Overview
Helm is the package manager for Kubernetes that:
- Templates Kubernetes manifests for reusability
- Manages application releases and rollbacks
- Handles dependencies between charts
- Provides version control for deployments
- Simplifies configuration management across environments
Step-by-Step Workflow
1. Initialize Chart Structure
Create new chart:
``bash
helm create my-app
`
Standard chart structure:
`
my-app/
Ôö£ÔöÇÔöÇ Chart.yaml # Chart metadata
Ôö£ÔöÇÔöÇ values.yaml # Default configuration values
Ôö£ÔöÇÔöÇ charts/ # Chart dependencies
Ôö£ÔöÇÔöÇ templates/ # Kubernetes manifest templates
Ôöé Ôö£ÔöÇÔöÇ NOTES.txt # Post-install notes
Ôöé Ôö£ÔöÇÔöÇ _helpers.tpl # Template helpers
Ôöé Ôö£ÔöÇÔöÇ deployment.yaml
Ôöé Ôö£ÔöÇÔöÇ service.yaml
Ôöé Ôö£ÔöÇÔöÇ ingress.yaml
Ôöé Ôö£ÔöÇÔöÇ serviceaccount.yaml
Ôöé Ôö£ÔöÇÔöÇ hpa.yaml
Ôöé ÔööÔöÇÔöÇ tests/
Ôöé ÔööÔöÇÔöÇ test-connection.yaml
ÔööÔöÇÔöÇ .helmignore # Files to ignore
`
2. Configure Chart.yaml
Chart metadata defines the package:
`yaml
apiVersion: v2
name: my-app
description: A Helm chart for My Application
type: application
version: 1.0.0 # Chart version
appVersion: "2.1.0" # Application version
Keywords for chart discovery
keywords:
- web
- api
- backend
Maintainer information
maintainers:
- name: DevOps Team
email: devops@example.com
url: https://github.com/example/my-app
Source code repository
sources:
- https://github.com/example/my-app
Homepage
home: https://example.com
Chart icon
icon: https://example.com/icon.png
Dependencies
dependencies:
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled
- name: redis
version: "17.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: redis.enabled
`
Reference: See assets/Chart.yaml.template for complete example
3. Design values.yaml Structure
Organize values hierarchically:
`yaml
Image configuration
image:
repository: myapp
tag: "1.0.0"
pullPolicy: IfNotPresent
Number of replicas
replicaCount: 3
Service configuration
service:
type: ClusterIP
port: 80
targetPort: 8080
Ingress configuration
ingress:
enabled: false
className: nginx
hosts:
- host: app.example.com
paths:
- path: /
pathType: Prefix
Resources
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
Autoscaling
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 80
Environment variables
env:
- name: LOG_LEVEL
value: "info"
ConfigMap data
configMap:
data:
APP_MODE: production
Dependencies
postgresql:
enabled: true
auth:
database: myapp
username: myapp
redis:
enabled: false
`
Reference: See assets/values.yaml.template for complete structure
4. Create Template Files
Use Go templating with Helm functions:
templates/deployment.yaml:
`yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "my-app.fullname" . }}
labels:
{{- include "my-app.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "my-app.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "my-app.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.service.targetPort }}
resources:
{{- toYaml .Values.resources | nindent 12 }}
env:
{{- toYaml .Values.env | nindent 12 }}
`
5. Create Template Helpers
templates/_helpers.tpl:
`yaml
{{/*
Expand the name of the chart.
*/}}
{{- define "my-app.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
*/}}
{{- define "my-app.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "my-app.labels" -}}
helm.sh/chart: {{ include "my-app.chart" . }}
{{ include "my-app.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "my-app.selectorLabels" -}}
app.kubernetes.io/name: {{ include "my-app.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
`
6. Manage Dependencies
Add dependencies in Chart.yaml:
`yaml
dependencies:
- name: postgresql
version: "12.0.0"
repository: "https://charts.bitnami.com/bitnami"
condition: postgresql.enabled
`
Update dependencies:
`bash
helm dependency update
helm dependency build
`
Override dependency values:
`yaml
values.yaml
postgresql:
enabled: true
auth:
database: myapp
username: myapp
password: changeme
primary:
persistence:
enabled: true
size: 10Gi
`
7. Test and Validate
Validation commands:
`bash
Lint the chart
helm lint my-app/
Dry-run installation
helm install my-app ./my-app --dry-run --debug
Template rendering
helm template my-app ./my-app
Template with values
helm template my-app ./my-app -f values-prod.yaml
Show computed values
helm show values ./my-app
`
Validation script:
`bash
#!/bin/bash
set -e
echo "Linting chart..."
helm lint .
echo "Testing template rendering..."
helm template test-release . --dry-run
echo "Checking for required values..."
helm template test-release . --validate
echo "All validations passed!"
`
Reference: See scripts/validate-chart.sh
8. Package and Distribute
Package the chart:
`bash
helm package my-app/
Creates: my-app-1.0.0.tgz
`
Create chart repository:
`bash
Create index
helm repo index .
Upload to repository
AWS S3 example
aws s3 sync . s3://my-helm-charts/ --exclude "*" --include "*.tgz" --include "index.yaml"
`
Use the chart:
`bash
helm repo add my-repo https://charts.example.com
helm repo update
helm install my-app my-repo/my-app
`
9. Multi-Environment Configuration
Environment-specific values files:
`
my-app/
Ôö£ÔöÇÔöÇ values.yaml # Defaults
Ôö£ÔöÇÔöÇ values-dev.yaml # Development
Ôö£ÔöÇÔöÇ values-staging.yaml # Staging
ÔööÔöÇÔöÇ values-prod.yaml # Production
`
values-prod.yaml:
`yaml
replicaCount: 5
image:
tag: "2.1.0"
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
autoscaling:
enabled: true
minReplicas: 3
maxReplicas: 20
ingress:
enabled: true
hosts:
- host: app.example.com
paths:
- path: /
pathType: Prefix
postgresql:
enabled: true
primary:
persistence:
size: 100Gi
`
Install with environment:
`bash
helm install my-app ./my-app -f values-prod.yaml --namespace production
`
10. Implement Hooks and Tests
Pre-install hook:
`yaml
templates/pre-install-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "my-app.fullname" . }}-db-setup
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
spec:
containers:
- name: db-setup
image: postgres:15
command: ["psql", "-c", "CREATE DATABASE myapp"]
restartPolicy: Never
`
Test connection:
`yaml
templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "my-app.fullname" . }}-test-connection"
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "my-app.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never
`
Run tests:
`bash
helm test my-app
`
Common Patterns
Pattern 1: Conditional Resources
`yaml
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "my-app.fullname" . }}
spec:
# ...
{{- end }}
`
Pattern 2: Iterating Over Lists
`yaml
env:
{{- range .Values.env }}
- name: {{ .name }}
value: {{ .value | quote }}
{{- end }}
`
Pattern 3: Including Files
`yaml
data:
config.yaml: |
{{- .Files.Get "config/application.yaml" | nindent 4 }}
`
Pattern 4: Global Values
`yaml
global:
imageRegistry: docker.io
imagePullSecrets:
- name: regcred
Use in templates:
image: {{ .Values.global.imageRegistry }}/{{ .Values.image.repository }}
`
Best Practices
1. Use semantic versioning for chart and app versions
2. Document all values in values.yaml with comments
3. Use template helpers for repeated logic
4. Validate charts before packaging
5. Pin dependency versions explicitly
6. Use conditions for optional resources
7. Follow naming conventions (lowercase, hyphens)
8. Include NOTES.txt with usage instructions
9. Add labels consistently using helpers
10. Test installations in all environments
Troubleshooting
Template rendering errors:
`bash
helm template my-app ./my-app --debug
`
Dependency issues:
`bash
helm dependency update
helm dependency list
`
Installation failures:
`bash
helm install my-app ./my-app --dry-run --debug
kubectl get events --sort-by='.lastTimestamp'
`
Reference Files
- assets/Chart.yaml.template
- Chart metadata template - assets/values.yaml.template
- Values structure template - scripts/validate-chart.sh
- Validation script - references/chart-structure.md
- Detailed chart organization
Related Skills
- k8s-manifest-generator
- For creating base Kubernetes manifests - gitops-workflow` - For automated Helm chart deployments
Informacion
| Estado | Activo |
| Origen | upstream |
| Usos | 3 |
| Ultimo uso | 23/01 16:57 |
| Actualizado | 09/01/2026 02:14 |
Archivo origen
Z:\Repositorios\core\upstream\plugins\kubernetes-operations\skills\helm-chart-scaffolding\SKILL.md