Skip to content

Commit a8ba2d9

Browse files
committed
feat(common): add statefulset recreate job
including this automatically adds a `pre-upgrade` hook that deletes the referenced statefulset.
1 parent 104f986 commit a8ba2d9

2 files changed

Lines changed: 160 additions & 0 deletions

File tree

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,155 @@
1+
{{- define "common.statefulset.recreateOnSizeChangeHook" -}}
2+
{{- $_ := mustMerge . (pick .context "Values" "Capabilities") -}}
3+
{{- $renderedStatefulSets := list -}}
4+
{{- range $renderedStatefulSet := include (print .context.Template.BasePath .pathToStatefulsetTemplate) .context | splitList "---" -}}
5+
{{- with $renderedStatefulSet | fromYaml -}}
6+
{{- $renderedStatefulSets = append $renderedStatefulSets . -}}
7+
{{- end }}
8+
{{- end -}}
9+
{{- if $renderedStatefulSets }}
10+
{{- range $newStatefulSet := $renderedStatefulSets -}}
11+
{{- if $newStatefulSet.spec.volumeClaimTemplates }}
12+
{{- $currentStatefulset := lookup $newStatefulSet.apiVersion $newStatefulSet.kind $newStatefulSet.metadata.namespace $newStatefulSet.metadata.name -}}
13+
{{- $needsRecreation := false -}}
14+
{{- $templates := dict -}}
15+
{{- if $currentStatefulset -}}
16+
{{- if ne (len $newStatefulSet.spec.volumeClaimTemplates) (len $currentStatefulset.spec.volumeClaimTemplates) -}}
17+
{{- $needsRecreation = true -}}
18+
{{- end -}}
19+
{{- range $index, $newVolumeClaimTemplate := $newStatefulSet.spec.volumeClaimTemplates -}}
20+
{{- $currentVolumeClaimTemplateSpec := dict -}}
21+
{{- range $oldVolumeClaimTemplate := $currentStatefulset.spec.volumeClaimTemplates -}}
22+
{{- if eq $oldVolumeClaimTemplate.metadata.name $newVolumeClaimTemplate.metadata.name -}}
23+
{{- $currentVolumeClaimTemplateSpec = $oldVolumeClaimTemplate.spec -}}
24+
{{- end -}}
25+
{{- end }}
26+
{{- $newVolumeClaimTemplateStorageSize := $newVolumeClaimTemplate.spec.resources.requests.storage -}}
27+
{{- if not $currentVolumeClaimTemplateSpec -}}
28+
{{- $needsRecreation = true -}}
29+
{{- else -}}
30+
{{- if ne $newVolumeClaimTemplateStorageSize $currentVolumeClaimTemplateSpec.resources.requests.storage -}}
31+
{{- $needsRecreation = true -}}
32+
{{- $templates = set $templates $newVolumeClaimTemplate.metadata.name $newVolumeClaimTemplateStorageSize -}}
33+
{{- end -}}
34+
{{- end -}}
35+
{{- end -}}
36+
{{- end -}}
37+
{{- if $needsRecreation }}
38+
apiVersion: batch/v1
39+
kind: Job
40+
metadata:
41+
name: {{ $newStatefulSet.metadata.name }}-recreate
42+
namespace: {{ $newStatefulSet.metadata.namespace }}
43+
labels:
44+
{{- $newStatefulSet.metadata.labels | toYaml | nindent 4 }}
45+
app.kubernetes.io/component: statefulset-recreate-job
46+
annotations:
47+
"helm.sh/hook": pre-upgrade
48+
"helm.sh/hook-weight": "-5"
49+
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
50+
spec:
51+
ttlSecondsAfterFinished: 300
52+
template:
53+
metadata:
54+
name: {{ $newStatefulSet.metadata.name }}-recreate
55+
labels:
56+
{{- $newStatefulSet.metadata.labels | toYaml | nindent 8 }}
57+
spec:
58+
serviceAccountName: {{ $newStatefulSet.metadata.name }}-recreate
59+
restartPolicy: OnFailure
60+
containers:
61+
- name: recreate
62+
image: {{ include "common.images.image" (dict "imageRoot" (mustMerge (dict "tag" $.Capabilities.KubeVersion.Version) $.Values.global.kubectl.image) "global" $.Values.global) -}}
63+
command:
64+
- kubectl
65+
- delete
66+
- statefulset
67+
- --cascade=orphan
68+
- {{ $newStatefulSet.metadata.name }}
69+
{{- range $index := until (int $newStatefulSet.spec.replicas) }}
70+
{{- range $template, $size := $templates }}
71+
- name: patch-pvc-{{ $template }}-{{ $index }}
72+
image: {{ include "loki.baseImage" (dict "service" (dict "registry" "docker.io" "repository" "rancher/kubectl" "tag" ($.Capabilities.KubeVersion.Version | default "v1.33.0")) "global" $.Values.global.image) }}
73+
command:
74+
- patch
75+
- pvc
76+
- --namespace={{ $newStatefulSet.metadata.namespace }}
77+
- {{ printf "%s-%s-%d" $template $newStatefulSet.metadata.name $index }}
78+
- --type='json'
79+
- '-p=[{"op": "replace", "path": "/spec/resources/requests/storage", "value": "{{ $size }}"}]'
80+
{{- end }}
81+
{{- end }}
82+
---
83+
apiVersion: v1
84+
kind: ServiceAccount
85+
metadata:
86+
name: {{ $newStatefulSet.metadata.name }}-recreate
87+
namespace: {{ $newStatefulSet.metadata.namespace }}
88+
labels:
89+
{{- $newStatefulSet.metadata.labels | toYaml | nindent 4 }}
90+
app.kubernetes.io/component: statefulset-recreate-job
91+
annotations:
92+
"helm.sh/hook": pre-upgrade
93+
"helm.sh/hook-weight": "-10"
94+
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
95+
---
96+
apiVersion: rbac.authorization.k8s.io/v1
97+
kind: Role
98+
metadata:
99+
name: {{ $newStatefulSet.metadata.name }}-recreate
100+
namespace: {{ $newStatefulSet.metadata.namespace }}
101+
labels:
102+
{{- $newStatefulSet.metadata.labels | toYaml | nindent 4 }}
103+
app.kubernetes.io/component: statefulset-recreate-job
104+
annotations:
105+
"helm.sh/hook": pre-upgrade
106+
"helm.sh/hook-weight": "-10"
107+
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
108+
rules:
109+
- apiGroups:
110+
- apps
111+
resources:
112+
- statefulsets
113+
resourceNames:
114+
- {{ $newStatefulSet.metadata.name }}
115+
verbs:
116+
- delete
117+
- apiGroups:
118+
- v1
119+
resources:
120+
- persistentvolumeclaims
121+
resourceNames:
122+
{{- range $index := until (int $newStatefulSet.spec.replicas) }}
123+
{{- range $template := $templates | keys }}
124+
- {{ printf "%s-%s-%d" $template $newStatefulSet.metadata.name $index }}
125+
{{- end }}
126+
{{- end }}
127+
verbs:
128+
- patch
129+
---
130+
apiVersion: rbac.authorization.k8s.io/v1
131+
kind: RoleBinding
132+
metadata:
133+
name: {{ $newStatefulSet.metadata.name }}-recreate
134+
namespace: {{ $newStatefulSet.metadata.namespace }}
135+
labels:
136+
{{- $newStatefulSet.metadata.labels | toYaml | nindent 4 }}
137+
app.kubernetes.io/component: statefulset-recreate-job
138+
annotations:
139+
"helm.sh/hook": pre-upgrade
140+
"helm.sh/hook-weight": "-10"
141+
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
142+
subjects:
143+
- kind: ServiceAccount
144+
name: {{ $newStatefulSet.metadata.name }}-recreate
145+
namespace: {{ $newStatefulSet.metadata.namespace }}
146+
roleRef:
147+
kind: Role
148+
name: {{ $newStatefulSet.metadata.name }}-recreate
149+
apiGroup: rbac.authorization.k8s.io
150+
---
151+
{{- end }}
152+
{{ end }}
153+
{{ end }}
154+
{{ end }}
155+
{{- end -}}

charts/common/values.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
global:
2+
kubectl:
3+
image:
4+
registry: registry.k8s.io
5+
repository: kubectl
6+
tag: 1.33.4@sha256:261a9ed843eb68e3d50da132245e2221d75ca19504130e47bd32788c0ff339a0
27
telemetry:
38
otlp:
49
endpoint: auto

0 commit comments

Comments
 (0)