Claude-skill-registry helm-charts
Creates and manages Helm charts for Kubernetes deployments. This skill should be used when packaging applications for Kubernetes using Helm, creating Chart.yaml, values.yaml, and templates. It covers chart structure, templating, dependencies, and deployment patterns. Use this skill for Phase IV+ Kubernetes deployments.
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/helm-charts" ~/.claude/skills/majiayu000-claude-skill-registry-helm-charts && rm -rf "$T"
manifest:
skills/data/helm-charts/SKILL.mdsource content
Helm Charts Skill
Overview
Helm is the package manager for Kubernetes. It packages Kubernetes manifests into reusable charts that can be versioned, shared, and deployed with customizable values.
Core Concepts
What is a Helm Chart?
A chart is a collection of files that describe a related set of Kubernetes resources:
mychart/ ├── Chart.yaml # Chart metadata (name, version, dependencies) ├── values.yaml # Default configuration values ├── charts/ # Dependency charts ├── templates/ # Kubernetes manifest templates │ ├── deployment.yaml │ ├── service.yaml │ ├── ingress.yaml │ ├── configmap.yaml │ ├── secret.yaml │ ├── _helpers.tpl # Template helpers │ └── NOTES.txt # Post-install notes └── .helmignore # Files to ignore when packaging
Key Files
| File | Purpose |
|---|---|
| Metadata: name, version, appVersion, dependencies |
| Default configuration values (overridable) |
| Go-templated Kubernetes manifests |
| Reusable template snippets |
Chart.yaml Structure
apiVersion: v2 # Helm 3 uses v2 name: taskflow # Chart name description: TaskFlow Platform # Short description type: application # application or library version: 1.0.0 # Chart version (SemVer) appVersion: "1.0.0" # Application version # Dependencies (optional) dependencies: - name: postgresql version: "12.x.x" repository: "https://charts.bitnami.com/bitnami" condition: postgresql.enabled
values.yaml Pattern
# Global settings global: imageRegistry: "" imagePullSecrets: [] # Per-service configuration api: replicaCount: 1 image: repository: taskflow/api tag: "latest" pullPolicy: IfNotPresent service: type: ClusterIP port: 8000 resources: limits: cpu: 500m memory: 512Mi requests: cpu: 100m memory: 128Mi env: DATABASE_URL: "" SSO_URL: "http://sso:3001" # Feature flags postgresql: enabled: true auth: postgresPassword: "postgres" database: "taskflow"
Template Syntax
Accessing Values
# templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: {{ include "taskflow.fullname" . }} labels: {{- include "taskflow.labels" . | nindent 4 }} spec: replicas: {{ .Values.api.replicaCount }} selector: matchLabels: {{- include "taskflow.selectorLabels" . | nindent 6 }} template: spec: containers: - name: {{ .Chart.Name }} image: "{{ .Values.api.image.repository }}:{{ .Values.api.image.tag }}" ports: - containerPort: {{ .Values.api.service.port }} env: - name: DATABASE_URL value: {{ .Values.api.env.DATABASE_URL | quote }}
Helper Templates (_helpers.tpl)
{{/* Expand the name of the chart. */}} {{- define "taskflow.name" -}} {{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} {{- end }} {{/* Create a default fully qualified app name. */}} {{- define "taskflow.fullname" -}} {{- if .Values.fullnameOverride }} {{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} {{- else }} {{- $name := default .Chart.Name .Values.nameOverride }} {{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} {{- end }} {{- end }} {{/* Common labels */}} {{- define "taskflow.labels" -}} helm.sh/chart: {{ include "taskflow.chart" . }} {{ include "taskflow.selectorLabels" . }} app.kubernetes.io/managed-by: {{ .Release.Service }} {{- end }} {{/* Selector labels */}} {{- define "taskflow.selectorLabels" -}} app.kubernetes.io/name: {{ include "taskflow.name" . }} app.kubernetes.io/instance: {{ .Release.Name }} {{- end }}
Essential Commands
Create New Chart
helm create mychart
Install Chart
# From local directory helm install my-release ./mychart # With custom values file helm install my-release ./mychart --values custom-values.yaml # With inline value overrides helm install my-release ./mychart \ --set api.replicaCount=3 \ --set api.image.tag=v2.0.0 # To specific namespace (create if needed) helm install my-release ./mychart \ --namespace production \ --create-namespace # Dry run (preview without installing) helm install my-release ./mychart --dry-run --debug
Upgrade Release
helm upgrade my-release ./mychart --values new-values.yaml
Rollback
helm rollback my-release 1 # Rollback to revision 1
Uninstall
helm uninstall my-release
List Releases
helm list helm list --all-namespaces
Debug Templates
# Render templates without installing helm template my-release ./mychart # Debug with computed values helm template my-release ./mychart --debug
Multi-Service Chart Pattern
For TaskFlow (api, sso, web, mcp-server), use a single chart with multiple templates:
helm/taskflow/ ├── Chart.yaml ├── values.yaml ├── templates/ │ ├── _helpers.tpl │ ├── NOTES.txt │ ├── api/ │ │ ├── deployment.yaml │ │ ├── service.yaml │ │ └── configmap.yaml │ ├── sso/ │ │ ├── deployment.yaml │ │ └── service.yaml │ ├── web/ │ │ ├── deployment.yaml │ │ └── service.yaml │ ├── mcp-server/ │ │ ├── deployment.yaml │ │ └── service.yaml │ └── ingress.yaml
ConfigMap and Secrets
ConfigMap Template
apiVersion: v1 kind: ConfigMap metadata: name: {{ include "taskflow.fullname" . }}-config data: SSO_URL: {{ .Values.sso.url | quote }} API_URL: {{ .Values.api.url | quote }}
Secret Template (from values)
apiVersion: v1 kind: Secret metadata: name: {{ include "taskflow.fullname" . }}-secrets type: Opaque data: database-url: {{ .Values.secrets.databaseUrl | b64enc | quote }} openai-api-key: {{ .Values.secrets.openaiApiKey | b64enc | quote }}
Health Checks Pattern
spec: containers: - name: api livenessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 5 periodSeconds: 5
Ingress Pattern
{{- if .Values.ingress.enabled -}} apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: {{ include "taskflow.fullname" . }} annotations: {{- toYaml .Values.ingress.annotations | nindent 4 }} spec: ingressClassName: {{ .Values.ingress.className }} rules: - host: {{ .Values.ingress.host }} http: paths: - path: /api pathType: Prefix backend: service: name: {{ include "taskflow.fullname" . }}-api port: number: 8000 - path: / pathType: Prefix backend: service: name: {{ include "taskflow.fullname" . }}-web port: number: 3000 {{- end }}
Common Gotchas
- Quote strings in templates: Use
for strings{{ .Values.foo | quote }} - Indentation matters: Use
for proper YAML formattingnindent - Resource names: Keep under 63 characters (K8s limit)
- Image pull policy: Use
in production,IfNotPresent
in devAlways - Secrets: Never commit real secrets to values.yaml
Resources
Refer to
references/ for:
- Advanced templating patternschart-patterns.md
- Values.yaml organization guidevalues-structure.md
Refer to
assets/ for:
- Complete starter chart templatebase-chart/