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