文章目录
- 使用 Kubernetes 部署 Redis 主从及 Sentinel 高可用架构
- Redis 主从架构部署 (`1.yaml`)
- Redis Sentinel 部署 (`2.yaml`)
- Sentinel 服务暴露 (`3.yaml`)
- 部署步骤
- 总结
使用 Kubernetes 部署 Redis 主从及 Sentinel 高可用架构
本文将详细介绍如何在 Kubernetes 中部署 Redis 主从及 Sentinel 高可用架构,提供完整的 YAML 配置文件,并逐步解析其关键配置。命名空间已调整为 test
。
我这是单点,未做共享存储版
Redis 主从架构部署 (1.yaml
)
首先,使用 StatefulSet
部署 Redis 主从结构,每个实例通过主机名确定角色:
apiVersion: apps/v1
kind: StatefulSet
metadata:name: redisnamespace: test
spec:serviceName: redisreplicas: 3selector:matchLabels:app: redistemplate:metadata:labels:app: redisspec:initContainers:- name: init-redisimage: docker.wctmd.us.kg/busybox:latestcommand: ["/bin/sh", "-c"]args: ["mkdir -p /data/redis/$(hostname)"]volumeMounts:- name: redis-datamountPath: /datacontainers:- name: redisimage: docker.wctmd.us.kg/redis:5.0.14ports:- containerPort: 6379command: ["/bin/sh"]args: - "-c"- |if [ $(hostname) = "redis-0" ]; thenredis-server --port 6379 --protected-mode no --replica-announce-ip $(hostname).rediselseredis-server --port 6379 --protected-mode no --replicaof redis-0.redis 6379 --replica-announce-ip $(hostname).redisfivolumeMounts:- name: redis-datamountPath: /datavolumes:- name: redis-datahostPath:path: /data/redistype: DirectoryOrCreate
关键点解析:
- 主从自动识别:
redis-0
为主节点,其它 Pod 配置为从节点并通过--replicaof
指定主节点。 - 数据持久化:使用
hostPath
存储 Redis 数据,映射到宿主机的/data/redis
。 - 独立目录管理:通过
initContainer
动态创建/data/redis/$(hostname)
,避免目录冲突。
Redis Sentinel 部署 (2.yaml
)
接下来,部署 Sentinel 来监控 Redis 主从并实现自动故障转移:
apiVersion: apps/v1
kind: Deployment
metadata:name: redis-sentinelnamespace: test
spec:replicas: 3selector:matchLabels:app: redis-sentineltemplate:metadata:labels:app: redis-sentinelspec:containers:- name: redis-sentinelimage: docker.wctmd.us.kg/redis:5.0.14ports:- containerPort: 26379command: [ "redis-sentinel" ]args: ["/data/sentinel.conf"]volumeMounts:- name: sentinel-confmountPath: /datainitContainers:- name: init-sentinelimage: docker.wctmd.us.kg/busybox:latestcommand: ["/bin/sh", "-c"]args:- cp /etc/redis/sentinel.conf /data/sentinel.conf && chmod 600 /data/sentinel.confvolumeMounts:- name: sentinel-confmountPath: /data- name: config-volumemountPath: /etc/redisvolumes:- name: sentinel-confemptyDir: {}- name: config-volumeconfigMap:name: sentinel-config
---
apiVersion: v1
kind: ConfigMap
metadata:name: sentinel-confignamespace: test
data:sentinel.conf: |sentinel monitor mymaster redis-0.redis 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 60000sentinel parallel-syncs mymaster 1
关键点解析:
- 动态配置文件管理:通过
initContainer
将只读的ConfigMap
文件复制到可写路径,并调整权限。 - 多实例部署:使用 Deployment 创建 3 个 Sentinel 实例以实现高可用。
- 监控配置:
ConfigMap
定义了 Sentinel 的监控规则,包括主节点、超时、同步参数等。
Sentinel 服务暴露 (3.yaml
)
最后,通过 Service
将 Sentinel 对外暴露,便于外部访问:
apiVersion: v1
kind: Service
metadata:name: redis-sentinelnamespace: test
spec:type: NodePortports:- nodePort: 30154port: 26379targetPort: 26379protocol: TCPselector:app: redis-sentinel
关键点解析:
- 外部访问支持:使用
NodePort
暴露 Sentinel 服务,监听宿主机的30154
端口。 - 服务选择器:通过标签
app: redis-sentinel
将流量路由到 Sentinel Pod。
部署步骤
- 创建命名空间
test
:kubectl create namespace test
- 应用
1.yaml
部署 Redis:kubectl apply -f 1.yaml
- 应用
2.yaml
部署 Sentinel:kubectl apply -f 2.yaml
- 应用
3.yaml
创建服务:kubectl apply -f 3.yaml
- 验证部署状态:
kubectl -n test get pods kubectl -n test get svc
总结
本文展示了如何使用 Kubernetes 部署 Redis 主从架构和 Sentinel 高可用集群。通过灵活的 StatefulSet
和 Deployment
配置,我们实现了高可靠性和动态配置管理,同时确保数据持久化和集群安全性。
建议:在生产环境中,可以进一步优化存储方案(如使用
PersistentVolume
)并增强安全配置(如启用 Redis/Sentinel 认证)。