本文将引导您使用 Helm 在 Kubernetes (K8s) 集群中,快速部署一个基于 Redis 3主3从架构的高可用分布式缓存集群。此部署方案依赖于现有的 Kubernetes 集群、Helm 客户端,并预设已配置基于 NFS 的 StorageClass 以实现持久化存储。
在现代 Web 应用中,缓存是提升性能、降低数据库负载的关键组件。Redis 以其高性能和丰富的数据结构成为缓存首选。然而,单点 Redis 存在可用性风险。通过部署 Redis 主从集群,可以实现数据冗余和故障自动切换,确保服务的高可用性,为您的应用提供稳定可靠的缓存服务。
在开始之前,请确保您的环境满足以下条件:
kubectl
已配置并能正常访问集群。提示 如果您尚未配置 NFS StorageClass,可以参考官方文档或相关教程进行部署。例如,Kubernetes使用Helm部署NFS-Client-Provisioner实现动态存储 这篇文章提供了很好的指导。动态存储配置是实现数据持久化的关键。
Bitnami 提供了大量维护良好且社区广泛认可的 Helm Chart。我们将使用其 Redis Cluster Chart。
bash
体验AI代码助手
代码解读
复制代码
# 添加 Bitnami 仓库 helm repo add bitnami https://charts.bitnami.com/bitnami # 更新本地 Helm 仓库索引 helm repo update # 查看可用的 redis-cluster chart 版本 helm search repo bitnami/redis-cluster
您会看到类似如下的输出,选择一个合适的版本(本文以 7.5.0
为例):
text
体验AI代码助手
代码解读
复制代码
NAME CHART VERSION APP VERSION DESCRIPTION bitnami/redis-cluster 7.5.0 6.2.6 Redis(R) Cluster is a data structure server. It ... ...
为了更灵活地配置 Redis 集群,建议将 Chart 下载到本地进行修改。
bash
体验AI代码助手
代码解读
复制代码
# 创建工作目录 mkdir -p ~/kube-deploy/redis-cluster && cd ~/kube-deploy/redis-cluster # 下载指定版本的 Chart (请替换为您选择的版本) helm pull bitnami/redis-cluster --version 7.5.0 # 解压 Chart 包 tar -xvf redis-cluster-7.5.0.tgz # 复制默认的 values.yaml 文件,用于自定义配置 cp ./redis-cluster/values.yaml ./values-custom.yaml
此时,您的目录结构应如下所示:
text
体验AI代码助手
代码解读
复制代码
. ├── redis-cluster # 解压后的 Chart 目录 │ ├── Chart.yaml │ ├── templates │ ├── values.yaml # 默认配置文件 │ └── ... ├── redis-cluster-7.5.0.tgz # 下载的 Chart 压缩包 └── values-custom.yaml # 我们将修改此文件
values-custom.yaml
首先,确认集群中可用的 StorageClass 名称:
bash
体验AI代码助手
代码解读
复制代码
kubectl get storageclasses
输出示例:
text
体验AI代码助手
代码解读
复制代码
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE local-path rancher.io/local-path Delete WaitForFirstConsumer false 3d4h nfs-storage (default) cluster.local/nfs-subdir-external-provisioner Delete Immediate true 3d3h managed-premium disk.csi.azure.com Delete WaitForFirstConsumer true 120d
编辑 values-custom.yaml
文件,指定持久化存储类并设置 Redis 访问密码。
yaml
体验AI代码助手
代码解读
复制代码
# values-custom.yaml # 全局配置 global: storageClass: "nfs-storage" # 确保 "nfs-storage" 是您环境中可用的 StorageClass redis: password: "YourStrongPassword123!" # 设置 Redis 集群访问密码,务必使用强密码 # (可选) 资源配置示例,根据实际需求调整 # master: # persistence: # size: 10Gi # resources: # requests: # cpu: "500m" # memory: "512Mi" # limits: # cpu: "1" # memory: "1Gi" # slave: # persistence: # size: 10Gi # resources: # requests: # cpu: "250m" # memory: "256Mi" # limits: # cpu: "500m" # memory: "512Mi" # 默认会部署 3 主 3 从。如果需要调整节点数,可以修改以下配置: # cluster: # nodes: 6 # replicas: 1 # 每个主节点的从节点数量
️ 安全提示 请务必将
YourStrongPassword123!
替换为一个复杂且唯一的强密码。避免使用弱密码。
为 Redis 集群创建一个专用的命名空间,有助于资源隔离和管理。
bash
体验AI代码助手
代码解读
复制代码
kubectl create namespace redis-ha
(本文后续命令将使用 redis-ha
作为命名空间)
使用 Helm install 命令,并指定自定义的 values-custom.yaml
文件进行部署。
bash
体验AI代码助手
代码解读
复制代码
helm install redis-cluster ./redis-cluster \ --namespace redis-ha \ -f ./values-custom.yaml
参数说明:
redis-cluster
: Helm Release 的名称,可以自定义。./redis-cluster
: 本地 Chart 的路径。--namespace redis-ha
: 指定部署到的命名空间。-f ./values-custom.yaml
: 使用我们自定义的配置文件。bash
体验AI代码助手
代码解读
复制代码
helm list --namespace redis-ha
您应该能看到类似输出,STATUS
应为 deployed
:
text
体验AI代码助手
代码解读
复制代码
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION redis-cluster redis-ha 1 2023-10-27 10:30:00 EST deployed redis-cluster-7.5.0 6.2.6
默认配置下,会创建 6 个 Redis Pod(3 主 3 从)。
bash
体验AI代码助手
代码解读
复制代码
kubectl get pods --namespace redis-ha -l app.kubernetes.io/name=redis-cluster -w
等待所有 Pod 的 STATUS
变为 Running
,并且 READY
状态为 1/1
。
text
体验AI代码助手
代码解读
复制代码
NAME READY STATUS RESTARTS AGE redis-cluster-0 1/1 Running 0 5m redis-cluster-1 1/1 Running 0 5m redis-cluster-2 1/1 Running 0 5m redis-cluster-3 1/1 Running 0 5m redis-cluster-4 1/1 Running 0 5m redis-cluster-5 1/1 Running 0 5m
按 Ctrl+C
退出 -w
(watch) 模式。
redis-cluster-0
, redis-cluster-2
, redis-cluster-4
redis-cluster-1
, redis-cluster-3
, redis-cluster-5
(它们分别对应一个主节点)首先,获取之前设置的 Redis 密码:
bash
体验AI代码助手
代码解读
复制代码
export REDIS_PASSWORD=$(kubectl get secret --namespace redis-ha redis-cluster -o jsonpath="{.data.redis-password}" | base64 --decode) echo "Redis Password: $REDIS_PASSWORD"
然后,启动一个临时的 Redis 客户端 Pod 来连接集群:
bash
体验AI代码助手
代码解读
复制代码
kubectl run redis-client --namespace redis-ha --rm --tty -i \ --env REDIS_PASSWORD_ENV="$REDIS_PASSWORD" \ --image docker.io/bitnami/redis-cluster:6.2.6 \ -- bash
注意: 如果上面命令中的
bitnami/redis-cluster:6.2.6
镜像版本与您部署的APP VERSION
不一致,请替换为对应版本以确保redis-cli
工具兼容。
在临时 Pod 的 shell 中,使用 redis-cli
连接到集群:
bash
体验AI代码助手
代码解读
复制代码
# 在 redis-client Pod 内部执行 redis-cli -c -h redis-cluster -a "$REDIS_PASSWORD_ENV"
参数说明:
-c
: 启用集群模式,允许自动重定向。-h redis-cluster
: Redis 集群的 Service 名称 (由 Helm Chart 创建,通常是 Release 名称)。-a "$REDIS_PASSWORD_ENV"
: 使用密码进行认证。连接成功后,您可以执行 Redis 命令来验证集群状态:
shell
体验AI代码助手
代码解读
复制代码
# 在 redis-cli 提示符下执行 > cluster info # 期望看到: cluster_state:ok, cluster_slots_assigned:16384, cluster_size:3, ... > cluster nodes # 期望看到: 列出所有 6 个节点的信息,3 个 master 和 3 个 slave,及其角色和连接状态。 > set mykey "Hello Kubernetes Redis" # > GET mykey # "Hello Kubernetes Redis" > exit
测试完毕后,在 redis-client
Pod 的 bash
提示符下输入 exit
退出临时 Pod。
在 Kubernetes 集群内部,其他应用可以通过以下 Service FQDN (完全限定域名) 访问 Redis 集群:
主服务 (用于客户端连接): redis-cluster.redis-ha.svc.cluster.local
(其中 redis-cluster
是 Helm Release 名称,redis-ha
是命名空间)。 大多数 Redis Cluster 客户端库只需要这个地址和密码即可自动发现所有节点。
各 Pod 的 DNS (通常用于调试或特定场景):
lua
体验AI代码助手
代码解读
复制代码
redis-cluster-0.redis-cluster-headless.redis-ha.svc.cluster.local redis-cluster-1.redis-cluster-headless.redis-ha.svc.cluster.local ... redis-cluster-5.redis-cluster-headless.redis-ha.svc.cluster.local
(注意,这里用的是 redis-cluster-headless
服务)
kubectl describe pod -n redis-ha
。values-custom.yaml
中正确配置。Running
状态。redis-cluster.redis-ha
是否正确指向了健康的 Pods (kubectl describe svc redis-cluster -n redis-ha
)。values-custom.yaml
中配置并通过 Secret 存储的密码一致。kubectl logs -n redis-ha
和 kubectl logs --previous -n redis-ha
。values-custom.yaml
中为 Redis Master 和 Slave Pods 配置合理的 CPU 和内存 requests
与 limits
,以保证服务质量和集群稳定性。bitnami/redis-exporter
Helm chart) 收集 Redis 指标。helm upgrade redis-cluster ./redis-cluster -n redis-ha -f values-custom.yaml
helm rollback redis-cluster -n redis-ha
helm uninstall redis-cluster -n redis-ha
注意: 默认情况下,卸载 Helm Chart 不会 删除 PVC。如果需要删除数据,请手动删除 PVC:
kubectl delete pvc -l app.kubernetes.io/instance=redis-cluster -n redis-ha
通过本文的指导,您成功地使用 Helm 在 Kubernetes 上部署了一个 3主3从的高可用 Redis 集群。此方案利用 Bitnami 提供的成熟 Chart,结合 NFS 持久化存储,不仅保障了数据的持久性,也大大提升了缓存服务的可靠性和系统的整体稳定性。
合理的配置、持续的监控和及时的维护,将使这个 Redis集群成为您应用架构中坚实可靠的一部分。鼓励您根据实际业务需求,进一步探索 values.yaml
中的其他配置选项,如节点亲和性、安全上下文等,打造更定制化的 Redis 服务。