The chart told operators that adding a duplicate env name to an installed release makes the next upgrade fail in the API server, quoting "The order in patch list ... doesn't match $setElementOrder list". Measured against helm 3.19.0 and Kubernetes 1.35, it does not fail: the upgrade succeeds, helm prints "Release has been upgraded", and Kubernetes merges the env list by name, so the duplicate pair collapses to the chart's own entry and the operator's override is discarded without a word. At install time the same values behave differently - both entries reach the pod, the later one wins, and the API server says so with "hides previous definition of ..., which may be dropped when using apply". The advice that followed from the old claim survives - such a switch only takes at install time - but the stated reason was wrong in the dangerous direction. A reader who expects a loud failure treats a green upgrade as proof the override took effect, and green is exactly what a silently dropped override looks like. The text now names the real failure mode and tells the reader to read the value back off the Deployment. README carries the same correction, because every chart in this repo offers the same additive env block. Also records what the earlier measurement left open. With the database scaled back up the pod returns to Ready on its own after about five seconds, restart count still 0, so leaving the liveness group untouched costs no manual recovery. And the limit of that signal belongs next to it: the db indicator validates a connection, not the schema, so a database that came back empty still put the pod back to Ready with /actuator/health at 200.
122 lines
4.9 KiB
YAML
122 lines
4.9 KiB
YAML
# Scale the whole chart down without uninstalling it: scaleDown: true renders
|
|
# every Deployment/StatefulSet with replicas: 0 (and suspends CronJobs) and
|
|
# takes precedence over any per-workload replicas value. PVCs, Secrets and
|
|
# Services stay in place; scaleDown: false brings the workloads back up.
|
|
scaleDown: false
|
|
|
|
secrets:
|
|
databaseSecretRef: null
|
|
oidcSecretRef: null
|
|
|
|
ingress:
|
|
enabled: true
|
|
clusterIssuer: null
|
|
domain: null
|
|
className: nginx
|
|
# Extra annotations for the Ingress; merged with the cert-manager
|
|
# cluster-issuer annotation the chart always sets.
|
|
annotations: {}
|
|
|
|
urlaubsverwaltung:
|
|
# Replica count for this workload; 0 is allowed and scales it down.
|
|
# The chart-global scaleDown flag takes precedence.
|
|
replicas: 1
|
|
# The official image is built with Cloud Native Buildpacks and runs as the
|
|
# non-root cnb user (uid 1002, gid 1001). /tmp is a writable emptyDir for
|
|
# the JVM's temp/work files.
|
|
securityContext:
|
|
pod:
|
|
runAsNonRoot: true
|
|
runAsUser: 1002
|
|
runAsGroup: 1001
|
|
# RuntimeDefault applies the container runtime's default seccomp filter,
|
|
# which blocks the syscalls a normal workload never makes. It sits in the
|
|
# pod context on purpose: from here it covers every container in the pod
|
|
# including init containers, while a container-level seccompProfile would
|
|
# have to be repeated for each one (and silently missed on the next one
|
|
# added). A container that genuinely needs a different filter can still
|
|
# override it under securityContext.container, which wins over this value.
|
|
seccompProfile:
|
|
type: RuntimeDefault
|
|
container:
|
|
allowPrivilegeEscalation: false
|
|
readOnlyRootFilesystem: true
|
|
runAsNonRoot: true
|
|
capabilities:
|
|
drop:
|
|
- ALL
|
|
# HEALTH INDICATORS — TWO SETTINGS THE CHART FIXES IN THE TEMPLATE
|
|
#
|
|
# The chart sets these two as plain environment variables, not as values,
|
|
# because urlaubsverwaltung.env below already overrides anything:
|
|
#
|
|
# MANAGEMENT_ENDPOINT_HEALTH_GROUP_READINESS_INCLUDE=readinessState,db
|
|
# puts the datasource into the readiness group, so a database outage
|
|
# takes the pod out of Ready instead of leaving it serving errors (#218).
|
|
# The liveness group stays untouched on purpose — an outage must keep
|
|
# traffic away, not restart the pod in a loop.
|
|
# MANAGEMENT_HEALTH_MAIL_ENABLED=false
|
|
# removes the mail indicator, which otherwise pins the aggregate
|
|
# /actuator/health at 503 DOWN forever, because the chart's mail wiring
|
|
# points at localhost:1025 where nothing listens (#217).
|
|
#
|
|
# THE CONSEQUENCE TO KNOW BEFORE IT BITES: whoever later configures real mail
|
|
# delivery (SPRING_MAIL_HOST/SPRING_MAIL_PORT via urlaubsverwaltung.env) MUST
|
|
# switch the indicator back on in the same change:
|
|
#
|
|
# env:
|
|
# - name: MANAGEMENT_HEALTH_MAIL_ENABLED
|
|
# value: "true"
|
|
#
|
|
# Left at false, /actuator/health keeps answering 200 while the configured
|
|
# mail server is unreachable and no notification mail is delivered. The
|
|
# setting trades a permanently false alarm for silence, and silence is only
|
|
# correct as long as there is nothing to report about.
|
|
#
|
|
# That override repeats a name the chart already sets, and env is additive, so
|
|
# it renders the variable twice. At INSTALL time both entries reach the pod and
|
|
# the later one — yours — wins in the container. Added to an ALREADY INSTALLED
|
|
# release it is lost instead: Kubernetes merges env by name, the pair collapses
|
|
# to the chart's own entry, and helm still reports a successful upgrade. The
|
|
# override does not fail loudly, it fails silently. See the "env IS ADDITIVE
|
|
# ONLY" section of NOTES.txt — the switch has to go in at install time, and
|
|
# after any such change the result belongs verified on the live Deployment.
|
|
livenessProbe:
|
|
httpGet:
|
|
port: 8080
|
|
path: /actuator/health/liveness
|
|
periodSeconds: 10
|
|
failureThreshold: 3
|
|
successThreshold: 1
|
|
timeoutSeconds: 5
|
|
readinessProbe:
|
|
httpGet:
|
|
port: 8080
|
|
path: /actuator/health/readiness
|
|
periodSeconds: 5
|
|
failureThreshold: 3
|
|
successThreshold: 1
|
|
timeoutSeconds: 5
|
|
# The startup probe gates liveness/readiness. Spring Boot startup
|
|
# (JVM + Liquibase migrations) gets a budget of 10s * 30 = 300s.
|
|
startupProbe:
|
|
httpGet:
|
|
port: 8080
|
|
path: /actuator/health/liveness
|
|
periodSeconds: 10
|
|
failureThreshold: 30
|
|
timeoutSeconds: 5
|
|
# Extra environment variables, appended to the ones the chart always sets.
|
|
# Values are rendered through tpl; value, secretKeyRef and configMapKeyRef
|
|
# forms are supported.
|
|
env: []
|
|
resources:
|
|
# Limits are optional: memory and ephemeral-storage limits default to
|
|
# limitFactor x the request, an explicitly set limit always wins, and a
|
|
# CPU limit is only set when configured explicitly under "limits".
|
|
limitFactor: 3
|
|
requests:
|
|
cpu: 0.1
|
|
memory: 768Mi
|
|
ephemeralStorage: 10Mi
|