使用Helm安装生产级别redis集群
快速安装
1,添加bitnami的仓库
1 | helm repo add bitnami https://charts.bitnami.com/bitnami |
2,查询redis资源
1 | helm search repo redis -l |
就选这个redis-cluster
加上 -l 显示所有版本的资源
CHART VERSION 是chart的版本
APP VERSION是redis的版本
3,安装
1 | helm -n demo install redis-cluster bitnami/redis-cluster --version 7.6.4 |
-n 是指定k8s的命名空间,我这里的demo
NAME: redis-cluster
LAST DEPLOYED: Tue Jun 20 10:50:29 2023
NAMESPACE: demo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: redis-cluster
CHART VERSION: 7.6.4
APP VERSION: 6.2.7** Please be patient while the chart is being deployed **To get your password run:
export REDIS_PASSWORD=$(kubectl get secret –namespace “demo” redis-cluster -o jsonpath=”{.data.redis-password}” | base64 -d)You have deployed a Redis® Cluster accessible only from within you Kubernetes Cluster.INFO: The Job to create the cluster will be created.To connect to your Redis® cluster:
Run a Redis® pod that you can use as a client:
kubectl run –namespace demo redis-cluster-client –rm –tty -i –restart=’Never’
–env REDIS_PASSWORD=$REDIS_PASSWORD
–image docker.io/bitnami/redis-cluster:6.2.7-debian-11-r9 – bashConnect using the Redis® CLI:
redis-cli -c -h redis-cluster -a $REDIS_PASSWORD
4,查看
可以使用helm list命令查看
1 | [root@paas-m-k8s-master-1 7.6.4]# helm list -n demo |
1 | kc -n demo get svc,sts,pod,cm,secret,deploy |

可以看到,默认是启动了3主3从的cluster集群。使用的是statefulset。也创建了configmap和secret。
然后我们想进一步确认redis集群的状态,上面第三部的提示内容已经很清楚的告诉我们怎么连接上redis,
1,获取redis集群的密码
1 | export REDIS_PASSWORD=$(kubectl get secret --namespace "demo" redis-service-redis-cluster -o jsonpath="{.data.redis-password}" | base64 --decode) |
这是将redis的密码存到linux的环境变量REDIS_PASSWORD中
然后,我们可以使用
1 | export | grep REDIS_PASSWORD |
查看一下
2,启动一个pod做redis的client使用
1 | kubectl run --namespace demo redis-cluster-client --rm --tty -i --restart='Never' \ |
这里就用上了环境变量REDIS_PASSWORD
进入redis
1 | redis-cli -c -h redis-cluster -a $REDIS_PASSWORD |

自定义安装
我们也可以通过修改values.yaml中的参数配置实现自定义安装
1,下载chart
1 | helm pull bitnami/redis-cluster --version 7.6.4 |
下载下来的是一个压缩包redis-cluster-7.6.4.tgz
加上 –version 现在指定chart版本的资源
解压,

里面的values.yaml就是我们需要的
2,修改配置

redis的版本

可以看到,这里默认是3主3从的6个节点。
3,安装自己的chart
cd到解压后的redis-cluster目录的上一级
1 | helm install my-redis redis-cluster -n demo |
helm卸载redis
1 | helm uninstall redis-cluster -n demo |
测试

1,停掉一个redis主节点

1 | kubectl delete pod redis-service-redis-cluster-2 -n demo |


k8s自动重启pod,使用新的ip。但是redis集群可以自动感知到,并更新了集群节点信息。
通过压测代码发现
1623209212219 2021-06-09 11:26:52
1623209213393 2021-06-09 11:26:53
有1秒钟的cluster is down

进到容器里看看
1 | kc -n demo exec -it redis-cluster-0 -- /bin/sh |
找到其数据目录
1 | $ pwd |
发现有一个nodes.sh
1 | declare -A host_2_ip_array=([redis-cluster-1.redis-cluster-headless]="100.66.54.98" [redis-cluster-2.redis-cluster-headless]="100.115.23.182" [redis-cluster-4.redis-cluster-headless]="100.111.149.249" [redis-cluster-3.redis-cluster-headless]="100.105.152.11" [redis-cluster-0.redis-cluster-headless]="100.108.161.145" [redis-cluster-5.redis-cluster-headless]="100.66.220.245" ) |
记录了域名和ip的对应关系
2,模拟全部pod宕机
通过将statefulset的pod数量降到0,模拟整个redis集群宕机
1 | kc -n demo scale sts redis-cluster --replicas=0 |
然后把副本数再恢复到6
1 | kc -n demo scale sts redis-cluster --replicas=6 |

发现其pod会自动重启几次,完成对redis集群的恢复。
这个容灾能力还是可以的。
查看redis-cluster的statefulset的定义。

猜测是根据pod的名字dns解析出新的ip,从而重新组织起集群。代码实现还是比较复杂的。