Rendered into a ConfigMap and mounted at /etc/bouine/config.yaml.
Key
Default
Description
config.listen.http
":80"
HTTP listener
config.listen.https
":443"
HTTPS listener. Set to "" to disable the TLS plane (e.g. when TLS terminates at an upstream proxy/LB) — the chart then drops the StatefulSet containerPort, the data-plane Service port, and the NetworkPolicy rule with it
config.listen.admin
":9000"
Admin API listener
config.listen.cluster
":8443"
Gossip cluster port
config.listen.max_connections
4096
Cap on simultaneously open data-plane connections. Under HTTP/1.1 a parked handler holds its connection, so this bounds the in-flight pile a slow origin can cause; over-limit connections get 503 + close at accept. Production / HA values: 8192 / 16384.
config.listen.read_timeout
30s
Per-request header/body read bound — the slowloris defense (since v0.5.9). Raise it for slow mobile clients or large uploads
config.tls.certs
[]
TLS certificate list; mount via Secret
config.storage.hot_max_bytes
2GiB
RAM cache size
config.storage.warm_dir
/var/lib/bouine
Warm-tier mmap directory
config.storage.warm_max_bytes
20GiB
Warm-tier size limit
config.cluster.join
[]
Seed addresses (auto-populated from headless Service DNS)
The chart renders three Services: a data-plane Service, a dedicated admin Service, and a headless Service for gossip peer discovery.
The dedicated admin Service (ClusterIP by default) splits the admin plane (metrics, pprof, /drain, admin API) off the data-plane Service — so exposing the data plane via LoadBalancer can never expose the admin surface. Prometheus ServiceMonitors scrape via the admin Service (label bouine-cache.io/plane: management).
Key
Default
Description
service.type
ClusterIP
Kubernetes Service type
service.httpPort
80
HTTP port
service.httpsPort
443
HTTPS port
service.adminPort
9000
Admin port (exposed on the admin Service)
service.annotations
{}
Annotations on the data-plane Service
service.labels
{}
Extra labels on the data-plane Service
service.loadBalancerSourceRanges
[]
Restrict ingress CIDRs when type: LoadBalancer
service.externalTrafficPolicy
""
Local preserves the client source IP and avoids a second node hop (recommended for type: LoadBalancer)
Spreads pods across availability zones and hosts (ScheduleAnyway)
podAnnotations / podLabels
{}
Pod metadata
statefulsetAnnotations / statefulsetLabels
{}
StatefulSet metadata (wins over commonLabels on key collision)
affinity
{}
Affinity rules (explicit affinity takes precedence over topology spread)
nodeSelector
{}
Node selector
tolerations
[]
Tolerations
priorityClassName
""
Pod priority class
dnsPolicy / dnsConfig
"" / {}
DNS policy/config overrides
podManagementPolicy
Parallel
Parallel pod start (correct for strong-mode gossip join); rolls one pod at a time
updateStrategy.type
RollingUpdate
StatefulSet update strategy
updateStrategy.rollingUpdate
{}
Raw Kubernetes values passed through to the StatefulSet rollingUpdate (e.g. maxUnavailable, partition). Since v0.5.26 the chart emits an empty object by default and passes overrides through verbatim — previously it rendered the beta maxUnavailable field that GKE versions silently drop, causing permanent Argo CD drift. Existing overrides move maxUnavailable and partition under updateStrategy.rollingUpdate.
minReadySeconds
30
Seconds a pod must be ready before entering Service endpoints — lets the cluster ring converge
GitOps note. With autoscaling.enabled: true the StatefulSet does
not render spec.replicas — the HPA owns the replica count. ArgoCD
users should add an ignoreDifferences entry for /spec/replicas on
the StatefulSet to stop perpetual drift.