Skip to main content

Values reference

Full reference of all supported values.yaml keys.


Minimal starter

Copy this as a starting point for a single Deployment:

deployments:
- name: my-app
image:
repository: my-org/my-app
tag: "1.0.0"
service:
port: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi
cpu: 200m

Everything else is optional — add sections only when you need them.


Structure

Top-level keys are lists by workload type, plus global (chart-level) keys:

deployments:
- name: my-api
# workload options …

statefulsets:
- name: my-db
# workload options …

cronjobs:
- name: my-job
# workload options …

# Global keys
serviceAccount:
rbac:
imagePullSecrets:
configMaps:
secrets:
sealedSecrets:
persistentVolumeClaims:
persistentVolumes:
extraManifests:

Workload options

Basic

KeyTypeDefaultDescription
namestringRequired. Name used for all Kubernetes resources.
replicaCountnumber1Replica count. Omitted from output when 1. Not used for CronJobs.
strategyobjectRollingUpdateDeployment strategy (Deployment only).
# Recreate
strategy:
type: Recreate

# RollingUpdate with limits
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0

Image

KeyTypeDefaultDescription
image.repositorystringImage repository, e.g. nginx or quay.io/myorg/app
image.tagstringImage tag, e.g. "1.25"
image.digeststringImage digest — overrides tag when set
image.pullPolicystringIfNotPresentIfNotPresent, Always, or Never

CronJob schedule

Only for workloads in cronjobs[]. These keys go at the workload top level (not nested):

KeyTypeDefaultDescription
schedulestringCron expression, e.g. "0 * * * *"
concurrencyPolicystringForbidAllow, Forbid, or Replace
successfulJobsHistoryLimitnumber3How many completed Job records to keep
failedJobsHistoryLimitnumber1How many failed Job records to keep
backoffLimitnumber3Max retries before marking a Job as failed
restartPolicystringOnFailureOnFailure or Never
suspendboolfalseSuspend the CronJob (no new Jobs start)
startingDeadlineSecondsnumberSeconds after a missed schedule window to still start a Job
activeDeadlineSecondsnumberMax duration of a single Job run
cronjobs:
- name: nightly-report
image:
repository: my-org/reporter
tag: "2.0"
schedule: "0 2 * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
backoffLimit: 2
restartPolicy: OnFailure

Service

Not available for CronJobs.

KeyTypeDefaultDescription
service.enabledbooltrueCreate a Service. Set to false to disable.
service.typestringClusterIPClusterIP, NodePort, or LoadBalancer
service.portnumber80Service port
service.targetPortstring/numberhttpContainer port or named port
service.headlessboolfalse (true for StatefulSets on v1.2.0+)Set clusterIP: None. Headless is the default for StatefulSets since v1.2.0.
service.protocolstringTCPTCP or UDP
service.extraPortslistAdditional port definitions
service:
enabled: true
port: 8080
targetPort: http
extraPorts:
- name: metrics
port: 9090
targetPort: 9090

Route (OpenShift)

Not available for CronJobs.

KeyTypeDefaultDescription
route.enabledboolfalseCreate an OpenShift Route
route.hoststringCustom hostname
route.pathstring/Path prefix
route.targetPortstringNamed port on the Service
route.tls.enabledboolautoAuto-set when TLS config is present
route.tls.terminationstringedge, passthrough, or reencrypt
route.tls.insecureEdgeTerminationPolicystringRedirect, Allow, or None
route.tls.certificatestringPEM certificate body
route.tls.keystringPEM private key body
route:
enabled: true
host: api.apps.example.com
tls:
termination: edge
insecureEdgeTerminationPolicy: Redirect

Ingress

Not available for CronJobs.

KeyTypeDefaultDescription
ingress.enabledboolfalseCreate an Ingress
ingress.*Any standard Ingress spec keys (className, hosts, tls, etc.)
ingress:
enabled: true
className: nginx
hosts:
- host: api.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: api-tls
hosts:
- api.example.com

Ports, env, and resources

KeyTypeDescription
portslistContainer port definitions
envlistEnvironment variables (name/value or valueFrom)
envFromlistLoad all keys from a ConfigMap or Secret
resourcesobjectCPU and memory requests and limits
ports:
- name: http
containerPort: 8080
protocol: TCP

env:
- name: LOG_LEVEL
value: info
- name: DB_URL
valueFrom:
secretKeyRef:
name: db-secret
key: url

envFrom:
- configMapRef:
name: my-config

resources:
requests:
cpu: 100m
memory: 128Mi
limits:
memory: 256Mi
cpu: 200m

Command and args

KeyTypeDescription
commandlistOverride the container entrypoint
argslistOverride the container command arguments
command: ["python", "-m", "myapp"]
args: ["--port", "8080"]

Health probes

Not available for CronJobs. Each probe requires enabled: true to be rendered by the template.

livenessProbe:
enabled: true
httpGet:
path: /healthz
port: http
initialDelaySeconds: 10
periodSeconds: 10

readinessProbe:
enabled: true
httpGet:
path: /ready
port: http
initialDelaySeconds: 5
periodSeconds: 5

startupProbe:
enabled: true
httpGet:
path: /healthz
port: http
failureThreshold: 30
periodSeconds: 10

Labels and annotations

KeyTypeDescription
labelsobjectExtra labels on the workload resource (Deployment / StatefulSet / CronJob)
podLabelsobjectExtra labels on Pods
annotationsobjectExtra annotations on the workload resource
podAnnotationsobjectExtra annotations on Pods
labels:
tier: backend
annotations:
kubernetes.io/change-cause: "initial deployment"
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"

Security context

KeyTypeDescription
podSecurityContextobjectPod-level security context
securityContextobjectContainer-level security context
podSecurityContext:
runAsNonRoot: true
runAsUser: 1000

securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true

Volumes and mounts

KeyTypeDescription
extraVolumeslistVolumes to attach (PVC, ConfigMap, or Secret)
volumeMountslistWhere to mount volumes inside the container
extraVolumes:
- name: data
persistentVolumeClaim:
claimName: my-pvc
- name: config
configMap:
name: my-config
- name: creds
secret:
secretName: my-secret

volumeMounts:
- name: data
mountPath: /data
- name: config
mountPath: /etc/config
subPath: app.conf

Scheduling

KeyTypeDefaultDescription
nodeSelectorobjectNode label selector
tolerationslistPod tolerations
affinityobjectNode or pod affinity rules
terminationGracePeriodSecondsnumber30Grace period before a Pod is force-killed

Sidecars and init containers

KeyTypeDescription
sidecarslistAdditional containers in the Pod (same spec as containers[])
initContainerslistInit containers run before the main container
initContainers:
- name: migrate
image: my-org/migrate:1.0.0
command: ["./migrate", "up"]

sidecars:
- name: proxy
image: envoyproxy/envoy:v1.29.0

StatefulSet-specific

Only applicable for workloads in statefulsets[].

KeyTypeDescription
serviceNamestringGoverning Service name (defaults to workload name)
podManagementPolicystringOrderedReady (default) or Parallel
updateStrategyobjecte.g. {type: RollingUpdate}
volumeClaimTemplateslistPVC templates — one PVC is created per Pod
statefulsets:
- name: my-db
image:
repository: postgres
tag: "15"
podManagementPolicy: Parallel
updateStrategy:
type: RollingUpdate
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ReadWriteOnce]
resources:
requests:
storage: 10Gi

Autoscaling (HPA)

Deployment only.

KeyTypeDescription
autoscaling.enabledboolCreate an HPA
autoscaling.minReplicasnumberMinimum replicas
autoscaling.maxReplicasnumberMaximum replicas
autoscaling.metricslistHPA metric sources
autoscaling.behaviorobjectScale-up / scale-down behavior
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70

When HPA is enabled, replicaCount is not set in the Deployment spec (the HPA controls it).


KEDA

Deployment: keda.scaledObject. CronJob: keda.scaledJob.

# Deployment — ScaledObject
keda:
scaledObject:
enabled: true
minReplicaCount: 0
maxReplicaCount: 10
pollingInterval: 30
triggers:
- type: kafka
metadata:
bootstrapServers: kafka:9092
topic: my-topic
lagThreshold: "10"

# CronJob — ScaledJob
keda:
scaledJob:
enabled: true
maxReplicaCount: 10
triggers:
- type: rabbitmq
metadata:
queueName: my-queue

Pod Disruption Budget

Deployment and StatefulSet only. Set minAvailable or maxUnavailable, not both.

KeyTypeDescription
podDisruptionBudget.enabledboolCreate a PDB
podDisruptionBudget.minAvailablestring/numberMin available pods, e.g. 1 or "50%"
podDisruptionBudget.maxUnavailablestring/numberMax unavailable pods, e.g. 1 or "25%"
podDisruptionBudget:
enabled: true
minAvailable: 1

Certificate (cert-manager)

Deployment and StatefulSet only.

KeyTypeDefaultDescription
certificate.enabledboolCreate a cert-manager Certificate
certificate.secretNamestring<name>-tlsSecret to store the issued certificate
certificate.durationstring2160hCertificate lifetime
certificate.renewBeforestring360hRenew this long before expiry
certificate.dnsNameslistDNS names to include on the certificate
certificate.issuerRef.namestringIssuer or ClusterIssuer name
certificate.issuerRef.kindstringClusterIssuerClusterIssuer or Issuer
certificate.issuerRef.groupstringcert-manager.ioIssuer API group
certificate:
enabled: true
dnsNames:
- api.example.com
issuerRef:
name: letsencrypt-prod

Global options

These keys sit at the top level of values.yaml, outside any workload list.

serviceAccount

KeyTypeDefaultDescription
serviceAccount.createbooltrueCreate a ServiceAccount
serviceAccount.namestringrelease nameServiceAccount name. Defaults to the Helm release name.

Omit entirely to use the defaults (ServiceAccount created, named after the release).


rbac

KeyTypeDescription
rbac.createboolCreate a Role + RoleBinding for the ServiceAccount
rbac.ruleslistRBAC policy rules
rbac:
create: true
rules:
- apiGroups: [""]
resources: [pods, configmaps]
verbs: [get, list, watch]

imagePullSecrets

imagePullSecrets:
- name: my-registry-secret

configMaps

configMaps:
- name: my-config
data:
APP_ENV: production
LOG_LEVEL: info

secrets

caution

Plain Secrets are stored unencrypted in etcd. If you need to commit them to Git, use Sealed Secrets instead.

secrets:
- name: my-secret
stringData:
DB_URL: postgres://user:pass@host/db
API_KEY: secret123

Any key accepted by the Kubernetes Secret spec can be included (e.g. type, data, stringData).


sealedSecrets

Requires the Sealed Secrets controller.

sealedSecrets:
- name: my-sealed-secret
encryptedData:
MY_SECRET: AgBy3i4OJSWK...

persistentVolumeClaims

KeyTypeDefaultDescription
namestringPVC name
sizestringStorage size, e.g. 10Gi
storageClassNamestringStorage class name
accessModeslist[ReadWriteOnce]Access modes
persistentVolumeClaims:
- name: my-data
size: 10Gi
storageClassName: thin-csi
accessModes:
- ReadWriteOnce

persistentVolumes

PersistentVolumes rendered with the release. Note: this chart uses size (not capacity.storage) as a shorthand field:

persistentVolumes:
- name: my-pv
size: 10Gi
accessModes:
- ReadWriteOnce
reclaimPolicy: Retain
storageClassName: thin-csi

extraManifests

Any additional Kubernetes manifests rendered alongside the release:

extraManifests:
- apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-ingress
spec:
podSelector: {}
ingress:
- {}