Standard Chart
One generic chart that covers deployments, services, ingresses, jobs, cronjobs, secrets, persistence, autoscaling, and more
Write a simple values.yaml and the open source standard chart renders your deployments, services, ingresses, jobs and secrets
values.yaml becomes 12 Kubernetes manifestsDescribe the app once. The standard chart renders the Secret, ConfigMap, PersistentVolumeClaim, Service, Deployment, CronJob, Ingress, ExternalSecret, Secret, ConfigMap, Job, and ExternalSecret with consistent names, labels and selectors.
helm repo add hosst https://hosstio.github.io/helm-charts
helm install example hosst/standard --values values.yaml
values.yaml 57 linesversion: "2.4.1"
image:
registry: ghcr.io/
name: example/app
replicaCount: 2
variables:
LOG_LEVEL: info
secrets:
DATABASE_PASSWORD: change-me
externalSecretsStore:
name: vault
kind: ClusterSecretStore
externalSecrets:
API_TOKEN:
key: example/app
property: api-token
persistence:
data:
size: 10Gi
mount:
mountPath: /data
deployment:
configure:
persistence: true
containers:
app:
ports:
http:
containerPort: 8080
service:
ports:
http:
port: 80
ingress:
className: nginx
hosts:
- example.com
jobs:
migrate:
hook: pre-upgrade
command: ["/app/bin", "migrate"]
cronJobs:
report:
schedule: "0 6 * * *"
command: ["/app/bin", "report"]
---
# Source: standard/templates/secrets.yaml
# Values: secrets
apiVersion: v1
kind: Secret
metadata:
name: example-secrets
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
type: Opaque
data:
DATABASE_PASSWORD: Y2hhbmdlLW1l
---
# Source: standard/templates/configmaps.yaml
# Values: variables
apiVersion: v1
kind: ConfigMap
metadata:
name: example-variables
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
data:
LOG_LEVEL: "info"
---
# Source: standard/templates/pvcs.yaml
# Values: persistence.data
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: example-data
annotations:
helm.sh/resource-policy: keep
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "10Gi"
---
# Source: standard/templates/services.yaml
# Values: services.example
apiVersion: v1
kind: Service
metadata:
name: example
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: http
selector:
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/deployment: example
---
# Source: standard/templates/deployments.yaml
# Values: deployments.example
apiVersion: apps/v1
kind: Deployment
metadata:
name: example
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/deployment: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/deployment: example
template:
metadata:
annotations:
# https://helm.sh/docs/howto/charts_tips_and_tricks/#automatically-roll-deployments
# Hash only the config keys/values (toYaml sorts map keys) so pods roll on data
# changes but not on chart/app version bumps or template formatting changes.
checksum/variables: f3bf8d6461d0e3caeb4f3b95d3421143601603fa53d7ec9f4634d2a6722b32f2
checksum/secrets: a623b7a745765b1b73a9b2f96615007893a89293c57410b86c23000226b31e0c
checksum/externalSecrets: 656f34ecd6fe3b91f54a41f06259eb2ac99fa6c26e4642e6815fd412159f278f
labels:
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/deployment: example
spec:
volumes:
# Configure mounted `persistent volumes`
# Values: persistence.data
- name: data
persistentVolumeClaim:
claimName: example-data
# Configure explicit `volumes`
# Configure volume for files
# Configure volume for secret files
# Configure volume for sealed secrets
# Configure containers
containers:
- name: app
image: "ghcr.io/example/app:2.4.1"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
name: http
# Configure volume mounts
volumeMounts:
# Automatically mount Persistent Volume Claims with `mount` configuration
- name: data
mountPath: /data
# Configure environment variables
envFrom:
# Configure environment with `variables` values
- configMapRef:
name: example-variables
# Configure environment with `secrets` values
- secretRef:
name: example-secrets
# Configure environment with `externalSecrets` values
- secretRef:
name: example-external-secrets
---
# Source: standard/templates/cronjobs.yaml
# Values: cronJobs.report
# Configure cron jobs to be safe by default:
# - No concurrency
# - No restarts
apiVersion: batch/v1
kind: CronJob
metadata:
name: example-cronjob-report
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
schedule: "0 6 * * *"
concurrencyPolicy: Forbid
jobTemplate:
spec:
backoffLimit: 0
template:
metadata:
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
restartPolicy: Never
# Configure containers
containers:
- name: report
image: "ghcr.io/example/app:2.4.1"
imagePullPolicy: IfNotPresent
command:
- /app/bin
- report
# Configure environment variables
envFrom:
# Configure environment with `variables` values
- configMapRef:
name: example-variables
# Configure environment with `secrets` values
- secretRef:
name: example-secrets
# Configure environment with `externalSecrets` values
- secretRef:
name: example-external-secrets
---
# Source: standard/templates/ingresses.yaml
# Values: ingresses.example
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
ingressClassName: nginx
rules:
- host: "example.com"
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: example
port:
name: http
---
# Source: standard/templates/externalsecrets.yaml
# Values: externalSecrets
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: example-external-secrets
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
refreshInterval: "1h"
secretStoreRef:
name: vault
kind: ClusterSecretStore
target:
name: example-external-secrets
data:
- secretKey: API_TOKEN
remoteRef:
key: "example/app"
property: "api-token"
---
# Source: standard/templates/secrets.yaml
# Values: secrets
apiVersion: v1
kind: Secret
metadata:
name: example-pre-hook-secrets
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
annotations:
helm.sh/hook: pre-upgrade
helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
helm.sh/hook-weight: "9"
type: Opaque
data:
DATABASE_PASSWORD: Y2hhbmdlLW1l
---
# Source: standard/templates/configmaps.yaml
# Values: variables
apiVersion: v1
kind: ConfigMap
metadata:
name: example-pre-hook-variables
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
annotations:
helm.sh/hook: pre-upgrade
helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
helm.sh/hook-weight: "9"
data:
LOG_LEVEL: "info"
---
# Source: standard/templates/jobs.yaml
# Values: jobs.migrate
apiVersion: batch/v1
kind: Job
metadata:
name: example-job-migrate
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
annotations:
# Without helm.sh/hook the job is part of the release, not a lifecycle hook.
"helm.sh/hook": pre-upgrade
"helm.sh/hook-weight": "10"
"helm.sh/hook-delete-policy": before-hook-creation
spec:
backoffLimit: 0
ttlSecondsAfterFinished: 600
template:
metadata:
name: example-job-migrate
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
spec:
restartPolicy: Never
# Configure containers
containers:
- name: migrate
image: "ghcr.io/example/app:2.4.1"
imagePullPolicy: IfNotPresent
command:
- /app/bin
- migrate
# Configure environment variables
envFrom:
# Configure environment with `variables` values
- configMapRef:
name: example-pre-hook-variables
# Configure environment with `secrets` values
- secretRef:
name: example-pre-hook-secrets
# Configure environment with `externalSecrets` values
- secretRef:
name: example-pre-hook-external-secrets
---
# Source: standard/templates/externalsecrets.yaml
# Values: externalSecrets
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: example-pre-hook-external-secrets
labels:
helm.sh/chart: standard-0.1.0
app.kubernetes.io/name: example
app.kubernetes.io/instance: example
app.kubernetes.io/version: "2.4.1"
app.kubernetes.io/managed-by: Helm
annotations:
helm.sh/hook: pre-upgrade
helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
helm.sh/hook-weight: "9"
spec:
refreshInterval: "1h"
secretStoreRef:
name: vault
kind: ClusterSecretStore
target:
name: example-pre-hook-external-secrets
data:
- secretKey: API_TOKEN
remoteRef:
key: "example/app"
property: "api-token"