diff --git a/helm/flowfuse/README.md b/helm/flowfuse/README.md index f460d76b..a99ac035 100644 --- a/helm/flowfuse/README.md +++ b/helm/flowfuse/README.md @@ -67,6 +67,9 @@ For other values please refer to the documentation below. - `forge.revisionHistoryLimit` global default for number of old ReplicaSets/ControllerRevisions to retain for rollback across all Deployments and StatefulSets managed by this chart (default `10`). Can be overridden per component. - `forge.tolerations` allows to configure [tolerations](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) for the core application deployment (default `[]`) - `forge.priorityClassName` allows to set [priorityClassName](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/) for all deployments created by this Helm chart (default not set) + - `forge.podDisruptionBudget.enabled` enables a [PodDisruptionBudget](https://kubernetes.io/docs/tasks/run-application/configure-pdb/) for the core application deployment (default `false`) + - `forge.podDisruptionBudget.minAvailable` minimum number/percentage of pods that must remain available during voluntary disruption (default `1`). Mutually exclusive with `maxUnavailable`. + - `forge.podDisruptionBudget.maxUnavailable` maximum number/percentage of pods unavailable during voluntary disruption (default not set). Mutually exclusive with `minAvailable`. - `forge.service.type` allows to set the service type for the core application service (default `ClusterIP`) - `forge.service.nodePort` allows to set custom nodePort value when `forge.service.type` value is set to `NodePort` (default not set) - `forge.logging.level` sets logging level for the Forge app (default: `info` from "info", "error", "debug", "warn", "trace", "fatal") diff --git a/helm/flowfuse/templates/pdb.yaml b/helm/flowfuse/templates/pdb.yaml new file mode 100644 index 00000000..85a5597a --- /dev/null +++ b/helm/flowfuse/templates/pdb.yaml @@ -0,0 +1,22 @@ +{{- if .Values.forge.podDisruptionBudget.enabled }} +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: flowfuse + namespace: {{ .Release.Namespace }} + labels: + {{- include "forge.labels" . | nindent 4 }} + {{- with .Values.forge.labels }} + {{- toYaml . | nindent 4 }} + {{- end }} +spec: + {{- if .Values.forge.podDisruptionBudget.minAvailable }} + minAvailable: {{ .Values.forge.podDisruptionBudget.minAvailable }} + {{- end }} + {{- if .Values.forge.podDisruptionBudget.maxUnavailable }} + maxUnavailable: {{ .Values.forge.podDisruptionBudget.maxUnavailable }} + {{- end }} + selector: + matchLabels: + {{- include "forge.forgeSelectorLabels" . | nindent 6 }} +{{- end }} diff --git a/helm/flowfuse/tests/pdb_test.yaml b/helm/flowfuse/tests/pdb_test.yaml new file mode 100644 index 00000000..a68a2396 --- /dev/null +++ b/helm/flowfuse/tests/pdb_test.yaml @@ -0,0 +1,42 @@ +# yaml-language-server: $schema=https://raw.githubusercontent.com/helm-unittest/helm-unittest/main/schema/helm-testsuite.json +suite: test forge PodDisruptionBudget +templates: + - pdb.yaml +set: + forge.domain: "chart-unit-tests.com" +tests: + - it: should not render PDB by default + asserts: + - hasDocuments: + count: 0 + + - it: should render PDB when enabled with minAvailable + set: + forge.podDisruptionBudget.enabled: true + asserts: + - isKind: + of: PodDisruptionBudget + - equal: + path: metadata.name + value: flowfuse + - equal: + path: spec.minAvailable + value: 1 + - notExists: + path: spec.maxUnavailable + - equal: + path: spec.selector.matchLabels.app + value: flowforge + + - it: should render maxUnavailable when set + set: + forge.podDisruptionBudget: + enabled: true + minAvailable: null + maxUnavailable: 1 + asserts: + - equal: + path: spec.maxUnavailable + value: 1 + - notExists: + path: spec.minAvailable diff --git a/helm/flowfuse/values.schema.json b/helm/flowfuse/values.schema.json index 29fa8949..34f54feb 100644 --- a/helm/flowfuse/values.schema.json +++ b/helm/flowfuse/values.schema.json @@ -839,6 +839,20 @@ "tolerations": { "type": "array" }, + "podDisruptionBudget": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean" + }, + "minAvailable": { + "type": ["integer", "string"] + }, + "maxUnavailable": { + "type": ["integer", "string"] + } + } + }, "logPassthrough": { "type": "boolean" }, diff --git a/helm/flowfuse/values.yaml b/helm/flowfuse/values.yaml index e6c08e53..cbdec92a 100644 --- a/helm/flowfuse/values.yaml +++ b/helm/flowfuse/values.yaml @@ -135,6 +135,11 @@ forge: priorityClassName: "" + podDisruptionBudget: + enabled: false + minAvailable: 1 + # maxUnavailable: 1 # set instead of minAvailable (mutually exclusive) + logPassthrough: false customHostname: enabled: false