From c8194f5fd0e76d313a9500c3701f9b09677e857f Mon Sep 17 00:00:00 2001 From: Wanderson Pinto dos Santos <85753826+wanpdsantos@users.noreply.github.com> Date: Tue, 22 Apr 2025 01:53:30 -0300 Subject: [PATCH] refactor: Update Redis configuration to use StatefulSet instead of deployment with pvc (#7187) ### What problem does this PR solve? This PR changes Redis to be a statefulset. In some situation when we Redis pod gets rescheduled to another Node, it gets stuck in pending state due to the PVC attached to another Kubernetes node. ### Type of change - [ ] Bug Fix (non-breaking change which fixes an issue) - [ ] New Feature (non-breaking change which adds functionality) - [ ] Documentation Update - [X] Refactoring - [ ] Performance Improvement - [ ] Other (please describe): --- helm/templates/redis.yaml | 166 ++++++++++++++++++++++---------------- 1 file changed, 96 insertions(+), 70 deletions(-) diff --git a/helm/templates/redis.yaml b/helm/templates/redis.yaml index ece84504e..4c59a5412 100644 --- a/helm/templates/redis.yaml +++ b/helm/templates/redis.yaml @@ -1,72 +1,5 @@ --- apiVersion: v1 -kind: PersistentVolumeClaim -metadata: - name: {{ include "ragflow.fullname" . }}-redis - labels: - {{- include "ragflow.labels" . | nindent 4 }} - app.kubernetes.io/component: redis -spec: - {{- with .Values.redis.storage.className }} - storageClassName: {{ . }} - {{- end }} - accessModes: - - ReadWriteOnce - resources: - requests: - storage: 8Gi ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: {{ include "ragflow.fullname" . }}-redis - labels: - {{- include "ragflow.labels" . | nindent 4 }} - app.kubernetes.io/component: redis -spec: - replicas: 1 - selector: - matchLabels: - {{- include "ragflow.selectorLabels" . | nindent 6 }} - app.kubernetes.io/component: redis - {{- with .Values.redis.deployment.strategy }} - strategy: - {{- . | toYaml | nindent 4 }} - {{- end }} - template: - metadata: - labels: - {{- include "ragflow.labels" . | nindent 8 }} - app.kubernetes.io/component: redis - annotations: - checksum/config-env: {{ include (print $.Template.BasePath "/env.yaml") . | sha256sum }} - spec: - containers: - - name: redis - image: {{ .Values.redis.image.repository }}:{{ .Values.redis.image.tag }} - command: - - "sh" - - "-c" - - "exec redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru" - envFrom: - - secretRef: - name: {{ include "ragflow.fullname" . }}-env-config - ports: - - containerPort: 6379 - name: redis - {{- with .Values.redis.deployment.resources }} - resources: - {{- . | toYaml | nindent 10 }} - {{- end }} - volumeMounts: - - mountPath: /data - name: redis-data - volumes: - - name: redis-data - persistentVolumeClaim: - claimName: {{ include "ragflow.fullname" . }}-redis ---- -apiVersion: v1 kind: Service metadata: name: {{ include "ragflow.fullname" . }}-redis @@ -74,11 +7,104 @@ metadata: {{- include "ragflow.labels" . | nindent 4 }} app.kubernetes.io/component: redis spec: + ports: + - port: 6379 + name: redis + protocol: TCP + clusterIP: None # Headless service for StatefulSet selector: {{- include "ragflow.selectorLabels" . | nindent 4 }} app.kubernetes.io/component: redis +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: {{ include "ragflow.fullname" . }}-redis + labels: + {{- include "ragflow.labels" . | nindent 4 }} + app.kubernetes.io/component: redis +spec: + serviceName: {{ include "ragflow.fullname" . }}-redis + replicas: 1 + selector: + matchLabels: + {{- include "ragflow.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: redis + template: + metadata: + labels: + {{- include "ragflow.labels" . | nindent 8 }} + app.kubernetes.io/component: redis + annotations: + checksum/config-env: {{ include (print $.Template.BasePath "/env.yaml") . | sha256sum }} + spec: + terminationGracePeriodSeconds: 60 + containers: + - name: redis + image: {{ .Values.redis.image.repository }}:{{ .Values.redis.image.tag }} + command: + - "sh" + - "-c" + - "exec redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru" + envFrom: + - secretRef: + name: {{ include "ragflow.fullname" . }}-env-config + ports: + - containerPort: 6379 + name: redis + {{- if .Values.redis.persistence.enabled }} + volumeMounts: + - name: redis-data + mountPath: /data + {{- end }} + {{- with .Values.redis.deployment.resources }} + resources: + {{- . | toYaml | nindent 12 }} + {{- end }} + {{- if .Values.redis.persistence.enabled }} + volumeClaimTemplates: + - metadata: + name: redis-data + labels: + {{- include "ragflow.labels" . | nindent 10 }} + app.kubernetes.io/component: redis + spec: + accessModes: + - ReadWriteOnce + {{- with .Values.redis.storage.className }} + storageClassName: {{ . }} + {{- end }} + resources: + requests: + storage: 8Gi + {{- end }} +--- +apiVersion: v1 +kind: Service +metadata: + name: {{ include "ragflow.fullname" . }}-redis-svc + labels: + {{- include "ragflow.labels" . | nindent 4 }} + app.kubernetes.io/component: redis +spec: ports: - - protocol: TCP - port: 6379 + - port: 6379 targetPort: redis - type: {{ .Values.redis.service.type }} + protocol: TCP + selector: + {{- include "ragflow.selectorLabels" . | nindent 4 }} + app.kubernetes.io/component: redis +--- +apiVersion: policy/v1 +kind: PodDisruptionBudget +metadata: + name: {{ include "ragflow.fullname" . }}-redis-pdb + labels: + {{- include "ragflow.labels" . | nindent 4 }} + app.kubernetes.io/component: redis +spec: + minAvailable: 1 + selector: + matchLabels: + {{- include "ragflow.selectorLabels" . | nindent 6 }} + app.kubernetes.io/component: redis \ No newline at end of file