From 3d2ce471d6d6981fe20f7fc7356bd3ea7837848e Mon Sep 17 00:00:00 2001 From: Sam McBroom Date: Wed, 15 Jan 2025 15:06:37 -0800 Subject: [PATCH] Add ability to configure StatefulSet PVC retention policy Signed-off-by: Sam McBroom --- CHANGELOG.md | 1 + README.md | 4 ++++ .../alertmanager-statefulset.yaml | 6 +++++ .../compactor/compactor-statefulset.yaml | 6 +++++ templates/ingester/ingester-statefulset.yaml | 6 +++++ .../store-gateway-statefulset.yaml | 6 +++++ values.yaml | 24 +++++++++++++++++++ 7 files changed, 53 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 764a8c98..a1f05c4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ * [CHANGE] Updated default `align_queries_with_step` to **false** to match documentation #513 * [ENHANCEMENT] Add `nginx.config.upstream_protocol` field to configure the upstream protocol in the nginx configuration #506 +* [ENHANCEMENT] Add ability to set `persistentVolumeClaimRetentionPolicy` on alertmanager, ingester, compactor, and store-gateway StatefulSets #517 * [BUGFIX] fix: upstream_protocol reference in auth_orgs #509 * [DEPENDENCY] Update quay.io/cortexproject/cortex Docker tag to v1.18.1 #510 diff --git a/README.md b/README.md index 335cc41a..fd324089 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,7 @@ Kubernetes: `^1.19.0-0` | alertmanager.​persistentVolume.​accessModes | list | `["ReadWriteOnce"]` | Alertmanager data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ | | alertmanager.​persistentVolume.​annotations | object | `{}` | Alertmanager data Persistent Volume Claim annotations | | alertmanager.​persistentVolume.​enabled | bool | `true` | If true and alertmanager.statefulSet.enabled is true, Alertmanager will create/use a Persistent Volume Claim If false, use emptyDir | +| alertmanager.​persistentVolume.​retentionPolicy | object | `{}` | StatefulSetAutoDeletePVC feature https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention | | alertmanager.​persistentVolume.​size | string | `"2Gi"` | Alertmanager data Persistent Volume size | | alertmanager.​persistentVolume.​storageClass | string | `nil` | Alertmanager data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | | alertmanager.​persistentVolume.​subPath | string | `""` | Subdirectory of Alertmanager data Persistent Volume to mount Useful if the volume's root directory is not empty | @@ -184,6 +185,7 @@ Kubernetes: `^1.19.0-0` | compactor.​persistentVolume.​accessModes | list | `["ReadWriteOnce"]` | compactor data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ | | compactor.​persistentVolume.​annotations | object | `{}` | compactor data Persistent Volume Claim annotations | | compactor.​persistentVolume.​enabled | bool | `true` | If true compactor will create/use a Persistent Volume Claim If false, use emptyDir | +| compactor.​persistentVolume.​retentionPolicy | object | `{}` | StatefulSetAutoDeletePVC feature https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention | | compactor.​persistentVolume.​size | string | `"2Gi"` | | | compactor.​persistentVolume.​storageClass | string | `nil` | compactor data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | | compactor.​persistentVolume.​subPath | string | `""` | Subdirectory of compactor data Persistent Volume to mount Useful if the volume's root directory is not empty | @@ -346,6 +348,7 @@ Kubernetes: `^1.19.0-0` | ingester.​persistentVolume.​accessModes | list | `["ReadWriteOnce"]` | Ingester data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ | | ingester.​persistentVolume.​annotations | object | `{}` | Ingester data Persistent Volume Claim annotations | | ingester.​persistentVolume.​enabled | bool | `true` | If true and ingester.statefulSet.enabled is true, Ingester will create/use a Persistent Volume Claim If false, use emptyDir | +| ingester.​persistentVolume.​retentionPolicy | object | `{}` | StatefulSetAutoDeletePVC feature https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention | | ingester.​persistentVolume.​size | string | `"2Gi"` | Ingester data Persistent Volume size | | ingester.​persistentVolume.​storageClass | string | `nil` | Ingester data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | | ingester.​persistentVolume.​subPath | string | `""` | Subdirectory of Ingester data Persistent Volume to mount Useful if the volume's root directory is not empty | @@ -815,6 +818,7 @@ Kubernetes: `^1.19.0-0` | store_gateway.​persistentVolume.​accessModes | list | `["ReadWriteOnce"]` | Store-gateway data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ | | store_gateway.​persistentVolume.​annotations | object | `{}` | Store-gateway data Persistent Volume Claim annotations | | store_gateway.​persistentVolume.​enabled | bool | `true` | If true Store-gateway will create/use a Persistent Volume Claim If false, use emptyDir | +| store_gateway.​persistentVolume.​retentionPolicy | object | `{}` | StatefulSetAutoDeletePVC feature https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention | | store_gateway.​persistentVolume.​size | string | `"2Gi"` | Store-gateway data Persistent Volume size | | store_gateway.​persistentVolume.​storageClass | string | `nil` | Store-gateway data Persistent Volume Storage Class If defined, storageClassName: If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. | | store_gateway.​persistentVolume.​subPath | string | `""` | Subdirectory of Store-gateway data Persistent Volume to mount Useful if the volume's root directory is not empty | diff --git a/templates/alertmanager/alertmanager-statefulset.yaml b/templates/alertmanager/alertmanager-statefulset.yaml index 7d6c0d4e..86b331d8 100644 --- a/templates/alertmanager/alertmanager-statefulset.yaml +++ b/templates/alertmanager/alertmanager-statefulset.yaml @@ -21,6 +21,12 @@ spec: {{- toYaml .Values.alertmanager.statefulStrategy | nindent 4 }} serviceName: {{ template "cortex.fullname" . }}-alertmanager-headless {{- if .Values.alertmanager.persistentVolume.enabled }} + {{- if semverCompare ">=1.23-0" .Capabilities.KubeVersion.Version }} + {{- with .Values.alertmanager.persistentVolume.retentionPolicy }} + persistentVolumeClaimRetentionPolicy: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- end }} volumeClaimTemplates: - metadata: name: storage diff --git a/templates/compactor/compactor-statefulset.yaml b/templates/compactor/compactor-statefulset.yaml index 12578172..3969f1f6 100644 --- a/templates/compactor/compactor-statefulset.yaml +++ b/templates/compactor/compactor-statefulset.yaml @@ -18,6 +18,12 @@ spec: {{- toYaml .Values.compactor.strategy | nindent 4 }} serviceName: {{ template "cortex.fullname" . }}-compactor {{- if .Values.compactor.persistentVolume.enabled }} + {{- if semverCompare ">=1.23-0" .Capabilities.KubeVersion.Version }} + {{- with .Values.compactor.persistentVolume.retentionPolicy }} + persistentVolumeClaimRetentionPolicy: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- end }} volumeClaimTemplates: - metadata: name: storage diff --git a/templates/ingester/ingester-statefulset.yaml b/templates/ingester/ingester-statefulset.yaml index 477a6fec..b6d37ae2 100644 --- a/templates/ingester/ingester-statefulset.yaml +++ b/templates/ingester/ingester-statefulset.yaml @@ -21,6 +21,12 @@ spec: podManagementPolicy: "{{ .Values.ingester.statefulSet.podManagementPolicy }}" serviceName: {{ template "cortex.fullname" . }}-ingester-headless {{- if .Values.ingester.persistentVolume.enabled }} + {{- if semverCompare ">=1.23-0" .Capabilities.KubeVersion.Version }} + {{- with .Values.ingester.persistentVolume.retentionPolicy }} + persistentVolumeClaimRetentionPolicy: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- end }} volumeClaimTemplates: - metadata: name: storage diff --git a/templates/store-gateway/store-gateway-statefulset.yaml b/templates/store-gateway/store-gateway-statefulset.yaml index e29f519b..35746d6a 100644 --- a/templates/store-gateway/store-gateway-statefulset.yaml +++ b/templates/store-gateway/store-gateway-statefulset.yaml @@ -21,6 +21,12 @@ spec: podManagementPolicy: {{ .Values.store_gateway.podManagementPolicy | quote }} serviceName: {{ template "cortex.fullname" . }}-store-gateway-headless {{- if .Values.store_gateway.persistentVolume.enabled }} + {{- if semverCompare ">=1.23-0" .Capabilities.KubeVersion.Version }} + {{- with .Values.store_gateway.persistentVolume.retentionPolicy }} + persistentVolumeClaimRetentionPolicy: + {{- toYaml . | nindent 4 }} + {{- end }} + {{- end }} volumeClaimTemplates: - metadata: name: storage diff --git a/values.yaml b/values.yaml index aa06a49a..f6ad3132 100644 --- a/values.yaml +++ b/values.yaml @@ -217,6 +217,12 @@ alertmanager: # set, choosing the default provisioner. storageClass: null + # -- StatefulSetAutoDeletePVC feature + # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + retentionPolicy: {} + # whenDeleted: Retain + # whenScaled: Retain + startupProbe: httpGet: path: /ready @@ -543,6 +549,12 @@ ingester: # set, choosing the default provisioner. storageClass: null + # -- StatefulSetAutoDeletePVC feature + # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + retentionPolicy: {} + # whenDeleted: Retain + # whenScaled: Retain + # -- Startup/liveness probes for ingesters are not recommended. # Ref: https://cortexmetrics.io/docs/guides/running-cortex-on-kubernetes/#take-extra-care-with-ingesters startupProbe: {} @@ -1404,6 +1416,12 @@ store_gateway: # set, choosing the default provisioner. storageClass: null + # -- StatefulSetAutoDeletePVC feature + # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + retentionPolicy: {} + # whenDeleted: Retain + # whenScaled: Retain + startupProbe: failureThreshold: 60 initialDelaySeconds: 120 @@ -1520,6 +1538,12 @@ compactor: # set, choosing the default provisioner. storageClass: null + # -- StatefulSetAutoDeletePVC feature + # https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + retentionPolicy: {} + # whenDeleted: Retain + # whenScaled: Retain + startupProbe: failureThreshold: 60 initialDelaySeconds: 120