helm部署redis集群

Redis 集群部署流程

前提:K8s+helm安装完成

1. 安装 NFS 服务器

1.1 安装 NFS 工具包

在 NFS 服务器上安装 nfs-utils 包:
sudo yum install -y nfs-utils

1.2 创建共享目录

创建一个目录作为 NFS 共享目录,并设置权限:
sudo mkdir /nfs_share
sudo chmod 777 /nfs_share # 允许所有用户访问

1.3 配置 NFS 导出

编辑 /etc/exports 文件,定义共享目录和访问权限:
sudo vi /etc/exports

添加以下内容:
/nfs_share *(rw,sync,no_root_squash,no_all_squash)

  • /nfs_share:共享目录。

  • *:允许所有客户端访问。可以替换为特定 IP 或网段(如 192.168.1.0/24)。

  • rw:允许读写。

  • sync:同步写入,确保数据一致性。

  • no_root_squash:允许客户端 root 用户拥有服务器 root 权限。

  • no_all_squash:不压缩所有用户的权限。

保存并退出后,启动 NFS 服务:
sudo systemctl enable nfs --now


2. 部署 NFS Provisioner

NFS Provisioner 是一个动态存储提供程序,可以为 Kubernetes 集群提供 NFS 存储。

2.1 添加 Helm 仓库

添加 NFS Provisioner 的 Helm 仓库:
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner
helm repo update

2.2 安装 NFS Provisioner

使用 Helm 安装 NFS Provisioner。假设 NFS 服务器地址是 192.168.1.100,共享目录是 /nfs_share
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.100 \ # 替换为 NFS 服务器地址
--set nfs.path=/nfs_share \
--set storageClass.name=nfs-client \
--set storageClass.defaultClass=true \
--set image.repository=swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/sig-storage/nfs-subdir-external-provisioner \
--set image.tag=v4.0.2

参数说明

  • nfs.server:NFS 服务器的 IP 地址。

  • nfs.path:NFS 共享目录。

  • storageClass.name:创建的 StorageClass 名称(nfs-client)。

  • storageClass.defaultClass:设置为默认的 StorageClass。

  • image.repositoryimage.tag:指定 NFS Provisioner 镜像(国内镜像地址)。


3. 部署 Redis 集群

使用 Helm 部署 Redis 集群,并将其存储配置为使用 NFS Provisioner。

3.1 添加 Helm 仓库

添加 Bitnami 的 Helm 仓库:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

3.2 安装 Redis 集群

使用 Helm 安装 Redis 集群,并配置使用 NFS Provisioner 提供的存储:
helm install redis-cluster bitnami/redis-cluster \
--set cluster.enabled=true \
--set persistence.storageClass=nfs-client \
--set persistence.size=1Gi \
--set password=password \ # 设置 Redis 密码
--set image.repository=bitnami/redis-cluster \
--set image.tag=7.4.2 \
--set image.pullPolicy=IfNotPresent

参数说明

  • cluster.enabled=true:启用 Redis 集群模式。

  • persistence.storageClass=nfs-client:使用 NFS Provisioner 提供的 StorageClass。

  • persistence.size=1Gi:每个 Redis 节点的存储大小。

  • password=password:设置 Redis 密码。

  • image.repositoryimage.tag:指定 Redis 镜像。


4. 部署 Redis-cluster-proxy

Redis-cluster-proxy 用于解决 Redis 集群的 MOVEDASK 问题,并提供统一的访问入口。

4.1 下载源码

克隆 Redis-cluster-proxy 源码:
git clone https://github.com/RedisLabs/redis-cluster-proxy.git
cd redis-cluster-proxy

4.2 创建 Dockerfile

创建 Dockerfile,内容如下:

使用官方的 Ubuntu 作为基础镜像

FROM ubuntu:22.04

安装编译依赖

RUN apt-get update && apt-get install -y \

build-essential \

gcc-11 \

g++-11 \

libssl-dev \

libhiredis-dev \

git \

&& rm -rf /var/lib/apt/lists/*

设置 GCC 11 为默认编译器

RUN update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 100 \

&& update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 100

复制本地 redis-cluster-proxy 源码到镜像中

COPY . /redis-cluster-proxy

设置工作目录

WORKDIR /redis-cluster-proxy

构建 redis-cluster-proxy

RUN make CFLAGS="-fPIC -std=c11"

将可执行文件复制到 /usr/local/bin

RUN cp ./src/redis-cluster-proxy /usr/local/bin/

设置环境变量默认值

ENV PROXY_PORT="7777" \

PROXY_BIND="0.0.0.0" \

CLUSTER_NODES="redis-cluster.default.svc.cluster.local:6379" \ # Redis 集群地址

CLUSTER_PASSWORD="zsfund" \ # Redis 集群密码

THREADS="8" \

MAX_CLIENTS="10000"

暴露代理端口

EXPOSE 7777

设置默认启动命令

CMD exec redis-cluster-proxy \

--port ${PROXY_PORT} \

--bind ${PROXY_BIND} \

--threads ${THREADS} \

--maxclients ${MAX_CLIENTS} \

--auth ${CLUSTER_PASSWORD} \

${CLUSTER_NODES} \

"$@"

4.3 生成镜像

构建 Docker 镜像:
docker build -t redis-cluster-proxy:latest .

4.4 修改源码

根据需求修改源码(如支持认证等),参考:PR #98

4.5 创建 YAML 文件

创建 redis-cluster-proxy.yaml,内容如下:
apiVersion: apps/v1

kind: Deployment

metadata:

name: redis-cluster-proxy

spec:

replicas: 1

selector:

matchLabels:

app: redis-cluster-proxy

template:

metadata:

labels:

app: redis-cluster-proxy

spec:

containers:

  • name: redis-cluster-proxy

image: redis-cluster-proxy:latest

imagePullPolicy: IfNotPresent

env:

  • name: CLUSTER_NODES

value: "redis-cluster.default.svc.cluster.local:6379" # Redis 集群地址

  • name: CLUSTER_PASSWORD

value: "zsfund" # Redis 集群密码

ports:

  • containerPort: 7777

apiVersion: v1

kind: Service

metadata:

name: redis-cluster-proxy

spec:

type: NodePort

selector:

app: redis-cluster-proxy

ports:

  • protocol: TCP

port: 7777

targetPort: 7777

nodePort: 31777 # 外部访问端口

4.6 部署 Redis-cluster-proxy

运行 YAML 文件:
kubectl apply -f redis-cluster-proxy.yaml


5. 验证部署

5.1 检查服务状态

确保所有服务正常运行:
kubectl get pods,svc

5.2 外部访问

通过 NodePort 访问 Redis-cluster-proxy:
telnet <Node-IP> 31777

5.3 使用客户端工具

使用 Redis 客户端工具(如 redis-cli)连接 Redis-cluster-proxy:
redis-cli -h <Node-IP> -p 31777
注意:上述命令内部依赖的镜像包是从dockerhub上拉取,因国内无法访问,可替换成下面命令也可进行
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner \
--set nfs.server=192.168.1.100 \
--set nfs.path=/nfs_share \
--set storageClass.name=nfs-client \
--set storageClass.defaultClass=true \
--set image.repository=swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/sig-storage/nfs-subdir-external-provisioner \
--set image.tag=v4.0.2
helm search repo redis-cluster
wget https://charts.bitnami.com/bitnami/redis-cluster-11.4.3.tgz
tar -zxvf redis-cluster-11.4.3.tgz
cd redis-cluster
helm install redis-cluster ./redis-cluster \
--set cluster.enabled=true \
--set persistence.storageClass=nfs-client \
--set persistence.size=1Gi \
--set password=password \
--set image.repository=bitnami/redis-cluster \
--set image.tag=7.4.2 \
--set image.pullPolicy=IfNotPresent