K8S 部署 Redis Cluster 集群(三主三从模式) - 部署笔记

在现代分布式应用架构中,Redis 作为高性能的内存数据库被广泛使用。而 Redis Cluster 集群模式能够提供高可用性、数据分片等优势。当我们将其部署在 Kubernetes(K8S)环境中时,借助 K8S 的容器编排能力,可以更方便地管理和扩展 Redis 集群。本文将详细记录在 K8S 中部署三主三从模式 Redis Cluster 集群的过程。

目录#

  1. 环境准备
  2. 编写 Redis 配置文件
  3. 创建 Redis 容器镜像
  4. 在 K8S 中定义 Redis 相关资源
    • 定义 Service
    • 定义 StatefulSet
  5. 初始化 Redis Cluster
  6. 验证集群状态
  7. 常见实践与最佳实践
  8. 示例用法
  9. 参考

1. 环境准备#

  • K8S 集群:确保 K8S 集群正常运行,具备创建 Pod、Service 等资源的权限。可以通过 kubectl get nodes 命令查看节点状态。
  • Docker 环境:用于构建 Redis 容器镜像。

2. 编写 Redis 配置文件#

创建一个目录(例如 redis-config),在其中编写 Redis 配置文件(以 redis.conf 为例)。以下是关键配置项:

port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

port:指定 Redis 监听端口。 cluster-enabled:开启集群模式。 cluster-config-file:集群配置文件路径。 cluster-node-timeout:节点超时时间。 appendonly:开启 AOF 持久化(根据需求选择)。

3. 创建 Redis 容器镜像#

在包含 redis.conf 的目录下,创建 Dockerfile

FROM redis:latest
COPY redis.conf /usr/local/etc/redis/redis.conf
CMD ["redis-server", "/usr/local/etc/redis/redis.conf"]

然后执行 docker build -t my-redis-cluster:v1.0.0. 命令构建镜像(. 表示当前目录)。

4. 在 K8S 中定义 Redis 相关资源#

定义 Service#

创建 redis-service.yaml 文件:

apiVersion: v1
kind: Service
metadata:
  name: redis-cluster
  labels:
    app: redis-cluster
spec:
  ports:
  - name: redis
    port: 6379
    targetPort: 6379
  clusterIP: None
  selector:
    app: redis-cluster

这里使用 clusterIP: None 创建 Headless Service,用于 StatefulSet 中 Pod 的 DNS 解析,方便 Pod 之间通信。

定义 StatefulSet#

创建 redis-statefulset.yaml 文件:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis-cluster
spec:
  serviceName: "redis-cluster"
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      labels:
        app: redis-cluster
    spec:
      containers:
      - name: redis
        image: my-redis-cluster:v1.0.0
        ports:
        - containerPort: 6379
          name: redis
        - containerPort: 16379
          name: redis-cluster

replicas: 6 表示创建 6 个 Pod(3 主 3 从)。containerPort: 16379 是 Redis 集群内部通信端口(默认是 port + 10000)。

执行 kubectl apply -f redis-service.yamlkubectl apply -f redis-statefulset.yaml 命令创建资源。

5. 初始化 Redis Cluster#

等待所有 Pod 启动完成(可以通过 kubectl get pods 查看状态)。然后进入其中一个 Pod(例如 kubectl exec -it redis-cluster-0 bash),执行以下命令初始化集群:

redis-cli --cluster create $(kubectl get pods -l app=redis-cluster -o jsonpath='{.items[*].status.podIP}'):6379 --cluster-replicas 1

--cluster-replicas 1 表示为每个主节点分配一个从节点。

6. 验证集群状态#

再次进入 Pod(例如 redis-cluster-0),执行 redis-cli cluster info 命令查看集群信息,执行 redis-cli cluster nodes 命令查看节点列表,确认主从关系是否正确。

7. 常见实践与最佳实践#

  • 资源限制:在 StatefulSet 的 spec.template.spec.containers 中为 Redis 容器设置合理的 resources.requestsresources.limits(例如内存、CPU),避免资源竞争。
  • 持久化存储:可以为 Redis Pod 配置 PersistentVolumeClaim(PVC),实现数据持久化(修改 StatefulSet 增加 volumeClaimTemplates 部分)。
  • 监控与备份:结合 Prometheus + Grafana 对 Redis 集群进行监控,定期备份 AOF 或 RDB 文件(根据持久化方式)。

8. 示例用法#

在应用程序中连接 Redis Cluster:

import rediscluster
 
startup_nodes = [{"host": "redis-cluster-0.redis-cluster.default.svc.cluster.local", "port": "6379"},
                 {"host": "redis-cluster-1.redis-cluster.default.svc.cluster.local", "port": "6379"},
                 {"host": "redis-cluster-2.redis-cluster.default.svc.cluster.local", "port": "6379"}]
rc = rediscluster.RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
rc.set("key", "value")
print(rc.get("key"))

(这里是 Python 示例,其他语言有相应的 Redis Cluster 客户端库)

9. 参考#

通过以上步骤,我们成功在 K8S 中部署了 Redis Cluster 三主三从模式集群,并且了解了相关的实践和用法。在实际生产环境中,还需要根据具体业务需求进一步优化和完善。