k8s部署redis集群

news2024/10/7 16:20:52

写在前面

一般来说,REDIS部署有三种模式。

  1. 单实例模式,一般用于测试环境。
  2. 哨兵模式
  3. 集群模式

后两者用于生产部署

哨兵模式

在redis3.0以前,要实现集群一般是借助哨兵sentinel工具来监控master节点的状态。

如果master节点异常,则会做主从切换,将某一台slave作为master。

引入了哨兵节点,部署更复杂,维护成本也比较高,并且性能和高可用性等各方面表现一般。

集群模式

3.0 后推出的 Redis 分布式集群解决方案

主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用

如果master节点异常,也是会自动做主从切换,将slave切换为master。

总的来说,集群模式明显优于哨兵模式

那么今天我们就来讲解下:k8s环境下,如何部署redis集群(三主三从)?

前置准备

一、nfs安装

  • nfs
# 服务端

# 1.安装
yum -y install nfs-utils # nfs文件系统
yum -y install rpcbind   # rpc协议

# 2.配置(需要共享的文件夹)
vi /etc/exports
/opt/nfs/pv1 *(rw,sync,no_subtree_check,no_root_squash)
/opt/nfs/pv2 *(rw,sync,no_subtree_check,no_root_squash)
/opt/nfs/pv3 *(rw,sync,no_subtree_check,no_root_squash)
/opt/nfs/pv4 *(rw,sync,no_subtree_check,no_root_squash)
/opt/nfs/pv5 *(rw,sync,no_subtree_check,no_root_squash)
/opt/nfs/pv6 *(rw,sync,no_subtree_check,no_root_squash)

# 3.创建文件夹
mkdir -p /opt/nfs/pv{1..6}

# 4.更新配置并重启nfs服务
exportfs -r  #更新配置
systemctl restart rpcbind
systemctl restart nfs
systemctl enable nfs  #开机启动
systemctl enable rpcbind

# 5.验证
showmount -e 192.168.4.xx #服务端验证NFS共享
	> Export list for 192.168.4.xx:
	/opt/nfs/pv6 *
        /opt/nfs/pv5 *
        /opt/nfs/pv4 *
        /opt/nfs/pv3 *
        /opt/nfs/pv2 *
        /opt/nfs/pv1 *

rpcinfo -p #查看端口
	
# 客户端
yum -y install nfs-utils
systemctl restart nfs
systemctl enable nfs  #开机启动

这里说一下,为什么要安装nfs?

是为了下面创建SC,PV做准备,PV需要使用nfs服务器。

二、SC、PV 创建

2.1创建SC

StorageClass:简称sc,存储类,是k8s平台为存储提供商提供存储接入的一种声明。通过sc和相应的存储插件(csi)为容器应用提供持久存储卷的能力。

vi redis-sc.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: redis-sc
provisioner: nfs-storage

名称为redis-sc

执行创建sc:

kubectl apply -f redis-sc.yaml

> storageclass.storage.k8s.io/redis-sc created

通过kuboard查看:

 

2.2创建PV

PersistentVolume简称pv,持久化存储,是k8s为云原生应用提供一种拥有独立生命周期的、用户可管理的存储的抽象设计。

vi redis-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv1
spec:
  storageClassName: redis-sc
  capacity:
    storage: 200M
  accessModes:
    - ReadWriteMany
  nfs:
    server: 192.168.4.xx
    path: "/opt/nfs/pv1"

名称为nfs-pv1,对应的storageClassName为redis-sc,capacity容器200M,accessModes访问模式可被多节点读写

对应nfs服务器192.168.4.xx,对应文件夹路径/opt/nfs/pv1(对应上面安装nfs服务器)

以此类推,我们创建6个pv......

执行创建sc:

 
kubectl apply -f redis-pv.yaml

> persistentvolume/nfs-pv1 created
  persistentvolume/nfs-pv2 created
  persistentvolume/nfs-pv3 created
  persistentvolume/nfs-pv4 created
  persistentvolume/nfs-pv5 created
  persistentvolume/nfs-pv6 created

通过kuboard查看:

 通过kubectl查看:kubectl get sckubectl get pv

 这里说一下,为什么要创建SC,PV?

因为redis集群,最终需要对应的文件有,redis.confnodes.confdata

由此可见,这些文件每个节点,都得对应有自己得文件夹。

当然redis.conf可以是一个相同得,其他两个,就肯定是不一样得。

如果使用挂载文件夹即是 Volume 的情况部署一个pod,很明显,是不能满足的。

当然,你部署多个不一样的pod,也是可以做到,但是就得写6个部署yaml文件,后期维护也很复杂。

最好的效果是,写一个部署yaml文件,然后有6个replicas副本,就对应了我们redis集群(三主三从)。

那一个pod,再使用Volume挂载文件夹,这个只能是一个文件夹,是无法做到6个pod对应不同的文件夹。

所以这里,就引出了SCPV了。

使用SCPV就可以实现,这6个pod启动,就对应上我们创建的6个PV,那就实现了redis.confnodes.confdata,这三个文件,存放的路径,就是不一样的路径了。

哈哈,说了,那么多,不知道,大家明不明白,不明白的可以继续往下看,或者自己部署实操一下,估计你就能明白,为啥要这么干了?

 

三、redis集群搭建

RC、Deployment、DaemonSet都是面向无状态的服务,它们所管理的Pod的IP、名字,启停顺序等都是随机的,而StatefulSet是什么?顾名思义,有状态的集合,管理所有有状态的服务,比如MySQL、MongoDB集群等。

StatefulSet本质上是Deployment的一种变体,在v1.9版本中已成为GA版本,它为了解决有状态服务的问题,它所管理的Pod拥有固定的Pod名称启停顺序,在StatefulSet中,Pod名字称为网络标识(hostname),还必须要用到共享存储。

在Deployment中,与之对应的服务是service,而在StatefulSet中与之对应的headless service,headless service,即无头服务,与service的区别就是它没有Cluster IP,解析它的名称时将返回该Headless Service对应的全部Pod的Endpoint列表。

除此之外,StatefulSet在Headless Service的基础上又为StatefulSet控制的每个Pod副本创建了一个DNS域名,这个域名的格式为:

$(pod.name).$(headless server.name).${namespace}.svc.cluster.local

也即是说,对于有状态服务,我们最好使用固定的网络标识(如域名信息)来标记节点,当然这也需要应用程序的支持(如Zookeeper就支持在配置文件中写入主机域名)。

StatefulSet基于Headless Service(即没有Cluster IP的Service)为Pod实现了稳定的网络标志(包括Pod的hostname和DNS Records),在Pod重新调度后也保持不变。同时,结合PV/PVC,StatefulSet可以实现稳定的持久化存储,就算Pod重新调度后,还是能访问到原先的持久化数据。

以下为使用StatefulSet部署Redis的架构,无论是Master还是Slave,都作为StatefulSet的一个副本,并且数据通过PV进行持久化,对外暴露为一个Service,接受客户端请求。

3.1创建headless服务

Headless service是StatefulSet实现稳定网络标识的基础。

vi redis-hs.yaml

---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
  name: redis-hs
  namespace: jxbp
spec:
  ports:
    - name: nnbary
      port: 6379
      protocol: TCP
      targetPort: 6379
  selector:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
  clusterIP: None

命名空间为:jxbp,名称为:redis-hs

执行:

kubectl apply -f redis-hs.yaml > service/redis-hs created

网络访问:pod名称.headless名称.namespace名称.svc.cluster.local

即:pod名称.redis-hs.jxbp.svc.cluster.local

3.2创建redis对应pod集群

创建好Headless service后,就可以利用StatefulSet创建Redis 集群节点,这也是本文的核心内容。

vi redis.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: redis
  namespace: jxbp
  labels:
    k8s.kuboard.cn/layer: db
    k8s.kuboard.cn/name: redis
spec:
  replicas: 6
  selector:
    matchLabels:
      k8s.kuboard.cn/layer: db
      k8s.kuboard.cn/name: redis
  serviceName: redis
  template:
    metadata:
      labels:
        k8s.kuboard.cn/layer: db
        k8s.kuboard.cn/name: redis
    spec:
      terminationGracePeriodSeconds: 20
      containers:
        - name: redis
          image: 192.168.4.xx/jxbp/redis:6.2.6
          ports:
            - name: redis
              containerPort: 6379
              protocol: "TCP"
            - name: cluster
              containerPort: 16379
              protocol: "TCP"
          volumeMounts:
            - name: "redis-conf"
              mountPath: "/etc/redis/redis.conf"
            - name: "redis-data"
              mountPath: "/data"
      volumes:
        - name: "redis-conf"
          hostPath:
            path: "/opt/redis/conf/redis.conf"
            type: FileOrCreate
  volumeClaimTemplates:
    - metadata:
        name: redis-data
      spec:
        accessModes: [ "ReadWriteMany" ]
        resources:
          requests:
            storage: 200M
        storageClassName: redis-sc

名称为:redis,对应的镜像为:redis:6.2.6

挂载的文件:宿主机的/opt/redis/conf/redis.conf到redis容器的/etc/redis/redis.conf(redis.conf配置文件如下所示)

PVC存储卷声明模板volumeClaimTemplates,指定了名称为redis-sc的SC(storageClassName)

由于之前SC绑定了PV,所以这里的PVC和PV,就能一 一对应绑定上了。

PV和PVC的关系,是一 一绑定的。如果这里不指定SC,那就会导致,PVC绑定PV,是一个混乱的过程,随机绑定PV了。

  • redis.conf
# 一般配置
bind 0.0.0.0
port 6379
daemonize no
requirepass jxbd

# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000

执行:

kubectl apply -f redis.yaml

由上操作,我们已经创建好redis的6个副本了。

因为k8s部署redis集群的篇幅,有点长,剩下的内容,就留着下次分享了。


好了,以上就是我个人的实操了。

个人理解,可能也不够全面,班门弄斧了。

好了,今天就先到这里了!!!^_^

如果觉得有收获的,帮忙点赞、评论、收藏一下呗!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/663030.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机网络管理-网络管理软件SNMPc软件的下载,安装和使用教程说明

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…

树莓派4B移植5G模块驱动(RG200U-CN)

1、查看Linux内核版本 uname -r2、根据内核版本在Github上下载Linux内核源码(最好再Github上确定一下有没有这个分支) git clone --depth1 https://github.com/raspberrypi/linux --branch rpi-5.15.y3、下载依赖库 $ sudo apt update$ sudo apt inst…

【白话机器学习系列】白话 Dropout

白话 Dropout 文章目录 什么是Dropout理解缩放举个例子 什么是Dropout Dropout 是神经网络的一种正则化技术,它在训练时以指定的概率 p p p(常见值为 p 0.5 p0.5 p0.5)丢弃一个单元(连同连接)。在测试时&#xff…

【JUC并发编程】

本笔记内容为狂神说JUC并发编程部分 目录 一、什么是JUC 二、线程和进程 1、概述 2、并发、并行 3、线程有几个状态 4、wait/sleep 区别 三、Lock锁(重点) 四、生产者和消费者问题 五、八锁现象 六、集合类不安全 七、Callable ( 简单 )…

windows10企业版安装西门子博途V15---03安装仿真软件

1、选点这个 2、进入03.SIMATIC_PLCSIM_Advanced_V3,这个是什么东西,它就是真实的硬件设备的仿真软件,也就是说,现在没有真正的PLC硬件,PLC是这样的东西,它是一个硬件产品,而现在不可能去买个硬…

TRUNCATE 语句到底因何而慢?

作者通过源码分析 truncate 语句形成慢 SQL 的原因和解决方案,并与 MySQL 5.7就相关实现逻辑进行对比。 问题现象 收到反馈某测试环境执行批量操作时,有 truncate 语句存在于慢查询日志中。担心上线后可能影响数据库,请求 DBA 配合分析。 …

第八章 模型篇:transfer learning for computer vision

参考教程: transfer-learning transfer-learning tutorial 文章目录 transfer learning对卷积网络进行finetune把卷积网络作为特征提取器何时、如何进行fine tune 代码示例加载数据集构建模型fine-tune 模型模型作为feature extractor 定义train_loop和test_loop定…

【K8S系列】如何高效查看 k8s日志

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

【C#每日一记】多线程实现的贪吃蛇原理—不允许你还不知道

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:uni…

软件测试技能,JMeter压力测试教程(一)

目录 前言 一、安装Java环境 二、安装JMeter环境 三、启动JMeter脚本测试 四、查看报告文件 前言 使用jmeter做压测的时候,在windows上不太稳定,所有一直在 Linux 服务器上使用 jmeter 做压力测试 本篇记录下 Linux上搭建 jmeter 环境&#xff0c…

分布式学习第二天 redis学习

目录 1. 数据库类型 1.1 基本概念 1.2 关系/非关系型数据库搭配使用 2. Redis 2.1 基本知识点 2.2 redis常用命令 2.4 redis数据持久化 3 hiredis的使用 4. 复习 1. 数据库类型 1.1 基本概念 关系型数据库 - sql 操作数据必须要使用sql语句 数据存储在磁盘 存储的…

如何使用CDN给OSS做加速详解

意义 用户直接访问OSS资源,速度会受到OSS下行带宽以及Bucket地域的限制,若通过CDNOSS的方式进行访问,带宽上限更高,并且可以将OSS的资源缓存至就近的CDN节点,通过CDN节点进行分发,可以缩短网络传输距离&am…

Linux学习之CentOS(八)--Linux系统的分区概念

不知不觉已经记录了8篇Linux学习随笔了,虽然还是漂浮在Linux系统的表面,还有很多很多没有学,但是坚持学下去、坚持写下去就是成功的!!!! 在讲Linux系统分区之前,首先得介绍一下硬盘…

【SpringCloud】2.微服务的熔断和降级

目 录 1. 熔 断1.1 发生场景1.2 熔断实现1.3 熔断测试 2. 降 级2.1 发生场景2.2 降级处理2.3 降级测试 在 上篇博客,我们完成了项目的基本搭建工作,那这篇博客就来实现一下微服务的熔断和降级。 1. 熔 断 1.1 发生场景 在前面,我们用 spri…

【Java高级语法】(八)反射机制:有朋友问反射到底是怎样玩的?看完这篇文章你就清楚了~

Java高级语法详解之反射机制 :one: 概念:two: 优势和缺点:three: 使用3.1 Class类3.2 获取类的结构信息- 构造函数3.3 获取类的结构信息- 方法3.4 获取类的结构信息- 字段3.5 动态创建对象、调用方法和设置属性3.6 动态代理 :four: 底层原理:five: 应用场景:ear_of_rice: 总结:…

SedonaSQL 聚合函数使用说明

ST_Envelope_Aggr 函数说明: 返回几何的外边界 语法: ST_Envelope_Aggr (A:geometryColumn) 支持版本: v1.0.0 Spark SQL 举例说明: SELECT ST_Envelope_Aggr(pointdf.arealandmark) FROM pointdf运行示例(AggregateFunctionTest.java): ST_Intersection_Aggr 函数说明: …

大文件如何传输到电脑?亲测又快又简单!

我们平时可以因为各种原因,如更换新电脑、高清视频分享等,需要将大文件传输到另一台电脑上。大文件如何传输到电脑?相信这是很多朋友都想知道如何实现吧。我们为您提供了2种轻松将大文件从PC传输到PC的方法。话不多说,上技巧! 方…

腾讯云服务器地域有什么区别?怎么选比较好

腾讯云服务器地域有什么区别?云服务器地域怎么选择?地域是指云服务器所在机房的地理位置,用户距离地域越近网络延迟越低,速度越快,所以地域就近选择即可。广州上海北京等地域网站域名需要备案,中国香港或其…

SpringBoot使用MockMVC单元测试Controller

前言: 在SpringBoot应用程序中,Controller是接受客户端请求并返回响应数据的核心组件。为了保证Controller的正确性和稳定性,我们可以使用MockMVC框架进行单元测试。MockMVC是Spring框架提供的一个HTTP客户端,用于模拟HTTP请求和响…

2023年智能优化算法之——增长优化器Growth Optimizer(GO),附MATLAB代码

增长优化器的主要设计灵感来源于个人在社会成长过程中的学习和反思机制。学习是个体通过从外部世界获得知识而成长的过程。反思是检查个人自身不足并调整个人学习策略以帮助个人成长的过程。参考文献如下: Zhang, Qingke, et al. “Growth Optimizer: A Powerful M…