Skip to content
helm-chart-review logo

Helm Chart Review

helm-chart-review

Conduct comprehensive Helm chart security and quality audits with automated checks for security contexts, resource limits, and production readiness. Use when reviewing pull requests with Helm chart changes, conducting pre-release chart audits, security scanning Helm manifests, validating chart st...

SKILL.md

Full skill instructions

Helm Chart Review

Purpose

Provide comprehensive review checklists and automated validation for ensuring Helm charts meet production quality and security standards before deployment.

Complete Review Workflow

Step 1: Run Automated Validation

# Lint checks
helm lint ./​charts/​mychart

# Template rendering validation
helm template mychart ./​charts/​mychart --debug

# Test with different value files
helm template mychart ./​charts/​mychart -f values-prod.yaml

# Dry run installation
helm install test ./​charts/​mychart --dry-run --debug --namespace test

Step 2: Security Review Checklist

Critical security items (must pass):

  • No hardcoded secrets in values.yaml or templates
  • Image tags are specific (no :latest tag)
  • Security contexts are defined and restrictive:
    securityContext:
      runAsNonRoot: true
      runAsUser: 1000
      readOnlyRootFilesystem: true
      allowPrivilegeEscalation: false
      capabilities:
        drop:
          - ALL
    
  • RBAC is properly configured with least privilege
  • Resource limits are set for all containers
  • Service accounts are explicitly created (not using default)
  • Secrets use external secret management (not inline)

Security red flags:

# ❌ NEVER allow these
securityContext:
  privileged: true # Unacceptable
  runAsUser: 0 # Root user - requires justification
  allowPrivilegeEscalation: true # Security risk

image:
  tag: latest # Non-deterministic

# Hardcoded secrets
password: "hardcoded123" # NEVER hardcode secrets

Step 3: Structure Review Checklist

  • Chart.yaml has all required fields:
    • apiVersion: v2
    • name, description, type
    • version (follows SemVer2)
    • appVersion
    • maintainers with contact info
  • Version follows SemVer2 format (MAJOR.MINOR.PATCH)
  • Dependencies use version ranges (~)
  • One resource per file in templates/
  • Template helpers are properly namespaced
  • File naming follows conventions (lowercase, dashes)
  • NOTES.txt provides useful post-install information
  • README.md exists with usage documentation

Step 4: Values Review Checklist

  • All values are documented with clear comments
  • Naming is consistent (camelCase throughout)
  • Types are explicit (strings quoted: tag: "1.0")
  • Flat structure preferred over deep nesting
  • Defaults are secure and production-ready
  • Environment-specific values separated (values-{env}.yaml)
  • Boolean values use lowercase (true/false)
  • Resource requests/​limits have realistic values

Good vs bad values:

# ✅ Good
replicaCount: 2 # Documented, reasonable default

image:
  repository: myapp
  pullPolicy: IfNotPresent
  tag: "" # Empty, uses appVersion

resources:
  limits:
    cpu: 500m
    memory: 256Mi
  requests:
    cpu: 250m
    memory: 128Mi

# ❌ Bad
replicas: 1 # Undocumented, single point of failure
ImageTag: latest # Wrong case, non-specific tag
database:
  password: "changeme" # Hardcoded secret

Step 5: Template Review Checklist

  • Labels are consistent and follow k8s recommendations:
    • app.kubernetes.io/​name
    • app.kubernetes.io/​instance
    • app.kubernetes.io/​version
    • app.kubernetes.io/​managed-by
  • Nil checks for nested values (prevent nil pointer errors)
  • Whitespace properly managed ({{- and -}} used correctly)
  • Helper functions used for repeated logic
  • Conditionals properly structured
  • Resources can be disabled via values
  • Image tags default to Chart.AppVersion
  • ConfigMap/​Secret changes trigger pod restarts (checksum annotations)
  • Names truncated to 63 characters

Template quality patterns:

# ✅ Good
metadata:
  name: {{ include "mychart.fullname" . }}
  labels:
    {{- include "mychart.labels" . | nindent 4 }}
  annotations:
    checksum/​config: {{ include (print $.Template.BasePath "/​configmap.yaml") . | sha256sum }}

{{- if .Values.ingress.enabled }}
# ... conditional resource
{{- end }}

image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

# Safe nil handling
{{- with .Values.tolerations }}
tolerations:
  {{- toYaml . | nindent 8 }}
{{- end }}

# ❌ Bad
name: my-app-{{ .Release.Name }}       # Hardcoded
image: {{ .Values.image }}:latest      # Hardcoded latest
{{ .Values.nested.value }}             # No nil check

Step 6: Testing Review Checklist

  • helm lint passes without errors or warnings
  • helm template renders correctly
  • Dry run succeeds
  • Unit tests exist and pass (helm-unittest)
  • All conditional paths tested (enabled/​disabled features)
  • Multiple environments tested (dev, staging, prod values)

Security Scanning Integration

Kubesec Analysis

# Scan rendered templates for security issues
helm template mychart ./​charts/​mychart | kubesec scan -

# Look for:
# - Missing security contexts
# - Privileged containers
# - Host path mounts
# - Host network usage

Trivy Image Scanning

# Extract images from chart
helm template mychart ./​charts/​mychart | grep "image:" | sort -u

# Scan each image for vulnerabilities
trivy image myapp:1.0.0

Common Review Findings and Fixes

Finding: Missing Resource Limits

# ❌ Problem
containers:
  - name: app
    image: myapp:1.0

# ✅ Solution
containers:
  - name: app
    image: myapp:1.0
    resources:
      limits:
        cpu: 500m
        memory: 256Mi
      requests:
        cpu: 250m
        memory: 128Mi

Finding: Insecure Security Context

# ❌ Problem
securityContext: {}

# ✅ Solution
securityContext:
  runAsNonRoot: true
  runAsUser: 1000
  fsGroup: 1000
  readOnlyRootFilesystem: true
  allowPrivilegeEscalation: false
  capabilities:
    drop:
    - ALL

Finding: Latest Image Tag

# ❌ Problem
image: myapp:latest

# ✅ Solution
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

Finding: No Liveness/​Readiness Probes

# ❌ Problem
containers:
  - name: app
    image: myapp:1.0

# ✅ Solution
containers:
  - name: app
    image: myapp:1.0
    livenessProbe:
      httpGet:
        path: /​healthz
        port: http
      initialDelaySeconds: 30
      periodSeconds: 10
    readinessProbe:
      httpGet:
        path: /​ready
        port: http
      initialDelaySeconds: 5
      periodSeconds: 5

Review Severity Levels

BLOCKER (must fix before merge):

  • Hardcoded secrets
  • Missing security contexts
  • Privileged containers
  • No resource limits
  • Use of :latest tag

CRITICAL (must fix before production):

  • Missing liveness/​readiness probes
  • Single replica without PDB
  • No pod disruption budget
  • Incorrect RBAC (too permissive)

MAJOR (should fix):

  • Undocumented values
  • Missing tests
  • Incomplete README
  • No CHANGELOG entry

MINOR (nice to have):

  • Improved comments
  • Additional examples
  • Optimization opportunities

Pre-Release Checklist

Before releasing chart:

  • All security review items pass
  • All structure review items pass
  • All tests pass (lint, unit, integration, dry-run)
  • Security scanning completed (kubesec, trivy)
  • Documentation updated and accurate
  • CHANGELOG.md updated with version notes
  • Version bumped appropriately (major/​minor/​patch)
  • Tested in staging environment
  • Rollback procedure documented
  • Resource quotas validated
  • Network policies tested
  • Monitoring/​alerting configured

CI/​CD Quality Gates

Example pipeline checks:

# GitLab CI / GitHub Actions
helm-lint:
  stage: test
  script:
    - helm lint ./​charts/​*

helm-unittest:
  stage: test
  script:
    - helm unittest ./​charts/​*

helm-security-scan:
  stage: test
  script:
    - helm template ./​charts/​* | kubesec scan -
    - helm template ./​charts/​* | trivy config -

helm-dry-run:
  stage: test
  script:
    - helm install test ./​charts/​mychart --dry-run --debug

Documentation Review

README.md must include:

  • Chart description and purpose
  • Prerequisites and dependencies
  • Installation instructions
  • Configuration options (values) table
  • Usage examples
  • Upgrade instructions

CHANGELOG.md must track:

  • Version number and date
  • Added features
  • Changed behavior
  • Deprecated features
  • Removed features
  • Fixed bugs
  • Security fixes

Resources


Related Agent

For comprehensive Helm/​Kubernetes guidance that coordinates this and other Helm skills, use the helm-kubernetes-expert agent.

More DevOps & CI/CD skills

Project scaffolding, deployment configuration, and CI/CD setup for Google ADK agents.

6K 472.6K
View

Set up tracing, logging, and monitoring for deployed ADK agents across Cloud Trace, BigQuery, and third-party platforms.

6K 472.6K
View

Enterprise Azure infrastructure architect generating Bicep or Terraform from workload descriptions.

1.5K 454.3K
View
azure-kubernetes logo
DevOps & CI/CD

azure-kubernetes

Plan and configure production-ready Azure Kubernetes Service clusters with Day-0 and Day-1 best practices.

1.5K 447.1K
View

Raw mechanical interfaces fusing Swiss typographic print with military terminal aesthetics. Rigid grids, extreme type scale contrast, utilitarian color, analog degradation effects. For data-heavy dashboards, portfolios, or editorial sites that need to feel like declassified blueprints.

92.7K 354.9K
View
just-scrape logo
DevOps & CI/CD

just-scrape

Web search, scraping, extraction, crawling, and monitoring via ScrapeGraph AI CLI.

69 245K
View

Skill for working with Firebase Hosting (Classic). Use this when you want to deploy static web apps, Single Page Apps (SPAs), or simple microservices. Do NOT use for Firebase App Hosting.

462 159.7K
View

Deploy and manage web apps with Firebase App Hosting. Use this skill when deploying Next.js/Angular apps with backends.

462 159.1K
View
deploy-to-vercel logo
DevOps & CI/CD

deploy-to-vercel

Deploy applications and websites to Vercel. Use when the user requests deployment actions like "deploy my app", "deploy and give me the link", "push this live", or "create a preview deployment".

31.9K 146.6K
View
programmatic-seo logo
DevOps & CI/CD

programmatic-seo

Build SEO-optimized pages at scale using templates, data, and proven playbook patterns.

53.3K 140.1K
View

Design and build isolated, reusable Convex backend components with clear boundaries and app-facing wrappers.

63 123.5K
View

Deploy and manage projects on Vercel using token-based authentication. Use when working with Vercel CLI using access tokens rather than interactive login — e.g. "deploy to vercel", "set up vercel", "add environment variables to vercel".

31.9K 116.1K
View

Coding & apps AI tools

Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View
Imagica logo
Coding & apps

Imagica

Build a no-code AI app in minutes.

Freemium
View
E
Coding & apps

Emergent.sh

An IDE for code migration from legacy to modern frameworks through coding agents.

Freemium
View
Wonder Dynamics logo
Coding & apps

Wonder Dynamics

Automate CGI animation in live-action scenes

Paid
View
M
Coding & apps

Mixo

Launch a website in seconds with AI.

Paid
View
AI Code Convert logo
Coding & apps

AI Code Convert

Streamline Your Coding Experience with AI Code Helper

Free
View