Helm Charts Roadmap
50 sections • 743 topics
- 1. Understanding Helm Architecture
- Helm 3 Client-Only Flow
- 2. Understanding Chart Concept
- 3. Understanding Release Concept
- 4. Understanding Repository Concept
- 5. Understanding Values Hierarchy
- 6. Understanding Template Rendering
- Render Pipeline
- 7. Understanding Chart Lifecycle
- Lifecycle States
- 8. Understanding Helm Three-Way Merge
- 9. Understanding Chart API Versions
- 10. Comparing Helm vs Kustomize
- Helm
- Kustomize
- 1. Installing Helm CLI
- 2. Verifying Helm Installation
- 3. Configuring Repository Settings
- 4. Setting Up Kubeconfig Context
- Example: Target a specific cluster + namespace
- 5. Configuring Helm Environment Variables
- 6. Setting Default Namespace
- Example: Per-shell default
- 7. Configuring Helm Cache Directory
- 8. Setting Up Helm Plugins Directory
- 9. Configuring Helm Data Directory
- 10. Configuring Helm Config Directory
- 1. Adding Chart Repository
- Example: Add popular repos
- 2. Listing Repositories
- 3. Updating Repository Index
- 4. Removing Repository
- Example: Remove + verify
- 5. Searching Repository Charts
- Example: Find a chart
- 6. Viewing Repository Index
- 7. Using Private Repositories
- Example: HTTPS basic auth
- 8. Configuring Repository Credentials
- 9. Setting Repository Cache
- 10. Managing Multiple Repositories
- Example: Scripted CI bootstrap
- 1. Searching Repositories
- 2. Searching Artifact Hub
- Example: Discover charts across all public repos
- 3. Using Search Keywords
- 4. Filtering by Version
- Example: Constraint queries
- 5. Using Regular Expressions
- 6. Limiting Search Results
- 7. Viewing All Versions
- Example: Inspect history of a chart
- 8. Searching with Output Format
- 9. Finding Latest Version
- Example: Script latest stable version
- 10. Searching Specific Repository
- 1. Generating New Chart
- Example: Scaffold a chart
- 2. Understanding Chart Directory Layout
- 3. Creating Chart.yaml Metadata
- Example: Minimal Chart.yaml
- 4. Defining Chart Type
- 5. Creating values.yaml File
- Example: Idiomatic structure
- 6. Creating .helmignore File
- 7. Organizing Template Files
- 8. Creating NOTES.txt File
- Example: NOTES.txt with conditional URL
- 9. Setting Up charts/ Subdirectory
- 10. Creating crds/ Directory
- 11. Creating templates/_helpers.tpl
- Example: Standard helpers from
- 1. Defining Chart Name and Version
- 2. Setting Application Version
- Example: Quote appVersion
- 3. Declaring API Version
- 4. Specifying Chart Type
- 5. Adding Chart Description
- Example: Description field
- 6. Adding Keywords and Sources
- Example: Discoverability metadata
- 7. Listing Chart Maintainers
- Example: maintainers block
- 8. Setting Home URL
- 9. Adding Icon URL
- 10. Marking Chart Deprecated
- Example: Deprecate with migration note
- 11. Setting Kubernetes Version Constraint
- 1. Creating values.yaml Default Values
- Example: Layered defaults
- 2. Understanding Values Hierarchy
- 3. Using Custom Values Files
- Example: Stack multiple files
- 4. Setting Individual Values
- 5. Using String Values
- Example: Force string interpretation
- 6. Setting File Content Values
- Example: Load TLS cert from disk
- 7. Setting JSON Values
- Example: Complex list of objects
- 8. Merging Multiple Values Files
- 9. Creating Environment-Specific Values
- Example: Layout
- 10. Documenting Values
- 11. Using Global Values
- Example: Shared across parent + subcharts
- 1. Creating values.schema.json File
- Example: Minimal schema
- 2. Defining Schema Properties
- 3. Setting Required Fields
- Example: Multiple required keys
- 4. Defining Value Types
- 5. Adding Property Constraints
- 6. Using Enum Values
- Example: Restrict allowed strings
- 7. Setting Default Values
- 8. Adding Schema Descriptions
- Example: Self-documenting schema
- 9. Validating Nested Objects
- Example: Deep schema
- 10. Testing Schema Validation
- 1. Understanding Template Syntax
- 2. Creating Deployment Template
- Example: Standard Deployment
- 3. Creating Service Template
- Example: ClusterIP Service
- 4. Creating ConfigMap Template
- Example: App configuration
- 5. Creating Secret Template
- Example: Encoded Secret
- 6. Creating Ingress Template
- Example: Conditional Ingress
- 7. Creating ServiceAccount Template
- Example: Optional SA
- 8. Creating RBAC Templates
- Example: Role + RoleBinding
- 9. Creating PersistentVolumeClaim Template
- Example: PVC
- 10. Using Template Comments ({{/* */}})
- 11. Using Multi-Document Templates
- Example: Multiple resources per file
- 1. Accessing Values ({{ .Values.key }})
- 2. Using Pipeline Operations
- Example: Chained transformations
- 3. Quoting Strings
- 4. Converting to YAML
- Example: Render arbitrary structure
- 5. Converting to JSON
- 6. Using Default Values
- Example: Fallback chain
- 7. String Manipulation
- 8. Type Conversion
- 9. Encoding Functions
- 10. Date Functions
- 11. UUID Generation
- Example: Random UUID v4
- 12. Using fail Function
- Example: Hard validation
- 1. Using Conditional Statements
- Example: if/else if/else
- 2. Implementing Loops
- Example: range over list and map
- 3. Using with Scope
- Example: Rebind dot
- 4. Defining Variables
- 5. Checking Value Existence
- Example: Safe access patterns
- 6. Using Boolean Logic
- 7. Comparing Values
- 8. Breaking Loop Iteration
- 9. Handling Empty Values
- Example: Avoid emitting empty fields
- 10. Using Complex Conditionals
- Example: Combined predicate
- 11. Implementing Dynamic Resource Creation
- Example: Generate one ConfigMap per entry
- 1. Defining Named Templates
- Example: Define block
- 2. Including Templates
- 3. Using Template Directive
- Example: include vs template
- 4. Creating Partial Templates
- Example: Reusable selector labels
- 5. Passing Scope to Templates
- 6. Defining Common Labels
- Example: Standard label set
- 7. Creating Selector Templates
- 8. Building Image Strings
- Example: Image helper supporting registry + digest
- 9. Generating Resource Names
- 10. Reusing Template Logic
- Example: Composition
- 11. Using Template Inheritance
- 1. Accessing Release Object (.Release.Name)
- 2. Using Chart Object (.Chart.Name)
- 3. Accessing Files Object (.Files.Get)
- 4. Using Capabilities Object (.Capabilities.KubeVersion)
- 5. Working with Template Object (.Template.Name)
- 6. Accessing Release Service (.Release.Service)
- Example: Standard managed-by label
- 7. Getting Release Namespace (.Release.Namespace)
- 8. Checking Release IsUpgrade (.Release.IsUpgrade)
- Example: Upgrade-only hook logic
- 9. Checking Release IsInstall (.Release.IsInstall)
- 10. Using Chart Version (.Chart.Version)
- Example: Chart version label
- 11. Accessing Capabilities APIVersions (.Capabilities.APIVersions)
- Example: Detect API availability
- 1. Reading File Content
- Example: Inline file in ConfigMap
- 2. Listing Files
- 3. Reading Files as Bytes
- Example: Binary file
- 4. Using Files in ConfigMaps
- Example: Glob to ConfigMap
- 5. Using Files in Secrets
- Example: Glob to Secret
- 6. Iterating Over Files
- Example: Loop with range
- 7. Checking File Existence
- 8. Encoding File Content
- 9. Including Binary Files
- 10. Organizing Static Files
- 1. Reading Existing Resources
- 2. Querying ConfigMaps
- Example: Read existing CM
- 3. Querying Secrets
- Example: Preserve existing secret across upgrades
- 4. Checking Resource Existence
- 5. Reading Resource Fields
- Example: Navigate fields
- 6. Using Lookup in Conditionals
- Example: Create only if absent
- 7. Handling Missing Resources
- 8. Querying Across Namespaces
- Example: All Services across ns
- 9. Understanding Performance Implications
- 10. Understanding Security Implications
- 1. Understanding Whitespace Behavior
- 2. Using Left Trim ({{-)
- Example: Remove preceding blank line
- 3. Using Right Trim (-}})
- Example: Inline rendering
- 4. Combining Trim Markers ({{- -}})
- 5. Controlling Indentation
- 6. Managing YAML Formatting
- Example: toYaml with nindent
- 7. Using Template Comments ({{/* */}})
- 8. Avoiding Extra Blank Lines
- Example: Compare bad vs good
- 9. Formatting Multi-line Strings (| and >)
- 10. Debugging Whitespace Issues
- 1. Defining Hook Annotations
- Example: Basic hook
- 2. Using pre-install Hook
- 3. Using post-install Hook
- 4. Using pre-upgrade Hook
- 5. Using post-upgrade Hook
- 6. Using pre-delete Hook
- 7. Using post-delete Hook
- 8. Using pre-rollback Hook
- 9. Using post-rollback Hook
- 10. Setting Hook Weight
- 11. Setting Hook Deletion Policy
- 12. Using test Hook
- Example: Connectivity test
- 1. Declaring Dependencies
- Example: Chart.yaml dependencies block
- 2. Specifying Dependency Version
- 3. Setting Dependency Repository
- 4. Using Local Dependencies
- Example: Sibling chart
- 5. Enabling Conditional Dependencies
- 6. Using Tag-based Dependencies
- Example: Toggle group of charts
- 7. Downloading Dependencies
- 8. Building Dependency Charts
- Example: Reproducible CI build
- 9. Listing Dependencies
- 10. Importing Child Values
- Example: Surface subchart values at parent level
- 11. Overriding Subchart Values
- Example: Parent values.yaml
- 12. Managing Chart.lock File
- 1. Installing Chart from Repository
- Example: Install from added repo
- 2. Installing from Local Path
- Example: Dev install
- 3. Installing from URL
- 4. Installing from Archive
- Example: Local .tgz
- 5. Generating Release Name
- 6. Setting Custom Release Name
- 7. Installing in Specific Namespace
- 8. Creating Namespace
- Example: Combined
- 9. Using Dry Run Mode
- 10. Waiting for Resources
- 11. Setting Wait Timeout
- 12. Installing with Values
- Example: Combined inputs
- 1. Upgrading Release
- Example: Standard upgrade
- 2. Installing or Upgrading
- 3. Forcing Resource Update
- 4. Resetting Values
- 5. Reusing Previous Values
- 6. Upgrading with New Values
- Example: Versioned upgrade
- 7. Using Atomic Upgrades
- 8. Cleaning Up on Failed Upgrade
- Example: Safe CI upgrade
- 9. Setting Revision Limits
- 10. Waiting for Upgrade Completion
- 1. Rolling Back Release
- Example: Roll back to previous revision
- 2. Rolling Back to Revision
- 3. Viewing Release History
- 4. Understanding Rollback Behavior
- 5. Using Atomic Rollback
- 6. Forcing Rollback
- 7. Setting Rollback Timeout
- 8. Waiting for Rollback Completion
- Example: Safe rollback
- 9. Cleaning Up on Failed Rollback
- 10. Troubleshooting Failed Rollbacks
- 1. Listing Active Releases
- 2. Listing All Releases
- 3. Filtering by Namespace
- 4. Listing Across Namespaces
- Example: Cluster-wide JSON list
- 5. Getting Release Status
- 6. Getting Release Values
- Example: Inspect computed values
- 7. Getting Release Manifest
- 8. Getting Release Notes
- 9. Getting Release Hooks
- 10. Filtering Release Output
- 1. Uninstalling Release
- Example: Remove release
- 2. Keeping Release History
- 3. Waiting for Deletion
- 4. Setting Deletion Timeout
- 5. Performing Dry Run Uninstall
- Example: Preview deletion
- 6. Uninstalling with Cascade
- 7. Viewing Uninstall Output
- 8. Uninstalling Multiple Releases
- Example: Batch uninstall
- 9. Handling Failed Uninstalls
- 10. Cleaning Up Orphaned Resources
- 1. Linting Chart Templates
- Example: Run lint
- 2. Checking Chart Structure
- 3. Validating Chart.yaml
- 4. Validating Template Syntax
- Example: Render + parse
- 5. Using Strict Linting
- 6. Checking Values Schema
- Example: Schema-enforced lint
- 7. Validating Kubernetes Resources
- 8. Generating Dry-Run Output
- 9. Using Template Command
- Example: Render without cluster
- 10. Debugging Template Rendering
- 11. Validating Dependencies
- 1. Running Chart Tests
- Example: Run tests after install
- 2. Creating Test Pods
- Example: HTTP smoke test
- 3. Using Test Annotations
- 4. Running Specific Tests
- 5. Viewing Test Logs
- 6. Setting Test Timeout
- 7. Filtering Test Results
- Example: Inspect failed test pod
- 8. Cleaning Test Pods
- 9. Testing with Different Values
- Example: Per-env test matrix
- 10. Automating Chart Tests
- 1. Using Debug Mode
- 2. Generating Templates Locally
- Example: Render to file
- 3. Performing Dry Run
- 4. Viewing Rendered Manifests
- 5. Checking Release Status
- Example: Detailed status
- 6. Viewing Release History
- 7. Inspecting Hook Execution
- Example: View hook pods/jobs
- 8. Checking Resource Events
- 9. Validating Current Values
- Example: Diff values vs file
- 10. Using Verbose Output
- 11. Troubleshooting Failed Upgrades
- 12. Debugging Template Rendering
- Example: Pinpoint failure
- 1. Creating Chart Package
- Example: Package chart
- 2. Setting Package Destination
- 3. Signing Chart Package
- Example: GPG sign at packaging
- 4. Using Package Key
- 5. Setting Package Version
- 6. Setting App Version
- 7. Updating Dependencies Before Packaging
- 8. Creating Package from Path
- Example: Package multiple
- 9. Verifying Package Contents
- 10. Generating Package Checksum
- Example: SHA-256 for integrity
- 1. Generating Repository Index
- Example: Build index from directory
- 2. Updating Index with New Chart
- Example: Incremental index
- 3. Setting Base URL
- 4. Hosting Static Repository
- 5. Using GitHub Pages
- Example: Publish via gh-pages
- 6. Publishing to ChartMuseum
- Example: Push via cm-push plugin
- 7. Publishing to Harbor
- Example: Harbor OCI
- 8. Publishing to Artifactory
- 9. Automating Repository Updates
- Example: Release workflow
- 10. Managing Repository Versions
- 1. Understanding OCI Registry Support
- 2. Logging into Registry
- Example: Login
- 3. Logging out of Registry
- 4. Pushing Chart to OCI
- Example: Push packaged chart
- 5. Pulling Chart from OCI
- Example: Pull tarball locally
- 6. Installing from OCI
- 7. Using OCI References
- 8. Listing OCI Chart Tags
- Example: List versions via crane/oras
- 9. Setting OCI Credentials
- 10. Using Docker Config
- Example: Reuse docker credentials
- 11. Working with Private OCI Registries
- 1. Adding Subcharts to Chart
- 2. Declaring Subchart Dependencies
- Example: Multiple subcharts
- 3. Overriding Subchart Values
- Example: Override under subchart key
- 4. Using Global Values
- Example: Shared global block
- 5. Importing Subchart Values
- Example: Surface subchart exports
- 6. Conditionally Enabling Subcharts
- 7. Using Subchart Tags
- Example: Group enable/disable
- 8. Accessing Parent Values
- 9. Sharing Templates Across Charts
- 10. Managing Subchart Versions
- 1. Defining Library Chart Type
- Example: Library Chart.yaml
- 2. Creating Reusable Templates
- Example: Common deployment helper
- 3. Sharing Common Helpers
- 4. Using Library as Dependency
- Example: Consumer Chart.yaml
- 5. Including Library Templates
- Example: Consumer's templates/deployment.yaml
- 6. Versioning Library Charts
- 7. Documenting Library Usage
- 8. Organizing Library Templates
- 9. Testing Library Templates
- 10. Publishing Library Charts
- 1. Understanding CRD Handling
- 2. Installing CRDs with Charts
- 3. Creating CRD Templates
- Example: crds/myresource.yaml (NOT templated)
- 4. Managing CRD Versions
- 5. Handling CRD Upgrades
- 6. Avoiding CRD Deletion on Uninstall
- 7. Validating CRD Schemas
- 8. Using CRDs with Operators
- Example: Operator chart layout
- 9. Testing CRD Installation
- Example: Verify CRD post-install
- 10. Troubleshooting CRD Issues
- 1. Signing Chart Packages
- Example: Sign + verify
- 2. Verifying Chart Signatures
- 3. Using GPG Keys
- 4. Creating Provenance File
- 5. Validating Chart Integrity
- Example: Verify before install
- 6. Implementing RBAC in Charts
- Example: Least-privilege Role
- 7. Setting Security Context
- Example: Restricted pod
- 8. Using Network Policies
- Example: Default-deny + allow ingress
- 9. Scanning Charts for Vulnerabilities
- 10. Following Security Best Practices
- 11. Validating Image Sources
- 1. Creating Secret Templates
- Example: Opaque Secret
- 2. Encoding Secret Values
- 3. Using External Secrets
- Example: ExternalSecret CR
- 4. Integrating with HashiCorp Vault
- 5. Using SOPS for Encryption
- Example: helm-secrets plugin
- 6. Managing TLS Certificates
- Example: cert-manager Certificate
- 7. Using Sealed Secrets
- 8. Passing Secrets via Values
- Example: CI injection
- 9. Using Secret Files
- 10. Avoiding Hardcoded Secrets
- 1. Using Semantic Versioning
- 2. Incrementing Chart Version
- 3. Setting Application Version
- 4. Creating Version Constraints
- 5. Using Version Ranges
- Example: Composite
- 6. Pinning Exact Versions
- 7. Using Tilde Range
- 8. Using Caret Range
- 9. Maintaining Changelog
- Example: Annotations-based changelog
- 10. Tagging Chart Releases
- 1. Upgrading Chart API Version
- Example: v1 → v2
- 2. Migrating from requirements.yaml
- 3. Updating Deprecated Kubernetes APIs
- 4. Handling Breaking Changes
- 5. Testing Migration Changes
- 6. Rolling Back Failed Migrations
- Example: Atomic with auto-rollback
- 7. Updating Chart Dependencies
- 8. Migrating to OCI Registries
- 9. Converting to Library Charts
- 10. Documenting Migration Steps
- 1. Setting Chart Annotations
- Example: Artifact Hub annotations
- 2. Adding Custom Metadata
- 3. Documenting Chart Purpose
- 4. Listing Chart Dependencies
- Example: View resolved deps
- 5. Setting Minimum Kubernetes Version
- 6. Adding Chart Maturity
- 7. Linking to Source Code
- Example: sources list
- 8. Providing Support Contacts
- Example: maintainers + links
- 9. Setting Chart License
- 10. Adding Chart Category
- 1. Creating Recursive Templates
- Example: Recursive label flattener
- 2. Building Dynamic Names
- Example: Name from values
- 3. Implementing Feature Flags
- 4. Creating Environment-Aware Templates
- Example: Per-env resources
- 5. Using Template Variables
- 6. Implementing Complex Data Structures
- Example: Build dict dynamically
- 7. Building Resource Templates Dynamically
- Example: Many Services from one map
- 8. Using Template Includes Efficiently
- 9. Handling Edge Cases
- 10. Creating Maintainable Templates
- 1. Understanding Post-Renderers
- 2. Configuring Post-Renderer Command
- 3. Using Kustomize as Post-Renderer
- Example: kustomize.sh wrapper
- 4. Applying Custom Patches
- Example: Strategic-merge patch via Kustomize
- 5. Adding Labels and Annotations
- Example: Cluster-wide labels
- 6. Modifying Generated Resources
- 7. Chaining Multiple Post-Renderers
- 8. Debugging Post-Renderer Output
- Example: Capture intermediate output
- 9. Handling Post-Renderer Errors
- 10. Integrating Post-Renderers in CI/CD
- Example: Pipeline step
- 1. Installing Helm Plugins
- Example: Install from Git
- 2. Listing Installed Plugins
- 3. Updating Plugins
- Example: Update commands
- 4. Removing Plugins
- 5. Using helm-diff Plugin
- Example: Preview upgrade
- 6. Using helm-secrets Plugin
- Example: SOPS workflow
- 7. Using helm-git Plugin
- Example: Chart from Git repo
- 8. Using helm-s3 Plugin
- Example: S3-backed repo
- 9. Creating Custom Plugins
- Example: plugin.yaml
- 10. Configuring Plugin Environment
- 1. Creating Namespace in Chart
- 2. Using Release Namespace
- 3. Installing Charts Across Namespaces
- Example: Per-namespace releases
- 4. Implementing Namespace Isolation
- 5. Using Namespace-scoped Resources
- 6. Managing Cluster-scoped Resources
- 7. Implementing Resource Quotas
- Example: Tenant ResourceQuota
- 8. Using LimitRange for Namespaces
- Example: Default container limits
- 9. Handling Cross-Namespace References
- 10. Implementing Multi-Tenant Charts
- 1. Understanding Helm Starters
- 2. Creating Starter Charts
- Example: Build + install starter
- 3. Using Starter Templates
- 4. Organizing Starters Directory
- Example: Layout
- 5. Customizing Starter Templates
- 6. Sharing Starter Charts
- 7. Implementing Organization Standards
- 8. Using Starter Variables
- 9. Testing Starter Charts
- Example: Smoke test in CI
- 10. Maintaining Starter Charts
- 1. Downloading Charts for Offline Use
- Example: Pull chart + deps
- 2. Bundling Chart Dependencies
- Example: Vendor all deps
- 3. Mirroring Container Images
- Example: Use skopeo / crane
- 4. Setting Up Private Registry
- 5. Configuring Air-Gapped Repository
- Example: Internal repo + OCI
- 6. Updating Image References
- Example: Override registries
- 7. Packaging All Dependencies
- 8. Validating Offline Installation
- Example: Dry-run + render check
- 9. Managing Updates in Air-Gapped
- 10. Documenting Air-Gapped Procedures
- 1. Understanding Multi-Cluster Patterns
- 2. Managing Kubeconfig Contexts
- Example: Per-cluster commands
- 3. Using Environment-Specific Values
- Example: Layered values
- 4. Implementing GitOps Workflow
- 5. Synchronizing Releases Across Clusters
- Example: Argo CD ApplicationSet
- 6. Handling Cluster-Specific Configuration
- 7. Managing Cross-Cluster Dependencies
- 8. Implementing Blue-Green Deployments
- Example: Two releases + traffic switch
- 9. Managing Canary Releases
- 10. Monitoring Multi-Cluster Deployments
- 1. Installing Helm in Pipeline
- Example: GitHub Actions
- 2. Authenticating to Kubernetes
- 3. Running Helm Lint
- Example: Lint with strict mode
- 4. Performing Dry Run
- Example: Server-side dry-run
- 5. Deploying Charts
- Example: Atomic deploy with timeout
- 6. Running Chart Tests
- Example: Post-deploy validation
- 7. Rolling Back on Failure
- 8. Publishing Charts
- Example: Chart-releaser action
- 9. Versioning with CI Variables
- Example: Inject build metadata
- 10. Using GitOps Workflows
- 11. Implementing Blue-Green Deployments
- Example: Pipeline blue-green
- 1. Minimizing Template Complexity
- 2. Caching Template Results
- Example: Cache expensive include
- 3. Reducing Value Lookups
- Example: Bind once with
- 4. Optimizing Loop Iterations
- 5. Using Conditional Rendering
- Example: Skip unused blocks
- 6. Minimizing File Reads
- 7. Reducing Chart Size
- 8. Optimizing Dependencies
- 9. Using Lazy Evaluation
- Example: Short-circuit expensive checks
- 10. Profiling Chart Rendering
- Example: Measure render time
- 1. Configuring Helm Environment
- 2. Setting Default Namespace
- Example: Per-shell default
- 3. Configuring Kubeconfig Path
- 4. Setting Repository Cache
- 5. Configuring Plugins Path
- 6. Setting Registry Config
- 7. Enabling Experimental Features
- 8. Configuring Max History
- Example: Limit revision history
- 9. Setting Debug Output
- 10. Using Custom Configuration
- Example: Pipeline-isolated config
- 1. Following Naming Conventions
- 2. Using Fullname Templates
- Example: Standard fullname helper
- 3. Implementing Proper Labels
- Example: Standard label set
- 4. Using Annotations Appropriately
- 5. Making Charts Configurable
- 6. Providing Sensible Defaults
- 7. Documenting Chart Usage
- 8. Creating Comprehensive NOTES.txt
- Example: Helpful post-install message
- 9. Implementing Resource Limits
- Example: Always-set limits pattern
- 10. Using Health Checks
- Example: All three probe types
- 11. Following Helm Chart Conventions
- 1. Marking Charts as Deprecated
- Example: Deprecated chart
- 2. Documenting Deprecation Reasons
- Example: Annotations + README
- 3. Providing Migration Paths
- 4. Setting Deprecation Timeline
- 5. Communicating to Users
- 6. Maintaining Deprecated Charts
- 7. Removing Deprecated Charts
- 8. Archiving Old Chart Versions
- 9. Redirecting to Replacements
- Example: NOTES.txt redirect
- 10. Handling Breaking Changes