Redis In-Memory Database on Kubernetes Cluster

Redis Cluster Install Using Helm

#0
helm install redis-cluster --create-namespace --namespace redis oci://registry-1.docker.io/kahanit/redis-cluster --version 1.0.1

export REDIS_PASSWORD=$(kubectl get secret --namespace "redis" redis-cluster -o jsonpath="{.data.redis-password}" | base64 -d)

kubectl run --namespace redis redis-cluster-client --rm --tty -i --restart='Never' \
  --env REDIS_PASSWORD=$REDIS_PASSWORD \
  --image docker.io/kahanit/redis-cluster:8.4.0-r1 -- bash

redis-cli -c -h redis-cluster -a $REDIS_PASSWORD

Redis Cluster Install Manually

#1
# redis-headless-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: redis
  labels:
    app: redis
spec:
  clusterIP: None
  publishNotReadyAddresses: true
  selector:
    app: redis
  ports:
    - name: redis
      port: 6379
      targetPort: 6379
#2
kubectl apply -f redis-headless-svc.yaml

kubectl get svc redis
#3
# redis-statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
spec:
  serviceName: redis
  replicas: 6
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      terminationGracePeriodSeconds: 30

      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: redis
              topologyKey: kubernetes.io/hostname

      containers:
        - name: redis
          image: redis:7.2.5
          imagePullPolicy: IfNotPresent

          command:
            - redis-server
            - "--port"
            - "6379"
            - "--cluster-enabled"
            - "yes"
            - "--cluster-config-file"
            - "/data/nodes.conf"
            - "--cluster-node-timeout"
            - "5000"
            - "--appendonly"
            - "yes"
            - "--protected-mode"
            - "no"

          ports:
            - containerPort: 6379
              name: redis

          volumeMounts:
            - name: data
              mountPath: /data

          resources:
            requests:
              cpu: "500m"
              memory: "1Gi"
            limits:
              memory: "2Gi"

  volumeClaimTemplates:
    - metadata:
        name: data
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: ceph-block
        resources:
          requests:
            storage: 10Gi
#4
kubectl apply -f redis-statefulset.yaml

kubectl get pods -l app=redis
kubectl get pvc -l app=redis

Wait till all the pods are Running.

#5
# redis-cluster-init-job.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: redis-cluster-init
spec:
  backoffLimit: 0
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: redis-cluster-init
          image: redis:7.2.5
          command:
            - sh
            - -c
            - |
              echo "Waiting for Redis pods to be ready..."
              sleep 10

              echo "Creating Redis Cluster..."
              redis-cli --cluster create \
                redis-0.redis:6379 \
                redis-1.redis:6379 \
                redis-2.redis:6379 \
                redis-3.redis:6379 \
                redis-4.redis:6379 \
                redis-5.redis:6379 \
                --cluster-replicas 1 \
                --cluster-yes

              echo "Redis Cluster creation completed"
#6
kubectl apply -f redis-cluster-init-job.yaml

kubectl logs -f job/redis-cluster-init

kubectl exec -it redis-0 -- redis-cli cluster info

kubectl exec -it redis-0 -- redis-cli cluster nodes

Verify

#7
kubectl run redis-test \
  --rm -it \
  --restart=Never \
  --image=redis:7.2.5 \
  -- sh

redis-cli -c -h redis -p 6379

SET foo bar
GET foo

SET user:1 alice
SET user:2 bob
SET order:1001 paid

CLUSTER KEYSLOT user:1
CLUSTER KEYSLOT user:2
CLUSTER KEYSLOT order:1001

CLUSTER NODES
CLUSTER KEYSLOT foo

exit

Need to check later

  • AUTH without downtime
  • Read-only replicas
  • Pod disruption budgets
  • Prometheus metrics
  • Ceph snapshot backups
#8
kubectl exec -it redis-0 -- redis-cli

CLUSTER FORGET 46d5e2a3488a15b6807e18ab21a907545d3e1aa7
CLUSTER FORGET e0db0a307ff1c3a50f3452b309f2323d9172563a
CLUSTER FORGET 776b4cd702a732d11d1f61f28b173e0c41e3ae15
CLUSTER FORGET 7b241d1117859681643ab030fa33c101a54c1185
CLUSTER FORGET 082b3d6db30b1cff3e5059f467ff2b8b957ab803

CLUSTER MEET 10.244.2.4 6379
CLUSTER MEET 10.244.3.203 6379
CLUSTER MEET 10.244.7.126 6379
CLUSTER MEET 10.244.9.20 6379
CLUSTER MEET 10.244.5.140 6379

cluster info
cluster nodes
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted