Kubernetes(k8s)部署高可用多主多从的Redis集群

简介: Kubernetes(k8s)部署高可用多主多从的Redis集群

环境准备

准备Kubernetes

首先你需要一个Kubernetes集群,如图我已经安装好了一个Kubernetes集群:

如果你还没有Kubernetes集群可参考我写的文章:https://blog.csdn.net/m0_51510236/article/details/130842122

准备存储类

你还需要一个可动态供应的存储类,我之前已经写过一篇关于安装NFS动态供给存储类的文章:https://blog.csdn.net/m0_51510236/article/details/132641343(这篇文章的上半部分),如图我已经安装好了一个NFS的存储类(名字为 nfs-client):

部署redis

我之前写过一篇在物理机上安装高可用多主多从的redis集群的文章:https://blog.csdn.net/m0_51510236/article/details/132684529,这篇文章参考的那片物理机上安装集群的步骤来。

准备一个命名空间

为了贴近生产环境,我们先创建一个命名空间:

命令创建

kubectl create namespace deploy-test

yaml文件创建(推荐)

apiVersion: v1
kind: Namespace
metadata:
  name: deploy-test
spec: {}
status: {}

准备redis配置文件

首先我们需要一个Redis的配置文件,我已经准备好了,注意名字命名为 redis.conf:

# 关闭保护模式
protected-mode no
# 日志级别
loglevel warning
# 日志存放目录
logfile "/data/redis.log"
# 数据文件目录
dir /data
dbfilename dump.rdb
# 数据库数量
databases 16
# 保存数据库到数据文件
save 900 1
save 300 10
save 60 10000
# 集群相关配置
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000

先把这个文件复制到服务器上,如图:

然后我们需要创建一个ConfigMap,可以直接通过下面命令生产ConfigMap的yaml资源清单文件:

kubectl create configmap redis-cluster-config --from-file=redis.conf -n deploy-test --dry-run=client -o yaml

生成了如图:

因为我们真实部署中可能还会将这个应用部署到其他集群,所以我们记得保存这个配置文件:

apiVersion: v1
data:
  redis.conf: |
    # 关闭保护模式
    protected-mode no
    # 日志级别
    loglevel warning
    # 日志存放目录
    logfile "/data/redis.log"
    # 数据文件目录
    dir /data
    dbfilename dump.rdb
    # 数据库数量
    databases 16
    # 保存数据库到数据文件
    save 900 1
    save 300 10
    save 60 10000
    # 集群相关配置
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
kind: ConfigMap
metadata:
  name: redis-cluster-config
  namespace: deploy-test

我们将这个内容保存到一个文件中,如 redis-deploy.yaml:

准备部署statefulset的资源清单文件

资源清单文件我已经准备好了,下面有详细的说明:

# 创建一个Redis部署要用到的Service
apiVersion: v1
kind: Service
metadata:
  name: deploy-redis-svc
  namespace: deploy-test
  labels:
    app: redis
spec:
  ports:
  - port: 6379
    name: redis
    targetPort: 6379
    nodePort: 30379
  selector:
    app: redis
  type: NodePort
  sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: deploy-redis
  namespace: deploy-test
spec:
  selector:
    matchLabels:
      app: redis
  # 引用上面定义的Service
  serviceName: "deploy-redis-svc"
  # 注意这里部署六个节点,按照本篇文章的逻辑最好不要修改
  replicas: 6
  template:
    metadata:
      labels:
        app: redis
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - command:
        # 这里指定使用那个配置文件启动redis-server
        - "redis-server"
        - "/usr/local/etc/redis.conf"
        name: redis
        # 因为redis6集群对域名支持不好,并且Kubernetes是需要通过域名连接各个pod的,所以我们采用redis7来完成这次部署
        # 如果你能拉取到DockerHub上的镜像那么你就使用这个
        # image: docker.io/library/redis:7.0.12
        # 如果你拉取不到,那么就使用我拉取并推送到国内阿里云的镜像
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/redis:7.0.12
        ports:
        - containerPort: 6379
          name: redis
        volumeMounts:
        # 挂载redis的数据卷,使用的是我在下面声明的存储类模版
        - name: redis-data
          mountPath: /data
        # 挂载redis的配置文件
        - name: redis-config
          mountPath: /usr/local/etc
          readOnly: true
      volumes:
      # 读取configmap,获取redis的配置文件,方便上面挂载这个配置文件
      - name: redis-config
        configMap:
          name: redis-cluster-config
          items:
          - key: redis.conf
            path: redis.conf
  # 定义存储类模版
  volumeClaimTemplates:
  - metadata:
      name: redis-data # 这个名字要与上面的对应
      namespace: deploy-test
    spec:
      accessModes:
      - ReadWriteMany # 设置多节点读写模式
      resources:
        requests:
          storage: 1Gi # 申请1个g的存储空间,可根据自己的服务器空间修改
      storageClassName: nfs-client # 这里填写你存储类的名字

完整的资源清单文件内容:

apiVersion: v1
kind: Namespace
metadata:
  name: deploy-test
spec: {}
status: {}
---
apiVersion: v1
data:
  redis.conf: |
    # 关闭保护模式
    protected-mode no
    # 日志级别
    loglevel warning
    # 日志存放目录
    logfile "/data/redis.log"
    # 数据文件目录
    dir /data
    dbfilename dump.rdb
    # 数据库数量
    databases 16
    # 保存数据库到数据文件
    save 900 1
    save 300 10
    save 60 10000
    # 集群相关配置
    cluster-enabled yes
    cluster-config-file nodes-6379.conf
    cluster-node-timeout 15000
kind: ConfigMap
metadata:
  name: redis-cluster-config
  namespace: deploy-test
---
apiVersion: v1
kind: Service
metadata:
  name: deploy-redis-svc
  namespace: deploy-test
  labels:
    app: redis
spec:
  ports:
  - port: 6379
    name: redis
    targetPort: 6379
    nodePort: 30379
  selector:
    app: redis
  type: NodePort
  sessionAffinity: ClientIP
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: deploy-redis
  namespace: deploy-test
spec:
  selector:
    matchLabels:
      app: redis
  serviceName: "deploy-redis-svc"
  replicas: 6
  template:
    metadata:
      labels:
        app: redis
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - command:
        - "redis-server"
        - "/usr/local/etc/redis.conf"
        name: redis
        # image: docker.io/library/redis:7.0.12
        image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/redis:7.0.12
        ports:
        - containerPort: 6379
          name: redis
        volumeMounts:
        - name: redis-data
          mountPath: /data
        - name: redis-config
          mountPath: /usr/local/etc
          readOnly: true
      volumes:
      - name: redis-config
        configMap:
          name: redis-cluster-config
          items:
          - key: redis.conf
            path: redis.conf
  volumeClaimTemplates:
  - metadata:
      name: redis-data
      namespace: deploy-test
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Gi
      storageClassName: nfs-client

执行文件完成部署

我们可以使用这行命令执行这个文件完成部署:

kubectl apply -f redis-deploy.yaml

执行后如图:

可以通过这行命令监控它的部署:

watch kubectl get all -o wide -n deploy-test

看到6个pod都已经成功运行起来了:

初始化集群

我们部署的pod是statefulset类型的pod,所以我们访问pod的域名格式为 pod名字.service名字.命名空间.svc.cluster.local,所以我们在集群中访问六个redis的地址分别为:

deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-1.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-2.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-3.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-4.deploy-redis-svc.deploy-test.svc.cluster.local:6379
deploy-redis-5.deploy-redis-svc.deploy-test.svc.cluster.local:6379

接下来我们需要去到里面的任何一个pod,去执行一行命令,使用这行命令进入到第一个pod:

# 注意修改你自己的命名空间和pod名字
kubectl exec -itn deploy-test pod/deploy-redis-0 bash

进入后如图:

然后我们执行一下下面这行命令:

redis-cli --cluster create --cluster-replicas 1 \
deploy-redis-0.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-1.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-2.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-3.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-4.deploy-redis-svc.deploy-test.svc.cluster.local:6379 \
deploy-redis-5.deploy-redis-svc.deploy-test.svc.cluster.local:6379

执行后会出现这个提示:

它问我们这样的一个分配方式行不行,这里直接输入yes然后回车,接下来看到下面这个画面代表集群配置成功:

我们接下来使用这行命令来进入集群:

# -c 的意思是进入集群
redis-cli -c

然后我们输入这行命令来查看集群里的节点:

CLUSTER NODES

可以看到是三master三node的redis集群:

到这里Kubernetes上搭建redis高可用集群就已经完毕了。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
4月前
|
存储 NoSQL Redis
手把手教你用 Docker 部署 Redis
Redis是高性能内存数据库,支持多种数据结构,适用于缓存、消息队列等场景。本文介绍如何通过Docker快速拉取轩辕镜像并部署Redis,涵盖快速启动、持久化存储及docker-compose配置,助力开发者高效搭建稳定服务。
1332 7
|
5月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
11月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
1017 33
|
11月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
存储 Kubernetes Docker
Kubernetes(k8s)和Docker Compose本质区别
理解它们的区别和各自的优势,有助于选择合适的工具来满足特定的项目需求。
1547 19
|
存储 负载均衡 NoSQL
搭建高可用及负载均衡的Redis
通过本文介绍的高可用及负载均衡Redis架构,可以有效提升Redis服务的可靠性和性能。主从复制、哨兵模式、Redis集群以及负载均衡技术的结合,使得Redis系统在应对高并发和数据一致性方面表现出色。这些配置和技术不仅适用于小型应用,也能够支持大规模企业级应用的需求。希望本文能够为您的Redis部署提供实用指导和参考。
865 9
|
存储 Kubernetes API
在K8S集群中,如何正确选择工作节点资源大小? 2
在K8S集群中,如何正确选择工作节点资源大小?
|
Kubernetes Serverless 异构计算
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
在前一篇文章《基于ACK One注册集群实现IDC中K8s集群添加云上CPU/GPU节点》中,我们介绍了如何为IDC中K8s集群添加云上节点,应对业务流量的增长,通过多级弹性调度,灵活使用云上资源,并通过自动弹性伸缩,提高使用率,降低云上成本。这种直接添加节点的方式,适合需要自定义配置节点(runtime,kubelet,NVIDIA等),需要特定ECS实例规格等场景。同时,这种方式意味您需要自行
基于ACK One注册集群实现IDC中K8s集群以Serverless方式使用云上CPU/GPU资源
|
Kubernetes API 调度
在K8S集群中,如何正确选择工作节点资源大小?1
在K8S集群中,如何正确选择工作节点资源大小?

推荐镜像

更多