【k8s安装redis】k8s环境无pvc的情况下安装redis哨兵集群

文章目录

      • 简介
      • 一.条件及环境说明:
      • 二.需求说明:
      • 三.实现原理及说明
      • 四.详细步骤
        • 4.1.规划节点标签
        • 4.2.创建configmap配置
        • 4.3.创建三个statefulset和service headless配置
        • 4.4.创建哨兵deployment配置和service配置
      • 五.安装说明

简介

k8s集群中搭建有状态的服务会相对较麻烦,像搭建redis目前比较主流的做法主要是采用共享存储ceph、nas来实现数据的持久化存储,有的是通过采用节点亲和性和hostpath来实现,目前的operator的基本都是采用共享存储的方法。本文将根据现有环境及不同需求将redis集群的搭建采用hostpath+亲和性的权重+多副本来实现redis服务的数据持久化和高可用。

一.条件及环境说明:

k8s版本k8s-1.29.4,环境搭建在电信机房,六个worker节点,每个节点有一块非系统盘的ssd盘挂载到/data/路径,不采用ceph或nas之类的共享存储,也未采用operator,目前redis-operator基本都是采用了共享存储。

二.需求说明:

  • 搭建redis哨兵集群。
  • 高可用:有一个k8s节点死掉或重启pod之后也不影响使用。
  • 高性能:读写本地磁盘实现高性能的io,共享存储如果资源及硬件性能不够的话,io将会是性能瓶颈。
  • 数据安全:在发生切换,节点故障以后,数据要尽可能的保证完整
  • 安装简单、管理维护容易

三.实现原理及说明

    1. 搭建redis哨兵集群,一主两从,三个哨兵进程。
    1. redis采用三个独立的statefulset,一个副本进行搭建,哨兵进程则采用一个deployment,三个副本搭建。
    1. redis进程采用节点亲和性及权重实现主备节点。
    1. redis采用 service headless服务,哨兵采用service 服务。
    1. 一组两从并根据权重主备,需要规划好六个节点的标签名称。

注:该方案搭建的redis,只有k8s集群内才能使用,不能通过LoadBlancer或NodePort的形式提供给集群外使用,因为哨兵内选举的主redis的IP都是pod的IP,当发生切换后,无法确定主redis是哪个。

四.详细步骤

4.1.规划节点标签
节点名称角色标签
k8s-worker-120-81storage-selector=node-a-master
k8s-worker-120-82storage-selector=node-b-master
k8s-worker-120-83storage-selector=node-c-master
k8s-worker-120-84storage-selector=node-a-slve
k8s-worker-120-85storage-selector=node-a-slve
k8s-worker-120-86storage-selector=node-a-slve

注:这里的角色划分是指:redis由于是一主两从,每个redis的pod分别落在三个主的节点上,当主节点发生故障是,就切换到备节点,例如:名称为defaultapp-redis-a-0的pod,默认落在标签为storage-selector=node-a-master的节点上,当该节点发生故障是,就会根据权重匹配罗在storage-selector=node-a-slve的节点上。

4.2.创建configmap配置

配置中包含四个文件分布说明如下:
sentinel.conf:哨兵配置文件,默认先将第一个statefulset作为主redis,其中配置:resolve-hostnames 支持主机名。
redis-master.conf:主redis配置文件,内存配置成256M,配置端口为6379,配置密码:redis#123,存储路径是/data/redis。
redis.conf:从redis配置文件,内存配置成256M,配置端口为6380,配置密码:redis#123,存储路径是/data/redis-2,并配置从主redis同步数据。
run.sh:主要作用就是判断角色运行不同的配置文件,并根据主机名创建目录,然后软连接到存储目录。这一步主要是将各自服务的redis数据存放到自己的目录,当创建新的redis的时候不会导致节点上的目录冲突。

apiVersion: v1
kind: ConfigMap
metadata:name: defaultapp-redis-confignamespace: default-nslabels:appname: default-appapp: defaultapp-redis-config
data:sentinel.conf: |sentinel monitor mymaster defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379 2sentinel auth-pass mymaster redis#123sentinel down-after-milliseconds mymaster 30000sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000SENTINEL resolve-hostnames yesSENTINEL announce-hostnames yesredis-master.conf: |maxmemory 256mbrequirepass redis#123save 3600 1 300 10 60 100dir /data/redismasterauth redis#123redis.conf: |maxmemory 256mbrequirepass redis#123save 3600 1 300 10 60 100dir /data/redisreplicaof defaultapp-redis-a-0.defaultapp-redis-a.default-ns.svc.cluster.local 6379masterauth redis#123run.sh: |#!/bin/shrole=$1hname=$(hostname)if [ $role == "master" ];thenecho "run redis master"[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname[ -d /data ] || mkdir /dataln -s /home/redis/$hname /data/redisredis-server /etc/redis/redis-master.confelif [ $role == "sentinel" ];thenecho "run redis sentinel"mkdir -p /etc/rediscp /home/redis/sentinel.conf /etc/redis/redis-sentinel /etc/redis/sentinel.confelseecho "run redis slave"[ -d /home/redis/$hname ] || mkdir -p /home/redis/$hname[ -d /data ] || mkdir /dataln -s /home/redis/$hname /data/redisredis-server /etc/redis/redis.conffi
4.3.创建三个statefulset和service headless配置

【1】 defaultapp-redis-a的statefulset及service headless配置

apiVersion: apps/v1
kind: StatefulSet
metadata:name: defaultapp-redis-anamespace: default-nslabels:appname: default-appapp: defaultapp-redis-a
spec:serviceName: "defaultapp-redis-a"replicas: 1selector:matchLabels:app: defaultapp-redis-atemplate:metadata:labels:app: defaultapp-redis-aspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 80preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-a-master- weight: 20preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-a-slavecontainers:- name: redis-serverimage: pcgroup-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/redis:7.2.5-alpine3.20imagePullPolicy: IfNotPresentports:- containerPort: 6379command: ["/bin/sh","/etc/redis/run.sh"]args: ["master"]volumeMounts:- name: redis-config-volumemountPath: /etc/redis/- name: redis-datamountPath: /home/redisrestartPolicy: Alwaysvolumes:- name: redis-datahostPath:path: /data/redis_datatype: ""- name: redis-config-volumeconfigMap:name: defaultapp-redis-configtolerations:- key: node.kubernetes.io/not-readyoperator: Existseffect: NoExecutetolerationSeconds: 3600- key: node.kubernetes.io/unreachableoperator: Existseffect: NoExecutetolerationSeconds: 3600
---
apiVersion: v1
kind: Service
metadata:name: defaultapp-redis-anamespace: default-nslabels:appname: default-appapp: defaultapp-redis-a
spec:ports:- port: 6379clusterIP: Noneselector:app: defaultapp-redis-a

配置说明

      affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 80preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-a-master- weight: 20preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-a-slave

该段配置主要是配置节点的亲和性和权重,当pod匹配的标签storage-selector=node-a-master 时,权重是80,而storage-selector=node-a-slave的权重只有20,则将pod分配到node-a-master节点。而当该node-a-master节点死机以后,pod产生调度会进行标签匹配,当无法匹配到node-a-master时,则会匹配到node-a-slave,这是会将pod调度到node-a-slave上。

      tolerations:- key: node.kubernetes.io/not-readyoperator: Existseffect: NoExecutetolerationSeconds: 3600- key: node.kubernetes.io/unreachableoperator: Existseffect: NoExecutetolerationSeconds: 3600

默认情况下节点死机以后,pod根据默认值大概会在四分钟之内进行调度。该段配置是控制pod在多久时间进行调度,当节点出现not-ready和unreachable时,在3600s以内不会进行调度执行。其实该值是避免正常的维护重启或偶尔出现的网络波动导致pod频繁调度的情况。由于redis的哨兵集群是采用了三个副本,及时一个节点挂了,不影响服务。当节点长时间不服务时,可以给pod的调度设置一个合适的时间。

【2】 defaultapp-redis-b的statefulset及service headless配置

apiVersion: apps/v1
kind: StatefulSet
metadata:name: defaultapp-redis-bnamespace: default-nslabels:appname: default-appapp: defaultapp-redis-b
spec:serviceName: "defaultapp-redis-b"replicas: 1selector:matchLabels:app: defaultapp-redis-btemplate:metadata:labels:app: defaultapp-redis-bspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 80preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-b-master- weight: 20preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-b-slavecontainers:- name: redis-serverimage: pcgroup-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/redis:7.2.5-alpine3.20imagePullPolicy: IfNotPresentports:- containerPort: 6379command: ["/bin/sh","/etc/redis/run.sh"]args: ["slave"]volumeMounts:- name: redis-config-volumemountPath: /etc/redis/- name: redis-datamountPath: /home/redisrestartPolicy: Alwaysvolumes:- name: redis-datahostPath:path: /data/redis_datatype: ""- name: redis-config-volumeconfigMap:name: defaultapp-redis-configtolerations:- key: node.kubernetes.io/not-readyoperator: Existseffect: NoExecutetolerationSeconds: 3600- key: node.kubernetes.io/unreachableoperator: Existseffect: NoExecutetolerationSeconds: 3600
---
apiVersion: v1
kind: Service
metadata:name: defaultapp-redis-bnamespace: default-nslabels:appname: default-appapp: defaultapp-redis-b
spec:ports:- port: 6379clusterIP: Noneselector:app: defaultapp-redis-b

【3】 defaultapp-redis-c的statefulset及service headless配置

apiVersion: apps/v1
kind: StatefulSet
metadata:name: defaultapp-redis-cnamespace: default-nslabels:appname: default-appapp: defaultapp-redis-c
spec:serviceName: "defaultapp-redis-c"replicas: 1selector:matchLabels:app: defaultapp-redis-ctemplate:metadata:labels:app: defaultapp-redis-cspec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 80preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-c-master- weight: 20preference:matchExpressions:- key: storage-selectoroperator: Invalues:- node-c-slavecontainers:- name: redis-serverimage: pcgroup-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/redis:7.2.5-alpine3.20imagePullPolicy: IfNotPresentports:- containerPort: 6379command: ["/bin/sh","/etc/redis/run.sh"]args: ["slave"]volumeMounts:- name: redis-config-volumemountPath: /etc/redis/- name: redis-datamountPath: /home/redisrestartPolicy: Alwaysvolumes:- name: redis-datahostPath:path: /data/redis_datatype: ""- name: redis-config-volumeconfigMap:name: defaultapp-redis-configtolerations:- key: node.kubernetes.io/not-readyoperator: Existseffect: NoExecutetolerationSeconds: 3600- key: node.kubernetes.io/unreachableoperator: Existseffect: NoExecutetolerationSeconds: 3600
---
apiVersion: v1
kind: Service
metadata:name: defaultapp-redis-cnamespace: default-nslabels:appname: default-appapp: defaultapp-redis-c
spec:ports:- port: 6379clusterIP: Noneselector:app: defaultapp-redis-c
4.4.创建哨兵deployment配置和service配置

哨兵进程配置文件

apiVersion: apps/v1
kind: Deployment
metadata:name: defaultapp-redis-sentinelnamespace: default-nslabels:appname: default-appapp: defaultapp-redis-sentinel
spec:replicas: 3selector:matchLabels:app: defaultapp-redis-sentineltemplate:metadata:labels:app: defaultapp-redis-sentinelspec:containers:- name: redis-sentinelimage: pcgroup-registry-vpc.cn-shenzhen.cr.aliyuncs.com/public/redis:7.2.5-alpine3.20ports:- containerPort: 26379command: ["/bin/sh","/home/redis/run.sh"]args: ["sentinel"]volumeMounts:- name: redis-config-volumemountPath: /home/redisrestartPolicy: Alwaysvolumes:- name: redis-config-volumeconfigMap:name: defaultapp-redis-config
---
apiVersion: v1
kind: Service
metadata:name: defaultapp-redis-sentinelnamespace: default-nslabels:appname: default-appapp: defaultapp-redis-sentinel
spec:ports:- port: 26379targetPort: 26379type: LoadBalancerselector:app: defaultapp-redis-sentinel

五.安装说明

  • 需要先在k8s的节点创建/data/redis_data的路径来存放数据。
  • 使用配置前将配置中的defaultapp替换成自己需要的命名,配置的命名空间为:default-ns,修改成自己的命名空间,appname为default-app,修改成自己的应用名称,该标签也可以删除。
  • 配置中的镜像地址采用了私有的镜像地址,镜像是dockerhub上下载的redis:7.2.5-alpine3.20镜像到私有镜像仓库的,如果能直通外网的k8s可以直接用redis:7.2.5-alpine3.20。否则配置一个可以通的镜像地址。
  • redis.conf或redis-master.conf,sentinel.conf中的密码redis#123替换成自己的密码。
  • 启动时是以第一个statefulset:defaultapp-redis-a 作为主节点的。
  • 节点标签的命名规则若有更改需要在每个statefulset中的affinity: 中的标签名称进行修改。

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

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

相关文章

大模型备案全网最详细流程说明【附附件】

下图为最新的直至第五批深度合成服务算法备案信息的公告 根据目前公开的国内大模型算法备案统计来看,首批境内深度合成服务算法备案清单,总共通过了五批。 以第二批举例,境内深度合成服务算法备案清单,总共通过110家&…

秒与时间转换器

目录 开头程序程序的流程图程序输入与输出的效果例1输入输出 例2输入输出 例3输入输出 结尾 开头 大家好,我叫这是我58。在这里,我要给大家介绍一下我用C语言编译的秒与时间转换器和与之相关的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #in…

基于FaceX-Zoo里的faceSDK实现人脸识别(与人脸库结合比对人脸)

目录 一、简介 二、face SDK 1、环境需要 2、功能实现 2.1人脸库搭建 2.2人脸识别 3、测试结果 4、总结 本文根据京东开源的人脸识别工具包FaceX-Zoo,实现了人脸识别功能。对代码中的faceSDK部分做了修改,并搭建了自己的人脸库,识别结果准确度较高,后期可以打包SDK…

HTTP Client

从jdk9开始引入HTTP Client标准化,在jdk10开始更新。通过CompletableFutures提供了非阻塞请求和响应式。流量控制在java.util.concurrent.Flow API提供支持。更容易的跟踪数据流:从用户请求发布者和响应订阅者,一直到底层套接字。 public void get(String uri) throws Exce…

uni app for()在App上不运行

项目场景&#xff1a; uniapp单选 文字 显示 text &#xff1a; 问题描述 h5 有效 安卓App 无效 for(var i 0;i<from.length();i){}解决方案&#xff1a; this.from.forEach((itme,index)>{this.sex.push({value:itme.nodeCode,text:itme.nodeName});this.sex1.pus…

Python的异常处理(与C++对比学习)

一、C语言中错误的处理方式 用assert来判断一个表达式是否出错&#xff1b;在调用接口函数时&#xff0c;接口函数会设置errno&#xff0c;我们可以通过errno&#xff0c;strerror(errno)来拿到错误码和错误信息。在自定义函数中&#xff0c;我们设置函数错误信息处理的时候&a…

告别堆积,迎接清新:回收小程序,打造无废生活新选择

在快节奏的现代生活中&#xff0c;物质的丰富与便利似乎成为了我们日常的一部分&#xff0c;但随之而来的&#xff0c;是日益增长的废弃物堆积问题。街道边、社区里&#xff0c;甚至是我们的家中&#xff0c;废弃物品仿佛无孔不入&#xff0c;逐渐侵蚀着我们的生活空间与环境质…

element-tree树半勾选+根据id查找树的某一项

需要添加定时器才可以及时勾选上 // 半勾选回显permissions && permissions.forEach(item > {const a setTimeout(() > {this.$nextTick(() > {this.$refs.menuTreeRef.setChecked(Number(item), true, false)clearTimeout(a)})this.$forceUpdate()}, 100)})…

基于Netty的自研流系统缓存实现挑战: 内存碎片与OOM困境

01 前言 Kafka 作为流处理平台&#xff0c;在实时流计算和在线业务场景&#xff0c;追尾读追求端到端低延迟。在离线批处理和削峰填谷场景&#xff0c;数据冷读追求高吞吐。两个场景都需要很好的数据缓存设计来支撑&#xff0c;Apache Kafka 的数据存储在本地文件&#xff0c…

抖音蓝V商家采集软件使用指南

抖音是目前非常流行的短视频平台之一&#xff0c;许多商家在抖音上通过发布视频来推广自己的产品和品牌。而蓝V商家采集软件是一款可以帮助商家快速采集蓝V用户信息的工具。本文将为大家介绍如何使用抖音蓝V商家采集软件&#xff0c;并提供相应的代码示例。 安装和配置抖音蓝V商…

pointnet2_ops_lib/.安装报错解决方案

问题 3D点云相关的代码例如pointnn、pointmlp都需要安装pointnet2_ops&#xff0c;可是基本上在安装pointnet2_ops时总会报错&#xff0c;终归原因是虚拟环境的cuda版本和安装的torch&#xff0c;torchvision&#xff0c; torchaudio版本不一致导致。 方案 这里以pointmlp&am…

智能信息检索:布尔查询

函数介绍&#xff1a; 本次实验利用了上一次实验构建成功的倒排表 send为评测提交函数 and_search为AND逻辑布尔查询 and_search_sort增添了相关度排序的功能 mul_search函数接受不同参数来确定查询的逻辑 test支持用户手动输入测试 代码实现&#xff1a; bool_search.…

Sharding-JDBC分库分表之SpringBoot主从配置

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 前言 在开发中&#xff0c;如果对数据库的读和写都在一个数据服务器中操作&#xff0c;面对日益增加的访问量&#x…

解锁算力新极限,Xilinx UltraScale+赋能的高性能低延时FPGA加速卡

01、产品概述 AiHPC-V9P 是一款基于 AMD Virtex UltraScale FPGA VU9P 的 PCIe Gen3.0 x16 接口智能网卡&#xff0c;具有最大2*200GbE /或者16*10GbE(典型应用&#xff09;接入容量的高性能低延时智能网卡。 对外接口支持两组QSFP-DD 最高25Gb/s x8Lane 光口接入&#xf…

数据库系统概论 | MySQL | 数据定义 | 单表查询 | 嵌套查询 | 连接查询 | 带有谓词的查询

数据定义 模式的定义与删除 定义模式与删除模式&#xff1a; CREATE SCHEMA S_C_SC; DROP SCHEMA S_C_SC;进入模式&#xff1a; USE S_C_SC;建立学生表&#xff1a; CREATE TABLE Student (Sno CHAR(8) PRIMARY KEY, Sname VARCHAR(20) UNIQUE, Ssex CHAR(6), Sbirthdate …

【Sql Server】sql server 2019设置远程访问,外网服务器需要设置好安全组入方向规则

大家好&#xff0c;我是全栈小5&#xff0c;欢迎来到《小5讲堂》。 这是《Sql Server》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言1、无法链接…

分享四款常见的内网穿透工具

本文精心筛选了四款业内领先的内网穿透解决方案&#xff1a;巴比达、花生壳、Frp及NatApp&#xff0c;旨在全面展现它们在安全、便捷与灵活性方面的独到之处&#xff0c;尤其是对花生壳、Frp和NatApp进行了详尽补充&#xff0c;以帮助读者更好地理解这些工具的内在价值。 1. 巴…

北斗防爆手持终端在化工厂的安全性能分析

北斗防爆手持终端在化工厂中的应用显著提升了安全性能&#xff0c;其卓越的防爆设计、高精度定位与监控功能、实时通信能力以及多功能集成特性&#xff0c;共同构筑了化工厂安全生产的坚实防线&#xff0c;确保了巡检人员与设备在复杂环境下的安全作业与高效管理。 北斗防爆手持…

AE-图层

目录 图层初体验 项目、合成和图层的关系 图层的通用参数 锚点&#xff08;快捷键A&#xff09; 位置&#xff08;快捷键P&#xff09; 缩放&#xff08;快捷键S&#xff09; 旋转&#xff08;快捷键R&#xff09; 不透明度&#xff08;快捷键T&#xff09; 向后平移锚…

实时监测、智能预警:电缆光纤测温系统|原理、应用与前景

实时监测、智能预警&#xff1a;电缆光纤测温系统|原理、应用与前景 电缆光纤测温系统&#xff0c;作为现代电力系统中不可或缺的一部分&#xff0c;以其独特的优势在电缆安全监控领域发挥着日益重要的作用。该系统利用光纤传感技术&#xff0c;实时监测电缆的运行温度&#x…