在拥有 3 个 master 节点和多个 Agent 节点的 K3s 集群上部署高可用的 Redis Cluster 是一个很好的选择,可以确保数据的高可用性和可扩展性。

前提条件

在开始部署之前,确保已经满足

  • 正常运行的 K3s 集群,包含 3 个 Master 节点以及多个 Agent 节点
  • Helm 工具

部署

首先确保 Helm 安装

helm version

如果没有安装 Helm 可以参考官方的教程安装

添加 Bitnami 仓库

Bitnami 提供了一个 Redis Cluster Helm Chart

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

创建专用 Namespace,资源管理和隔离

kubectl create namespace redis-cluster

使用 Helm 安装 Redis 集群,将部署具有 3 个主节点和 3 个从节点的 Redis 集群。

helm install my-redis-cluster oci://registry-1.docker.io/bitnamicharts/redis-cluster \
  --namespace redis-cluster \
  --set cluster.nodes=6 \
  --set cluster.replicas=1 \
  --set persistence.storageClass=longhorn \
  --set persistence.size=5Gi
  • 总共 6 个节点(3 个主节点和 3 个从节点)
  • 每个主节点有 1 个从节点(replica=1)
  • 是用 Longhorn 存储
  • 启用持久存储,每个节点分配 5GB 存储空间

验证部署状态。查看 Pod 分布

kubectl get pods -n redis-cluster

当所有 Pod 都是 Running 时,成功。

存储配置验证

kubectl get pvc -n redis

获取 Redis 密码

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

访问 Redis 集群

创建一个临时的客户端 Pod 来连接 Redis 集群。

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

在 客户端 Pod 内部,使用 redis-cli 连接到集群。

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

连接成功之后,可以运行一些命令来验证集群状态

CLUSTER INFO

验证成功

Pz52

显示集群的基本信息,节点数量,槽分配等。

外部访问 Redis Cluster

基本测试

一些基本的 Redis 操作来验证集群功能

SET mykey "Hello Redis Cluster"
GET mykey

部署的 Redis 集群具有以下特性:

  • 自动分片和数据迁移:当节点加入或离开集群时,Redis 集群会自动将数据迁移到正确的节点,保持均衡的数据分布
  • 高可用性:Redis 集群使用主从复制机制,每个主节点都有从节点。当主节点发生故障时,从节点可以自动接管,提供高可用性
  • 负载均衡:Redis 集群实现了客户端和节点之间的自动负载均衡。客户端可以直接连接到任何节点,节点会自动转发请求,实现负载均衡
  • 持久化:通过配置,我们启用了持久化存储,确保数据不会因 Pod 重启而丢失

维护和更新

扩展集群

如果要扩展集群,可以更新 Helm 部署

helm upgrade my-redis-cluster oci://registry-1.docker.io/bitnamicharts/redis-cluster \
  --namespace redis-cluster \
  --set cluster.nodes=8 \
  --set cluster.replicas=1 \
  --set persistence.enabled=true \
  --set persistence.size=2Gi

监控集群

定期检查集群状态

kubectl exec -it my-redis-cluster-0 -n redis-cluster -- redis-cli -a $REDIS_PASSWORD cluster info
  • [[new relic]]