Skip to content

Helm Values Reference

Complete reference for all Helm chart configuration values.

The OptiPod Helm chart provides extensive configuration options for customizing the deployment. This reference documents all available values with their defaults, types, and descriptions.

Terminal window
helm install optipod charts/optipod \
--namespace optipod-system \
--create-namespace \
--values custom-values.yaml

Override the chart name.

Type: string Default: ""

Example:

nameOverride: "my-optipod"

Override the full resource names.

Type: string Default: ""

Example:

fullnameOverride: "optipod-prod"

Override the namespace for all resources.

Type: string Default: "" (uses release namespace)

Example:

namespaceOverride: "custom-namespace"

Container image repository.

Type: string Default: "ghcr.io/sagart-cactus/optipod"

Example:

image:
repository: "my-registry.io/optipod"

Image pull policy.

Type: string Default: "IfNotPresent" Options: Always, IfNotPresent, Never

Example:

image:
pullPolicy: Always

Image tag to use.

Type: string Default: "" (uses Chart.appVersion)

Example:

image:
tag: "v1.5.3"

Secrets for pulling images from private registries.

Type: array Default: []

Example:

imagePullSecrets:
- name: my-registry-secret

Create a service account.

Type: boolean Default: true

Example:

serviceAccount:
create: true

Annotations for the service account.

Type: object Default: {}

Example:

serviceAccount:
annotations:
eks.amazonaws.com/role-arn: "arn:aws:iam::123456789:role/optipod"

Service account name to use.

Type: string Default: "" (auto-generated)

Example:

serviceAccount:
name: "optipod-sa"

Create RBAC resources.

Type: boolean Default: true

Example:

rbac:
create: true

Number of controller replicas.

Type: integer Default: 1

Example:

controller:
replicaCount: 1

Note: Controller uses leader election, so only one replica is active at a time.

Deployment strategy for controller.

Type: object Default:

strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1

Port configuration for controller.

Type: object Default:

ports:
health: 8081
metrics: 8080

Enable dry-run mode (no actual changes).

Type: boolean Default: false

Example:

controller:
dryRun: true

Use case: Testing without applying changes.

Enable leader election for high availability.

Type: boolean Default: true

Example:

controller:
leaderElect: true

Default reconciliation interval for policies.

Type: string (duration) Default: "5m"

Example:

controller:
reconciliationInterval: "10m"

Enable HTTP/2 for controller.

Type: boolean Default: false

Example:

controller:
enableHTTP2: false

Priority class for controller pods.

Type: string Default: ""

Example:

controller:
priorityClassName: "system-cluster-critical"

Grace period for pod termination.

Type: integer Default: 30

Example:

controller:
terminationGracePeriodSeconds: 60

DNS policy for controller pods.

Type: string Default: "" (uses cluster default) Options: ClusterFirst, ClusterFirstWithHostNet, Default, None

Example:

controller:
dnsPolicy: "ClusterFirst"

Topology spread constraints for controller pods.

Type: array Default: []

Example:

controller:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: topology.kubernetes.io/zone
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
app.kubernetes.io/component: controller

Resource requests and limits for controller.

Type: object Default:

resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi

Example:

controller:
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi

Node selector for controller pods.

Type: object Default: {}

Example:

controller:
nodeSelector:
node-role.kubernetes.io/control-plane: ""

Tolerations for controller pods.

Type: array Default: []

Example:

controller:
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"

Affinity rules for controller pods.

Type: object Default: {}

Example:

controller:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: Exists

Annotations for controller pods.

Type: object Default: {}

Example:

controller:
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"

Security context for controller pods.

Type: object Default:

podSecurityContext:
runAsNonRoot: true
runAsUser: 65532
fsGroup: 65532

Security context for controller container.

Type: object Default:

securityContext:
allowPrivilegeEscalation: false
capabilities:
drop:
- ALL
readOnlyRootFilesystem: true

Liveness probe configuration.

Type: object Default:

livenessProbe:
httpGet:
path: /healthz
port: 8081
initialDelaySeconds: 15
periodSeconds: 20

Readiness probe configuration.

Type: object Default:

readinessProbe:
httpGet:
path: /readyz
port: 8081
initialDelaySeconds: 5
periodSeconds: 10

Enable the mutating webhook.

Type: boolean Default: true

Example:

webhook:
enabled: true

Note: Requires cert-manager for certificate management.

Webhook server port.

Type: integer Default: 9443

Example:

webhook:
port: 9443

Port configuration for webhook metrics and health.

Type: object Default:

ports:
health: 8081
metrics: 8080

Certificate directory for webhook TLS.

Type: string Default: "/tmp/k8s-webhook-server/serving-certs"

Example:

webhook:
certDir: "/tmp/k8s-webhook-server/serving-certs"

Webhook failure policy.

Type: string Default: "Ignore" Options: Ignore, Fail

Values:

  • Ignore - Allow pod creation even if webhook fails (recommended for initial setup)
  • Fail - Block pod creation if webhook fails (stricter enforcement)

Example:

webhook:
failurePolicy: Ignore

Webhook timeout in seconds.

Type: integer Default: 10

Example:

webhook:
timeoutSeconds: 10

Namespace selector for webhook.

Type: object Default:

namespaceSelector:
matchExpressions:
- key: name
operator: NotIn
values: ["kube-system", "kube-public", "kube-node-lease"]
- key: control-plane
operator: DoesNotExist

Example:

webhook:
namespaceSelector:
matchLabels:
optipod-webhook: "enabled"

Object selector for webhook.

Type: object Default: {}

Note: Kubernetes objectSelector only supports label matching, not annotations. OptiPod filters by annotations in webhook code.

Webhook service configuration.

Type: object Default:

service:
type: ClusterIP
port: 443
targetPort: 9443

Number of webhook replicas.

Type: integer Default: 2

Example:

webhook:
deployment:
replicaCount: 3

Recommendation: Use 2+ replicas for high availability.

Deployment strategy for webhook.

Type: object Default:

strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 0
maxSurge: 1

Resource requests and limits for webhook.

Type: object Default:

resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 50m
memory: 64Mi

Affinity rules for webhook pods.

Type: object Default:

affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app.kubernetes.io/component
operator: In
values:
- webhook
topologyKey: kubernetes.io/hostname

Note: Default affinity spreads webhook pods across nodes for high availability.

Enable Pod Disruption Budget for webhook.

Type: boolean Default: true

Example:

webhook:
pdb:
enabled: true

Minimum available webhook pods.

Type: integer Default: 1

Example:

webhook:
pdb:
minAvailable: 1

Enable network policy for webhook.

Type: boolean Default: true

Example:

webhook:
networkPolicy:
enabled: true

Ingress rules for webhook network policy.

Type: array Default:

ingress:
- from:
- namespaceSelector: {}
ports:
- protocol: TCP
port: 9443

Install cert-manager as a subchart.

Type: boolean Default: true

Values:

  • true - Install cert-manager with OptiPod
  • false - Use existing cert-manager in cluster

Example:

certManager:
install: false # Use existing cert-manager

Install cert-manager CRDs.

Type: boolean Default: true

Note: Only used if certManager.install is true.

Issuer type.

Type: string Default: "Issuer" Options: Issuer, ClusterIssuer

Example:

certManager:
issuer:
kind: ClusterIssuer

Issuer name.

Type: string Default: "optipod-selfsigned-issuer"

Example:

certManager:
issuer:
name: "my-issuer"

Use self-signed issuer.

Type: boolean Default: true

Example:

certManager:
issuer:
selfSigned: true

Secret name for webhook certificate.

Type: string Default: "webhook-server-certs"

Example:

certManager:
certificate:
secretName: "optipod-webhook-certs" # pragma: allowlist secret

Certificate duration.

Type: string (duration) Default: "8760h" (1 year)

Example:

certManager:
certificate:
duration: "4380h" # 6 months

Renew certificate before expiry.

Type: string (duration) Default: "720h" (30 days)

Example:

certManager:
certificate:
renewBefore: "1440h" # 60 days

Private key configuration.

Type: object Default:

privateKey:
algorithm: RSA
size: 2048

Enable metrics endpoint.

Type: boolean Default: true

Example:

metrics:
enabled: true

Enable TLS for metrics endpoint.

Type: boolean Default: true

Example:

metrics:
secure: true

Enable Prometheus ServiceMonitor.

Type: boolean Default: false

Example:

metrics:
serviceMonitor:
enabled: true

Note: Requires Prometheus Operator.

Scrape interval for ServiceMonitor.

Type: string (duration) Default: "30s"

Example:

metrics:
serviceMonitor:
interval: "15s"

Scrape timeout for ServiceMonitor.

Type: string (duration) Default: "10s"

Example:

metrics:
serviceMonitor:
scrapeTimeout: "5s"

Metrics provider type.

Type: string Default: "metrics-server" Options: metrics-server, prometheus

Example:

metricsProvider:
type: "prometheus"

Prometheus server URL.

Type: string Default: "http://prometheus:9090"

Example:

metricsProvider:
prometheus:
url: "http://prometheus-server.monitoring:9090"

Prometheus authentication type.

Type: string Default: "none" Options: none, basic, bearer

Example:

metricsProvider:
prometheus:
auth:
type: "basic"

Basic authentication configuration.

Type: object Default:

basic:
username: ""
password: ""
existingSecret:
name: ""
usernameKey: "username"
passwordKey: "password" # pragma: allowlist secret

Example:

metricsProvider:
prometheus:
auth:
type: "basic"
basic:
existingSecret:
name: "prometheus-auth"
usernameKey: "username"
passwordKey: "password" # pragma: allowlist secret

Bearer token authentication configuration.

Type: object Default:

bearer:
token: ""
existingSecret:
name: ""
key: "token"

Example:

metricsProvider:
prometheus:
auth:
type: "bearer"
bearer:
existingSecret:
name: "prometheus-token"
key: "token"

TLS configuration for Prometheus.

Type: object Default:

tls:
enabled: false
insecureSkipVerify: false
existingSecret:
name: ""
caKey: "ca.crt"
certKey: "tls.crt"
keyKey: "tls.key"

Example:

metricsProvider:
prometheus:
tls:
enabled: true
existingSecret:
name: "prometheus-tls"

HTTP client timeout for Prometheus.

Type: string (duration) Default: "30s"

Example:

metricsProvider:
prometheus:
timeout: "60s"

metricsProvider.metricsServer.samplingInterval

Section titled “metricsProvider.metricsServer.samplingInterval”

Background sampling interval for metrics-server.

Type: string (duration) Default: "5m"

Example:

metricsProvider:
metricsServer:
samplingInterval: "10m"

metricsProvider.metricsServer.maxSamplesPerTarget

Section titled “metricsProvider.metricsServer.maxSamplesPerTarget”

Maximum samples to cache per target.

Type: integer Default: 2880

Example:

metricsProvider:
metricsServer:
maxSamplesPerTarget: 5000

metricsProvider.metricsServer.minSamplesRequired

Section titled “metricsProvider.metricsServer.minSamplesRequired”

Minimum samples required for recommendations.

Type: integer Default: 10

Example:

metricsProvider:
metricsServer:
minSamplesRequired: 20

Target eviction TTL.

Type: string (duration) Default: "15m"

Example:

metricsProvider:
metricsServer:
targetTTL: "30m"

Log level.

Type: string Default: "info" Options: debug, info, warn, error

Example:

logging:
level: "debug"

Log format.

Type: string Default: "json" Options: json, console

Example:

logging:
format: "console"

Additional volumes for controller.

Type: array Default: []

Example:

extraVolumes:
- name: config
configMap:
name: optipod-config

Additional volume mounts for controller.

Type: array Default: []

Example:

extraVolumeMounts:
- name: config
mountPath: /etc/optipod
readOnly: true

Additional environment variables for controller.

Type: array Default: []

Example:

extraEnv:
- name: CUSTOM_VAR
value: "custom-value"
- name: SECRET_VAR
valueFrom:
secretKeyRef:
name: my-secret
key: secret-key
# Minimal setup with defaults
controller:
replicaCount: 1
webhook:
enabled: true
metricsProvider:
type: "metrics-server"
# Production setup with HA and monitoring
controller:
replicaCount: 1
resources:
limits:
cpu: 1000m
memory: 1Gi
requests:
cpu: 200m
memory: 256Mi
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: Exists
webhook:
enabled: true
deployment:
replicaCount: 3
resources:
limits:
cpu: 500m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi
pdb:
enabled: true
minAvailable: 2
metrics:
serviceMonitor:
enabled: true
metricsProvider:
type: "prometheus"
prometheus:
url: "http://prometheus-server.monitoring:9090"
auth:
type: "basic"
basic:
existingSecret:
name: "prometheus-auth"
logging:
level: "info"
format: "json"
# GitOps-friendly setup
webhook:
enabled: true
failurePolicy: Ignore
deployment:
replicaCount: 2
metricsProvider:
type: "prometheus"
prometheus:
url: "http://prometheus:9090"
certManager:
install: false # Use existing cert-manager
# Development setup
controller:
dryRun: true
resources:
limits:
cpu: 200m
memory: 256Mi
requests:
cpu: 50m
memory: 64Mi
webhook:
enabled: false
metricsProvider:
type: "metrics-server"
logging:
level: "debug"
format: "console"