redis.yaml


Overview

redis.yaml is a Kubernetes manifest template file designed to deploy and manage a Redis instance within a Kubernetes cluster. It is structured as a Helm template, allowing dynamic configuration through templating directives ({{ ... }}) and values provided during Helm chart installation or upgrade.

This file defines multiple Kubernetes resources essential for running Redis as a StatefulSet with persistence, service discovery, load balancing, and high availability controls:

The manifest is tailored to be part of a larger application (likely named "ragflow") and integrates with shared labels, selectors, and environment configurations.


Detailed Resource Descriptions

1. Headless Service

apiVersion: v1
kind: Service
metadata:
  name: {{ include "ragflow.fullname" . }}-redis
  annotations:
    "helm.sh/resource-policy": keep
  labels:
    {{- 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

2. StatefulSet

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:
      {{- if or .Values.imagePullSecrets .Values.redis.image.pullSecrets }}
      imagePullSecrets:
        {{- with .Values.imagePullSecrets }}
        {{- toYaml . | nindent 8 }}
        {{- end }}
        {{- with .Values.redis.image.pullSecrets }}
        {{- toYaml . | nindent 8 }}
        {{- end }}
      {{- end }}
      terminationGracePeriodSeconds: 60
      containers:
        - name: redis
          image: {{ .Values.redis.image.repository }}:{{ .Values.redis.image.tag }}
          {{- with .Values.redis.image.pullPolicy }}
          imagePullPolicy: {{ . }}
          {{- end }}
          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 }}
  {{- with .Values.redis.persistence.retentionPolicy }}
  persistentVolumeClaimRetentionPolicy:
    {{- with .whenDeleted }}
    whenDeleted: {{ . }}
    {{- end }}
    {{- with .whenScaled }}
    whenScaled: {{ . }}
    {{- end }}
  {{- end }}
  volumeClaimTemplates:
    - metadata:
        name: redis-data
        labels:
          {{- include "ragflow.selectorLabels" . | nindent 10 }}
          app.kubernetes.io/component: redis
      spec:
        accessModes:
          - ReadWriteOnce
        {{- with .Values.redis.storage.className }}
        storageClassName: {{ . }}
        {{- end }}
        resources:
          requests:
            storage: {{ .Values.redis.storage.capacity }}
  {{- end }}

Usage example snippet (values.yaml excerpt):

redis:
  image:
    repository: redis
    tag: "7.0"
    pullPolicy: IfNotPresent
  persistence:
    enabled: true
    storage:
      capacity: 1Gi
      className: standard
  deployment:
    resources:
      limits:
        memory: "256Mi"
        cpu: "500m"
      requests:
        memory: "128Mi"
        cpu: "250m"

3. Cluster Service

apiVersion: v1
kind: Service
metadata:
  name: {{ include "ragflow.fullname" . }}-redis-svc
  labels:
    {{- include "ragflow.labels" . | nindent 4 }}
    app.kubernetes.io/component: redis
spec:
  ports:
    - port: 6379
      targetPort: redis
      protocol: TCP
  selector:
    {{- include "ragflow.selectorLabels" . | nindent 4 }}
    app.kubernetes.io/component: redis

4. Pod Disruption Budget (PDB)

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

Important Implementation Details and Algorithms


Interaction with Other System Components


Mermaid Diagram: Kubernetes Resource Structure and Relationships

flowchart TD
    A[Headless Service]
    B[StatefulSet (Redis)]
    C[PersistentVolumeClaim]
    D[Cluster Service]
    E[Pod Disruption Budget]

    A --> B
    B --> C
    D --> B
    E --> B

    classDef resource fill:#f9f,stroke:#333,stroke-width:1px;
    class A,B,C,D,E resource;

Summary

The redis.yaml Helm template file is a comprehensive Kubernetes deployment manifest for Redis. It provides a secured, persistent, and highly available Redis service tightly integrated with the application's label and configuration schema. It leverages StatefulSets for stable pod management, persistent volume claims for data durability, and Kubernetes services for seamless networking within the cluster.

This file is a critical part of the overall system architecture, enabling reliable caching or data storage capabilities for the ragflow application.