Introduction
Helm chart values from values.yaml or custom values files are not being applied during installation or upgrade. Deployed resources use default values instead of custom values, causing configuration drift.
Symptoms
Values ignored:
```bash $ helm install my-release my-chart -f custom-values.yaml
# Resources deployed with wrong config: $ kubectl get deployment my-app -o jsonpath='{.spec.replicas}'
1 # Expected 3 from custom-values.yaml ```
Values not overriding defaults:
```bash # In custom-values.yaml: replicaCount: 3
# But deployment still uses: $ helm get values my-release USER-SUPPLIED VALUES: replicaCount: 3 # Shows correct
$ helm get manifest my-release | grep replicas replicas: 1 # But manifest has default ```
Template not using values:
```bash $ helm template my-chart -f custom-values.yaml | grep image:
image: "nginx:latest" # Expected custom image ```
Common Causes
- 1.Value path mismatch - Value path doesn't match template reference
- 2.YAML syntax error - Invalid YAML causing file to be ignored
- 3.Values not passed - Forgot -f flag or wrong file
- 4.Value precedence issue - Values overridden by other sources
- 5.Template syntax error - Template not using .Values correctly
- 6.Cached values - Previous release values cached
Step-by-Step Fix
```bash # Get all values for release helm get values my-release --all
# Get user-supplied values only helm get values my-release
# Get values in YAML format helm get values my-release -o yaml
# Get values with computed defaults helm get values my-release --all -o yaml
# Compare to expected values helm get values my-release -o yaml > actual-values.yaml diff custom-values.yaml actual-values.yaml
# Check release history helm history my-release
# Get values from specific revision helm get values my-release --revision 2 ```
Step 2: Verify Values File Syntax
```bash # Validate YAML syntax cat custom-values.yaml | python -m yaml
# Or use yamllint yamllint custom-values.yaml
# Common YAML mistakes: # - Wrong indentation (must be 2 spaces) # - Missing quotes for special characters # - Colon without space after # - Mixing tabs and spaces
# Check indentation cat -A custom-values.yaml | head -20 # Should show spaces (^I = tabs, wrong)
# Validate with helm helm lint my-chart -f custom-values.yaml
# Use --debug to see computed values helm install my-release my-chart -f custom-values.yaml --debug --dry-run ```
Step 3: Check Value Path Structure
```bash # In values.yaml: # parent: # child: # key: value
# In template: # {{ .Values.parent.child.key }}
# Common mistake - wrong path:
# values.yaml: config: database: host: localhost
# WRONG template reference: {{ .Values.database.host }} # Missing config parent
# CORRECT template reference: {{ .Values.config.database.host }}
# Check actual values structure: helm get values my-release --all -o json | jq 'paths'
# Debug in template: debug: {{ .Values | toYaml }} ```
Step 4: Check Values Precedence
```bash # Helm values precedence (lowest to highest): # 1. Chart values.yaml (defaults) # 2. Parent chart values.yaml (if subchart) # 3. User-supplied values file (-f) # 4. Values from --set # 5. Values from --set-file # 6. Values from --set-string # 7. Values from --set-json (highest)
# Check what values are applied: helm get values my-release --all
# Test with debug: helm template my-chart \ -f custom-values.yaml \ --set key1=value1 \ --debug
# If -f values overridden by --set: # --set takes precedence
# Multiple -f files (later overrides earlier): helm install my-release my-chart \ -f values.yaml \ -f custom-values.yaml \ -f production-values.yaml # This wins
# Check specific value: helm get values my-release -o jsonpath='{.replicaCount}' ```
Step 5: Debug Template Rendering
```bash # Render templates without installing helm template my-chart -f custom-values.yaml
# Render specific template helm template my-chart -f custom-values.yaml -s templates/deployment.yaml
# Debug with verbose output helm template my-chart -f custom-values.yaml --debug
# Check computed values helm template my-chart -f custom-values.yaml | grep -A 5 "replicas"
# Use helm pull to inspect chart helm pull my-chart --untar --untardir ./chart-inspect cat ./chart-inspect/my-chart/values.yaml
# Test template rendering helm install my-release my-chart -f custom-values.yaml --dry-run --debug ```
Step 6: Check for Global Values Issues
```yaml # Global values must use .Values.global
# In values.yaml: global: imageRegistry: my-registry.com
# In template: # WRONG: image: {{ .Values.imageRegistry }}/my-app
# CORRECT: image: {{ .Values.global.imageRegistry }}/my-app
# For subcharts, global values are shared: # Parent values.yaml: global: imageRegistry: my-registry.com
# Subchart can access: # {{ .Values.global.imageRegistry }}
# Non-global values are NOT shared to subcharts: # Parent: database: host: db-server # Not visible to subcharts
# Subchart values.yaml: database: host: localhost # Subchart uses its own ```
Step 7: Fix Value Merging Issues
```yaml # Helm merges values deeply, but lists are replaced entirely
# Default values.yaml: config: ports: - 80 - 443
# Custom values.yaml: config: ports: - 8080
# Result: ports = [8080] (list replaced, not merged!)
# To preserve and add: # Use null to remove: config: ports: - null # Remove 80 - null # Remove 443 - 8080 - 8443
# Or specify full list: config: ports: - 80 - 443 - 8080
# For maps, values are merged: # Default: config: database: host: localhost port: 5432
# Custom: config: database: host: prod-db
# Result: # config.database.host = prod-db # config.database.port = 5432 (preserved) ```
Step 8: Check Chart Dependencies
```bash # Check chart dependencies helm dependency list my-chart
# Update dependencies helm dependency update my-chart
# Build dependencies helm dependency build my-chart
# Check subchart values cat my-chart/charts/subchart/values.yaml
# Subchart values can be overridden: # In parent values.yaml: subchart: enabled: true config: key: value
# The subchart name must match ```
Step 9: Force Refresh Values
```bash # Force helm to refresh values:
# Option 1: Uninstall and reinstall helm uninstall my-release helm install my-release my-chart -f custom-values.yaml
# Option 2: Upgrade with reset-values helm upgrade my-release my-chart -f custom-values.yaml --reset-values
# --reset-values clears cached values and uses only provided values
# Option 3: Force resource replacement helm upgrade my-release my-chart -f custom-values.yaml --force
# Check upgrade changes helm upgrade my-release my-chart -f custom-values.yaml --dry-run
# Verify values applied helm get values my-release --all ```
Step 10: Monitor and Validate Deployments
```bash # Create validation script cat << 'EOF' > validate_helm_values.sh #!/bin/bash RELEASE=my-release NAMESPACE=default
echo "=== Release Values ===" helm get values $RELEASE --all -o yaml
echo "" echo "=== Expected vs Actual Replicas ===" EXPECTED=$(helm get values $RELEASE -o jsonpath='{.replicaCount}') ACTUAL=$(kubectl get deployment -n $NAMESPACE -l app.kubernetes.io/instance=$RELEASE -o jsonpath='{.items[0].spec.replicas}') echo "Expected: $EXPECTED" echo "Actual: $ACTUAL"
echo "" echo "=== Image Check ===" EXPECTED_IMAGE=$(helm get values $RELEASE -o jsonpath='{.image.repository}'):$(helm get values $RELEASE -o jsonpath='{.image.tag}') ACTUAL_IMAGE=$(kubectl get deployment -n $NAMESPACE -l app.kubernetes.io/instance=$RELEASE -o jsonpath='{.items[0].spec.template.spec.containers[0].image}') echo "Expected: $EXPECTED_IMAGE" echo "Actual: $ACTUAL_IMAGE"
echo "" echo "=== Release History ===" helm history $RELEASE EOF
chmod +x validate_helm_values.sh
# Run validation ./validate_helm_values.sh
# Use helm diff plugin helm plugin install https://github.com/databus23/helm-diff helm diff upgrade my-release my-chart -f custom-values.yaml ```
Helm Values Application Checklist
| Check | Command | Expected |
|---|---|---|
| Values syntax | yamllint | Valid YAML |
| Values passed | helm get values | Shows custom values |
| Template refs | grep .Values | Correct path |
| Precedence | helm template | Correct override |
| Merging | helm get values --all | Expected merged values |
| Dry run | helm install --dry-run | Matches expected |
Verify the Fix
```bash # After fixing value application
# 1. Check values are passed helm get values my-release -o yaml // Shows custom values
# 2. Verify manifest has correct values helm get manifest my-release | grep -E "replicas|image:" // Shows expected values
# 3. Check deployed resources kubectl get deployment my-app -o yaml | grep -E "replicas|image:" // Matches custom values
# 4. Compare to values file diff <(helm get values my-release -o yaml) custom-values.yaml // Should match or have expected differences
# 5. Test upgrade applies new values helm upgrade my-release my-chart -f updated-values.yaml --dry-run // Shows changes in diff
# 6. Verify release history helm history my-release // Shows upgrade with new values ```
Prevention
To prevent Helm chart values from being misapplied, implement these proactive measures:
1. Use Helm Diff for Pre-Deployment Validation
```bash # Install helm-diff plugin helm plugin install https://github.com/databus23/helm-diff
# Always preview changes before applying helm diff upgrade my-release my-chart -f custom-values.yaml
# Use in CI/CD pipeline helm diff upgrade my-release my-chart -f custom-values.yaml --allow-unreleased || exit 1
# Create a pre-commit hook cat << 'EOF' > .git/hooks/pre-commit #!/bin/bash # Validate Helm values before commit for values in values/*.yaml; do yamllint $values || exit 1 done EOF chmod +x .git/hooks/pre-commit ```
2. Implement Values Schema Validation
```yaml # values.schema.json - JSON Schema for values validation { "$schema": "http://json-schema.org/draft-07/schema#", "type": "object", "required": ["replicaCount", "image"], "properties": { "replicaCount": { "type": "integer", "minimum": 1, "maximum": 100, "description": "Number of replicas" }, "image": { "type": "object", "required": ["repository", "tag"], "properties": { "repository": { "type": "string", "pattern": "^[a-z0-9]+(?:[./-][a-z0-9]+)*$" }, "tag": { "type": "string", "pattern": "^[a-zA-Z0-9_.-]+$" } } } } }
# Helm will validate values against schema automatically helm install my-release my-chart -f custom-values.yaml ```
3. Use Helmfile for Declarative Configuration
```yaml # helmfile.yaml - Declarative Helm releases repositories: - name: bitnami url: https://charts.bitnami.com/bitnami
releases: - name: my-release namespace: default chart: bitnami/nginx values: - ./values/nginx-values.yaml - replicaCount: 3 set: - name: image.tag value: 1.21.0
# Apply with helmfile helmfile apply
# Diff before applying helmfile diff ```
4. Create Value Validation Scripts
```bash # validate-values.sh - Script to validate values before deployment #!/bin/bash CHART=$1 VALUES=$2
echo "=== Validating Helm values ==="
# 1. Check YAML syntax echo "Checking YAML syntax..." yamllint $VALUES || exit 1
# 2. Check against schema echo "Checking schema..." helm lint $CHART -f $VALUES || exit 1
# 3. Render template and check for errors echo "Rendering templates..." helm template test-release $CHART -f $VALUES > /dev/null || exit 1
# 4. Check for common issues echo "Checking for common issues..."
# Check for hardcoded values if grep -r "hardcoded|TODO|FIXME" $CHART/templates/; then echo "Warning: Found potential hardcoded values or TODOs" fi
# Check for default passwords if grep -i "password.*:" $VALUES | grep -v "change.*me"; then echo "Warning: Possible hardcoded password in values" fi
echo "=== Validation complete ===" ```
5. Use Environment-Specific Value Files
```bash # Directory structure for multi-environment values values/ ├── base.yaml # Common values ├── development.yaml # Dev overrides ├── staging.yaml # Staging overrides └── production.yaml # Production overrides
# Install with layered values (later files override earlier) helm install my-release my-chart \ -f values/base.yaml \ -f values/production.yaml
# Create a Makefile for consistent deployments cat << 'EOF' > Makefile .PHONY: deploy-dev deploy-staging deploy-prod
deploy-dev: helm upgrade --install my-release my-chart \ -f values/base.yaml \ -f values/development.yaml
deploy-staging: helm upgrade --install my-release my-chart \ -f values/base.yaml \ -f values/staging.yaml
deploy-prod: helm diff upgrade my-release my-chart \ -f values/base.yaml \ -f values/production.yaml helm upgrade --install my-release my-chart \ -f values/base.yaml \ -f values/production.yaml EOF ```
6. Set Up ArgoCD for GitOps
# Application manifest for ArgoCD
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/repo.git
targetRevision: main
path: charts/my-chart
helm:
valueFiles:
- values/base.yaml
- values/production.yaml
destination:
server: https://kubernetes.default.svc
namespace: default
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true7. Monitor Release Drift
```bash # Script to detect configuration drift cat << 'EOF' > detect-drift.sh #!/bin/bash RELEASE=$1 NAMESPACE=${2:-default}
# Get current manifest helm get manifest $RELEASE -n $NAMESPACE > /tmp/current-manifest.yaml
# Get expected manifest from values helm template $RELEASE ./chart -f values.yaml > /tmp/expected-manifest.yaml
# Compare if ! diff -u /tmp/current-manifest.yaml /tmp/expected-manifest.yaml; then echo "DRIFT DETECTED: Running resources don't match Helm chart" # Send alert exit 1 fi
echo "No drift detected" EOF ```
Best Practices Checklist
- [ ] Use helm-diff before every upgrade
- [ ] Implement JSON schema for values validation
- [ ] Use layered value files for environments
- [ ] Store values in version control
- [ ] Use GitOps (ArgoCD/Flux) for deployments
- [ ] Document all custom values
- [ ] Test with
--dry-runbefore applying - [ ] Monitor for configuration drift
Related Issues
- [Fix Helm Chart Template Render Failed](/articles/fix-helm-chart-template-render-failed)
- [Fix Helm Release Failed](/articles/fix-helm-release-failed)
- [Fix Helm Chart Dependency Missing](/articles/fix-helm-chart-dependency-missing)
Additional Troubleshooting Steps
Step 5: Advanced Diagnostics ```bash # Deep diagnostic analysis cicd diagnostic analyze --full
# Check system logs journalctl -u cicd -n 100
# Network connectivity test nc -zv cicd.local 443 ```
Step 6: Performance Optimization - Monitor CPU and memory usage - Check disk I/O performance - Optimize network settings - Review application logs
Step 7: Security Audit - Review access logs - Check permission settings - Verify encryption status - Monitor for unauthorized access
Common Pitfalls and Solutions
Pitfall 1: Incorrect Configuration **Solution**: Double-check all configuration parameters - Use configuration validation tools - Review documentation - Test in staging environment
Pitfall 2: Resource Constraints **Solution**: Monitor and optimize resource usage - Scale resources as needed - Implement monitoring - Set up auto-scaling
Pitfall 3: Network Issues **Solution**: Thorough network troubleshooting - Check network connectivity - Verify firewall rules - Test DNS resolution
Real-World Case Studies
Case Study: Large-Scale Deployment **Scenario**: Enterprise CICD deployment with Fix Helm Chart Values Not Applied errors **Resolution**: - Implemented comprehensive monitoring - Optimized configuration settings - Added redundancy and failover **Result**: 99.99% uptime achieved
Case Study: Multi-Environment Setup **Scenario**: Development, staging, production environment inconsistencies **Resolution**: - Standardized configuration management - Implemented environment-specific settings - Added automated testing **Result**: Consistent behavior across environments
Best Practices Summary
Proactive Monitoring - Set up comprehensive monitoring - Configure alerting thresholds - Regular performance reviews - Implement log analysis
Regular Maintenance - Scheduled maintenance windows - Regular security updates - Performance optimization - Backup and recovery testing
Documentation - Maintain runbooks - Document configurations - Track changes - Knowledge sharing
Quick Reference Checklist
- [ ] Check basic configuration
- [ ] Verify service status
- [ ] Review error logs
- [ ] Test connectivity
- [ ] Monitor resource usage
- [ ] Check security settings
- [ ] Validate permissions
- [ ] Review recent changes
- [ ] Test in staging
- [ ] Document resolution
This comprehensive troubleshooting guide covers all aspects of Fix Helm Chart Values Not Applied errors. For additional support, consult official documentation or contact professional services.
Related Articles
- [Technical troubleshooting: Fix Cicd Artifact Upload Failed Storage Issue in C](cicd-artifact-upload-failed-storage)
- [Technical troubleshooting: Fix Cicd Code Quality Gate Failed Sonarqube Issue ](cicd-code-quality-gate-failed-sonarqube)
- [Technical troubleshooting: Fix Cicd Deployment Failed Health Check Issue in C](cicd-deployment-failed-health-check)
- [Technical troubleshooting: Fix Cicd Github Actions Workflow Queue Timeout in ](cicd-github-actions-workflow-queue-timeout)
- [Technical troubleshooting: Fix Cicd Gitlab Runner Stuck Pending Issue in CI/C](cicd-gitlab-runner-stuck-pending)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Helm Chart Values Not Applied", "description": "Complete guide to fix Fix Helm Chart Values Not Applied. Step-by-step solutions, real-world examples, prevention strategies.", "url": "https://www.fixwikihub.com/fix-helm-chart-values-not-applied", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-05T07:47:41.810Z", "dateModified": "2026-04-05T07:47:41.810Z" } </script>