使用 Kubernetes 部署 Redis 主从及 Sentinel 高可用架构(未做共享存储版)

文章目录

  • [使用 Kubernetes 部署 Redis 主从及 Sentinel 高可用架构](#使用 Kubernetes 部署 Redis 主从及 Sentinel 高可用架构)
  • [Redis 主从架构部署 (`1.yaml`)](#Redis 主从架构部署 (1.yaml))
  • [Redis Sentinel 部署 (`2.yaml`)](#Redis Sentinel 部署 (2.yaml))
  • [Sentinel 服务暴露 (`3.yaml`)](#Sentinel 服务暴露 (3.yaml))
  • 部署步骤
  • 总结

使用 Kubernetes 部署 Redis 主从及 Sentinel 高可用架构

本文将详细介绍如何在 Kubernetes 中部署 Redis 主从及 Sentinel 高可用架构,提供完整的 YAML 配置文件,并逐步解析其关键配置。命名空间已调整为 test

我这是单点,未做共享存储版


Redis 主从架构部署 (1.yaml)

首先,使用 StatefulSet 部署 Redis 主从结构,每个实例通过主机名确定角色:

yaml 复制代码
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: test
spec:
  serviceName: redis
  replicas: 3
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      initContainers:
      - name: init-redis
        image: docker.wctmd.us.kg/busybox:latest
        command: ["/bin/sh", "-c"]
        args: ["mkdir -p /data/redis/$(hostname)"]
        volumeMounts:
        - name: redis-data
          mountPath: /data
      containers:
      - name: redis
        image: docker.wctmd.us.kg/redis:5.0.14
        ports:
        - containerPort: 6379
        command: ["/bin/sh"]
        args: 
        - "-c"
        - |
          if [ $(hostname) = "redis-0" ]; then
            redis-server --port 6379 --protected-mode no --replica-announce-ip $(hostname).redis
          else
            redis-server --port 6379 --protected-mode no --replicaof redis-0.redis 6379 --replica-announce-ip $(hostname).redis
          fi
        volumeMounts:
        - name: redis-data
          mountPath: /data
      volumes:
      - name: redis-data
        hostPath:
          path: /data/redis
          type: DirectoryOrCreate

关键点解析

  • 主从自动识别redis-0 为主节点,其它 Pod 配置为从节点并通过 --replicaof 指定主节点。
  • 数据持久化 :使用 hostPath 存储 Redis 数据,映射到宿主机的 /data/redis
  • 独立目录管理 :通过 initContainer 动态创建 /data/redis/$(hostname),避免目录冲突。

Redis Sentinel 部署 (2.yaml)

接下来,部署 Sentinel 来监控 Redis 主从并实现自动故障转移:

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-sentinel
  namespace: test
spec:
  replicas: 3
  selector:
    matchLabels:
      app: redis-sentinel
  template:
    metadata:
      labels:
        app: redis-sentinel
    spec:
      containers:
      - name: redis-sentinel
        image: docker.wctmd.us.kg/redis:5.0.14
        ports:
        - containerPort: 26379
        command: [ "redis-sentinel" ]
        args: ["/data/sentinel.conf"]
        volumeMounts:
        - name: sentinel-conf
          mountPath: /data
      initContainers:
      - name: init-sentinel
        image: docker.wctmd.us.kg/busybox:latest
        command: ["/bin/sh", "-c"]
        args:
        - cp /etc/redis/sentinel.conf /data/sentinel.conf && chmod 600 /data/sentinel.conf
        volumeMounts:
        - name: sentinel-conf
          mountPath: /data
        - name: config-volume
          mountPath: /etc/redis
      volumes:
      - name: sentinel-conf
        emptyDir: {}
      - name: config-volume
        configMap:
          name: sentinel-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: sentinel-config
  namespace: test
data:
  sentinel.conf: |
    sentinel monitor mymaster redis-0.redis 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel failover-timeout mymaster 60000
    sentinel parallel-syncs mymaster 1

关键点解析

  • 动态配置文件管理 :通过 initContainer 将只读的 ConfigMap 文件复制到可写路径,并调整权限。
  • 多实例部署:使用 Deployment 创建 3 个 Sentinel 实例以实现高可用。
  • 监控配置ConfigMap 定义了 Sentinel 的监控规则,包括主节点、超时、同步参数等。

Sentinel 服务暴露 (3.yaml)

最后,通过 Service 将 Sentinel 对外暴露,便于外部访问:

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: redis-sentinel
  namespace: test
spec:
  type: NodePort
  ports:
  - nodePort: 30154
    port: 26379
    targetPort: 26379
    protocol: TCP
  selector:
    app: redis-sentinel

关键点解析

  • 外部访问支持 :使用 NodePort 暴露 Sentinel 服务,监听宿主机的 30154 端口。
  • 服务选择器 :通过标签 app: redis-sentinel 将流量路由到 Sentinel Pod。

部署步骤

  1. 创建命名空间 test

    bash 复制代码
    kubectl create namespace test
  2. 应用 1.yaml 部署 Redis:

    bash 复制代码
    kubectl apply -f 1.yaml
  3. 应用 2.yaml 部署 Sentinel:

    bash 复制代码
    kubectl apply -f 2.yaml
  4. 应用 3.yaml 创建服务:

    bash 复制代码
    kubectl apply -f 3.yaml
  5. 验证部署状态:

    bash 复制代码
    kubectl -n test get pods
    kubectl -n test get svc

总结

本文展示了如何使用 Kubernetes 部署 Redis 主从架构和 Sentinel 高可用集群。通过灵活的 StatefulSetDeployment 配置,我们实现了高可靠性和动态配置管理,同时确保数据持久化和集群安全性。

建议 :在生产环境中,可以进一步优化存储方案(如使用 PersistentVolume)并增强安全配置(如启用 Redis/Sentinel 认证)。

相关推荐
qq_529835351 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
希忘auto5 小时前
详解Redis在Centos上的安装
redis·centos
Bright16685 小时前
centos9安装k8s集群
云原生·容器·kubernetes
xidianjiapei0018 小时前
Kubernetes的Ingress 资源是什么?
云原生·容器·kubernetes
逻各斯11 小时前
redis中的Lua脚本,redis的事务机制
java·redis·lua
土豆沒加11 小时前
K8S的Dashboard登录及验证
云原生·容器·kubernetes
终端行者12 小时前
kubernetes1.28部署mysql5.7主从同步,使用Nfs制作持久卷存储,适用于centos7/9操作系统,
数据库·容器·kubernetes
阿桢呀13 小时前
Redis实战篇《黑马点评》5
数据库·redis·缓存
Kerwin要坚持日更15 小时前
一文讲解Redis中的主从复制
数据库·redis·缓存
Suk-god15 小时前
【Redis】基础知识入门
数据库·redis·缓存