Provider-Helm Usage Guide
Overview
Provider-helm enables Crossplane to deploy Helm charts as managed resources. Think of it as the supplier that provides pre-packaged ingredients (Helm charts) like Bitnami PostgreSQL, Redis, or any other Helm chart.
Best Practice: Use function-go-templating
for new compositions instead of function-patch-and-transform
. Go templating is more modern, provides better flexibility with conditionals and loops, and makes compositions easier to read and maintain.
Installation
Provider-helm is automatically installed by our setup script:
./scripts/setup-cluster.sh
Basic Usage Pattern
1. Create a Release Resource
apiVersion: helm.crossplane.io/v1beta1
kind: Release
metadata:
name: my-postgresql
spec:
forProvider:
chart:
name: postgresql
repository: https://charts.bitnami.com/bitnami
version: "13.2.24"
namespace: databases
values:
auth:
database: myapp
username: myuser
providerConfigRef:
name: helm-provider
2. Use in a Composition (Modern Go Templating)
apiVersion: apiextensions.crossplane.io/v2
kind: Composition
metadata:
name: database-helm
spec:
compositeTypeRef:
apiVersion: platform.io/v1alpha1
kind: XDatabase
mode: Pipeline
pipeline:
- step: deploy-postgresql
functionRef:
name: function-go-templating
input:
apiVersion: gotemplating.crossplane.io/v1beta1
kind: GoTemplate
source: Inline
inline:
template: |
apiVersion: helm.crossplane.io/v1beta1
kind: Release
metadata:
name: {{ .observed.composite.resource.metadata.name }}-postgresql
annotations:
crossplane.io/external-name: {{ .observed.composite.resource.metadata.name }}-postgresql
spec:
forProvider:
chart:
name: postgresql
repository: https://charts.bitnami.com/bitnami
version: "13.2.24"
namespace: {{ .observed.composite.resource.spec.namespace | default "databases" }}
values:
auth:
database: {{ .observed.composite.resource.spec.databaseName }}
username: {{ .observed.composite.resource.spec.username | default "dbuser" }}
primary:
persistence:
enabled: true
size: {{ .observed.composite.resource.spec.size | default "10Gi" }}
metrics:
enabled: {{ .observed.composite.resource.spec.monitoring | default false }}
providerConfigRef:
name: helm-provider
- step: auto-ready
functionRef:
name: function-auto-ready
Common Helm Charts
Bitnami PostgreSQL
chart:
name: postgresql
repository: https://charts.bitnami.com/bitnami
Redis
chart:
name: redis
repository: https://charts.bitnami.com/bitnami
NGINX
chart:
name: nginx
repository: https://charts.bitnami.com/bitnami
Testing Provider-Helm
Simple Test Deployment
# Create a test namespace
kubectl create namespace helm-test
# Deploy a simple nginx chart
kubectl apply -f - <<EOF
apiVersion: helm.crossplane.io/v1beta1
kind: Release
metadata:
name: test-nginx
spec:
forProvider:
chart:
name: nginx
repository: https://charts.bitnami.com/bitnami
version: "15.14.0"
namespace: helm-test
values:
service:
type: ClusterIP
providerConfigRef:
name: helm-provider
EOF
# Check the release
kubectl get releases.helm.crossplane.io
kubectl get pods -n helm-test
# Clean up
kubectl delete release test-nginx
kubectl delete namespace helm-test
Troubleshooting
Check Provider Status
kubectl get providers.pkg.crossplane.io provider-helm
kubectl describe providerconfig.helm.crossplane.io helm-provider
View Provider Logs
kubectl logs -l pkg.crossplane.io/provider=provider-helm -n crossplane-system
Common Issues
- Release Stuck in Creating: Check namespace exists and chart values are valid
- Authentication Errors: Verify ProviderConfig uses correct credentials
- Chart Not Found: Ensure repository URL is correct and accessible
Restaurant Analogy
- Supplier = Provider-helm
- Pre-packaged Ingredients = Helm charts (PostgreSQL, Redis, etc.)
- Delivery Instructions = Release resource with values
- Kitchen = Composition that uses the Release
- Final Dish = Deployed application with all dependencies