Redis 集群部署流程
前提:K8s+helm安装完成
1. 安装 NFS 服务器
1.1 安装 NFS 工具包
在 NFS 服务器上安装 nfs-utils
包:
1.2 创建共享目录
创建一个目录作为 NFS 共享目录,并设置权限:
1.3 配置 NFS 导出
编辑 /etc/exports
文件,定义共享目录和访问权限:
添加以下内容:
-
/nfs_share
:共享目录。 -
*
:允许所有客户端访问。可以替换为特定 IP 或网段(如192.168.1.0/24
)。 -
rw
:允许读写。 -
sync
:同步写入,确保数据一致性。 -
no_root_squash
:允许客户端 root 用户拥有服务器 root 权限。 -
no_all_squash
:不压缩所有用户的权限。
保存并退出后,启动 NFS 服务:
2. 部署 NFS Provisioner
NFS Provisioner 是一个动态存储提供程序,可以为 Kubernetes 集群提供 NFS 存储。
2.1 添加 Helm 仓库
添加 NFS Provisioner 的 Helm 仓库:
2.2 安装 NFS Provisioner
使用 Helm 安装 NFS Provisioner。假设 NFS 服务器地址是 192.168.1.100
,共享目录是 /nfs_share
:
参数说明:
-
nfs.server
:NFS 服务器的 IP 地址。 -
nfs.path
:NFS 共享目录。 -
storageClass.name
:创建的 StorageClass 名称(nfs-client
)。 -
storageClass.defaultClass
:设置为默认的 StorageClass。 -
image.repository
和image.tag
:指定 NFS Provisioner 镜像(国内镜像地址)。
3. 部署 Redis 集群
使用 Helm 部署 Redis 集群,并将其存储配置为使用 NFS Provisioner。
3.1 添加 Helm 仓库
添加 Bitnami 的 Helm 仓库:
3.2 安装 Redis 集群
使用 Helm 安装 Redis 集群,并配置使用 NFS Provisioner 提供的存储:
参数说明:
-
cluster.enabled=true
:启用 Redis 集群模式。 -
persistence.storageClass=nfs-client
:使用 NFS Provisioner 提供的 StorageClass。 -
persistence.size=1Gi
:每个 Redis 节点的存储大小。 -
password=password
:设置 Redis 密码。 -
image.repository
和image.tag
:指定 Redis 镜像。
4. 部署 Redis-cluster-proxy
Redis-cluster-proxy 用于解决 Redis 集群的 MOVED
和 ASK
问题,并提供统一的访问入口。
4.1 下载源码
克隆 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 镜像:
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 # 外部访问端口
运行 YAML 文件:
5. 验证部署
5.1 检查服务状态
确保所有服务正常运行:
5.2 外部访问
通过 NodePort
访问 Redis-cluster-proxy:
5.3 使用客户端工具
使用 Redis 客户端工具(如 redis-cli
)连接 Redis-cluster-proxy: