K8S 部署 Redis Cluster 集群(三主三从模式) - 部署笔记
在现代分布式应用架构中,Redis 作为高性能的内存数据库被广泛使用。而 Redis Cluster 集群模式能够提供高可用性、数据分片等优势。当我们将其部署在 Kubernetes(K8S)环境中时,借助 K8S 的容器编排能力,可以更方便地管理和扩展 Redis 集群。本文将详细记录在 K8S 中部署三主三从模式 Redis Cluster 集群的过程。
目录#
- 环境准备
- 编写 Redis 配置文件
- 创建 Redis 容器镜像
- 在 K8S 中定义 Redis 相关资源
- 定义 Service
- 定义 StatefulSet
- 初始化 Redis Cluster
- 验证集群状态
- 常见实践与最佳实践
- 示例用法
- 参考
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 yesport:指定 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-clusterreplicas: 6 表示创建 6 个 Pod(3 主 3 从)。containerPort: 16379 是 Redis 集群内部通信端口(默认是 port + 10000)。
执行 kubectl apply -f redis-service.yaml 和 kubectl 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.requests和resources.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 三主三从模式集群,并且了解了相关的实践和用法。在实际生产环境中,还需要根据具体业务需求进一步优化和完善。