Kubernetes上通过Helm部署高可用Redis集群

本文详细介绍如何利用 Helm 在 Kubernetes(K8s)集群中部署一个基于 Redis 3 主 3 从架构的高可用分布式缓存集群。部署过程依赖 Kubernetes 集群和 Helm 工具,且预设已配置基于 NFS 的 StorageClass 用于持久化存储。


环境准备

  • Kubernetes 集群(版本 1.16+ 推荐)
  • Helm 客户端(版本 3.x)
  • 预先配置好的 NFS StorageClass,用于动态申请持久卷

提示

若尚未配置 NFS StorageClass,可参考相关文章快速部署 Helm 安装 nfs-client-provisioner


添加 Bitnami Helm 仓库

Bitnami 提供了稳定且社区认可的 Redis 集群 Helm Chart,首先添加该仓库:

bash 复制代码
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

可用 Helm Chart 版本及描述可通过如下命令查看:

bash 复制代码
helm search repo redis

下载并准备 Helm Chart

为了自定义配置,建议将 Helm Chart 下载到本地进行修改:

bash 复制代码
mkdir -p ~/redis && cd ~/redis

helm pull bitnami/redis-cluster --version 7.5.0
tar -xvf redis-cluster-7.5.0.tgz

cp redis-cluster/values.yaml ./values-custom.yaml

目录结构示例:

text 复制代码
.
├── redis-cluster
│   ├── Chart.yaml
│   ├── templates
│   └── values.yaml
├── redis-cluster-7.5.0.tgz
└── values-custom.yaml

配置持久化存储和密码

确认集群中可用的 StorageClass:

bash 复制代码
kubectl get storageclasses

输出示例:

text 复制代码
NAME                          PROVISIONER          RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
nfs (default)                 nfs-provisioner-01   Delete          Immediate           false                  14d

将配置文件 values-custom.yaml 修改为使用 nfs 作为默认 StorageClass,并设置 Redis 访问密码:

yaml 复制代码
global:
  storageClass: "nfs"     # 指定持久卷存储Class为nfs
  redis:
    password: "redis123"  # Redis集群访问密码,自定义密码建议设置强密码

创建 Kubernetes 命名空间

建议将 Redis 集群部署在专门的命名空间中,便于运维管理:

bash 复制代码
kubectl create ns mynamespace

使用 Helm 安装 Redis 集群

以自定义参数部署 Redis 3 主 3 从集群:

bash 复制代码
helm -n mynamespace install redis-cluster ./redis-cluster -f values-custom.yaml
  • -n mynamespace 指定安装命名空间
  • install redis-cluster 表示安装命名为 redis-cluster 的实例
  • -f values-custom.yaml 使用自定义配置覆盖默认配置

验证集群部署状态

查看 Helm 部署状态:

bash 复制代码
helm -n mynamespace list

示例输出:

text 复制代码
NAME            NAMESPACE      REVISION   UPDATED                                    STATUS     CHART                  APP VERSION
redis-cluster   mynamespace    1          2022-05-06 20:46:11 +0800 CST              deployed   redis-cluster-7.5.0    6.2.6 

查看 Pod 运行状态,确认 6 个 Redis 实例(3 主 3 从)均已运行:

bash 复制代码
kubectl -n mynamespace get pods -l app.kubernetes.io/name=redis-cluster

示例输出:

text 复制代码
NAME              READY   STATUS    RESTARTS   AGE
redis-cluster-0   1/1     Running   0          10m
redis-cluster-1   1/1     Running   0          10m
redis-cluster-2   1/1     Running   0          10m
redis-cluster-3   1/1     Running   0          10m
redis-cluster-4   1/1     Running   0          10m
redis-cluster-5   1/1     Running   0          10m

Redis 集群节点分布说明:

  • 主节点:redis-cluster-0,redis-cluster-2,redis-cluster-4
  • 从节点:redis-cluster-1,redis-cluster-3,redis-cluster-5

访问和验证 Redis 集群

  1. 获取 Redis 密码,存入环境变量:
bash 复制代码
export REDIS_PASSWORD=$(kubectl get secret --namespace mynamespace redis-cluster -o jsonpath="{.data.redis-password}" | base64 --decode)
  1. 启动临时 Pod 连接 Redis 集群:
bash 复制代码
kubectl run -n mynamespace redis-client --rm -i --tty \
--env REDIS_PASSWORD=$REDIS_PASSWORD \
--image docker.io/bitnami/redis-cluster:6.2.6-debian-10-r193 \
-- bash
  1. 使用 redis-cli 连接集群:
bash 复制代码
redis-cli -c -h redis-cluster -a $REDIS_PASSWORD
  1. 执行集群状态命令验证:
bash 复制代码
> cluster info
> cluster nodes

集群访问示例

在 Kubernetes 集群内,使用 DNS 名称可访问集群各节点:

bash 复制代码
ping redis-cluster-0.redis-cluster.mynamespace
ping redis-cluster-1.redis-cluster.mynamespace
...
ping redis-cluster-5.redis-cluster.mynamespace

客户端访问时,如使用 Redis Cluster 模式客户端,使用服务名 redis-cluster.mynamespace.svc.cluster.local 即可访问集群主服务。


常见问题及建议

  • 持久化存储失败:确认 StorageClass 名称正确无误,同时 PVC 状态为 Bound。
  • Redis 密码错误:通过 Secret 管理密码,避免硬编码风险,确保客户端密码一致。
  • 网络策略和防火墙:确保 Pod 间通信和服务访问权限正确开通。
  • 版本兼容性:使用的 Redis 和 Helm Chart 版本应相互兼容,避免因版本差异导致异常。
  • 监控与日志:部署监控工具(如 Prometheus)和日志收集方案,有助于及时发现问题。

总结

本文示范了基于 Helm 的 Bitnami Redis Cluster Chart,在 Kubernetes 集群上快速部署一个 3 主 3 从的 Redis 高可用集群,结合 NFS 持久化存储,保障数据持久性及系统的稳定性。通过合理的配置和验证步骤,助力运维人员高效搭建 Redis 缓存服务,提高业务可用性和性能。

欢迎根据业务需求,灵活调整副本数、资源配置和安全设置,实现个性化 Redis 集群方案。


相关阅读推荐


以上内容,欢迎点赞和分享,助力更多开发者无痛上手 Kubernetes 及 Redis 集群部署!

相关推荐
水淹萌龙3 小时前
k8s 中使用 Service 访问时NetworkPolicy不生效问题排查
云原生·容器·kubernetes
alden_ygq6 小时前
K8S cgroups详解
容器·贪心算法·kubernetes
旧故新长6 小时前
访问 Docker 官方镜像源(包括代理)全部被“重置连接”或超时
运维·docker·容器
white.tie7 小时前
Docker部署单节点Elasticsearch
elasticsearch·docker·jenkins
matrixlzp7 小时前
K8S Gateway AB测试、蓝绿发布、金丝雀(灰度)发布
kubernetes·gateway·ab测试
云攀登者-望正茂12 小时前
最大化效率和性能:AKS 中节点池的强大功能
云原生·容器·kubernetes
haven-85212 小时前
win11安装Joplin Server私有化部署(docker)
运维·docker·容器
QX_hao12 小时前
【docker】--数据卷挂载
docker·容器·eureka
文静小土豆13 小时前
在K8S集群中部署EFK日志收集
docker·容器·kubernetes
一个向上的运维者13 小时前
k8s的flannel生产实战与常见问题排查
云原生·容器·kubernetes