k8s下搭建redis集群

记录一下近期实现的在k8s上搭建redis集群的过程

1、新建存储类
主要是为了和其它服务的存储类区分一下
redis-beta-storage
在这里插入图片描述
2、编写configMap
redis启动时从configMap中读取配置
在这里插入图片描述
bind:默认的127.0.0.1可能会导致其它ip地址无法远程访问,因此修改为0.0.0.0
append only: 开启持久化存储模式,为存储提供更好的保护
protected-mode:设置为no 允许其它机器访问
requirepass: 设置密码

3、创建headless-service
headless-service用于有状态应用的场景

  • headless service和普通service的区别
    headless不分配clusterIp
    headless service通过解析service的DNS,返回所有pod的地址和dns
    普通service只能通过解析service的dns,返回service的clusterIp

  • statefulSet和Deployment的区别
    statefulSet下的pod有DNS地址,通过解析pod的dns可以返回pod的ip
    deployment的pod是没有dns的

  • 为什么要使用headless + statefulSet的组合
    第一种:client想要自己决定使用哪个real server,通过dns可以得到real server的信息
    第二种:headless-service关联的每个pod都有自己的dns域名,因此pod可以相互访问,像redis这样集群间需要协作、选举的就需要这样的pod
    由于statefulset中的pod保持有不变的podName dnsName 因此拥有稳定的网络标识

kind: Service
apiVersion: v1
metadata:name: redis-cluster-servicenamespace: tool-betalabels:app: redis-clusterannotations:kubesphere.io/creator: admin
spec:ports:- name: redis-portprotocol: TCPport: 6379targetPort: 6379selector:app: redis-clusterclusterIP: NoneclusterIPs:- Nonetype: ClusterIPsessionAffinity: NoneipFamilies:- IPv4ipFamilyPolicy: SingleStackinternalTrafficPolicy: Cluster

4、部署redis statefulset 共6个

kind: StatefulSet
apiVersion: apps/v1
metadata:name: redis-clusternamespace: tool-betalabels:app: redis-clusterannotations:kubesphere.io/creator: admin
spec:replicas: 6selector:matchLabels:app: redis-clustertemplate:metadata:creationTimestamp: nulllabels:app: redis-clusterannotations:kubesphere.io/creator: adminkubesphere.io/restartedAt: '2024-03-26T06:49:20.735Z'spec:volumes:- name: redis-confconfigMap:name: redis-cluster-config-betadefaultMode: 420containers:- name: redisimage: 'redis:5.0.7'command:- sh- '-c'- redis-server /usr/local/redis/redis.confargs:- '--protected-mode'- 'no'ports:- name: rediscontainerPort: 6379protocol: TCP- name: clustercontainerPort: 16379protocol: TCPresources:limits:cpu: '2'memory: 4000Mirequests:cpu: 100mmemory: 500MivolumeMounts:- name: redis-confmountPath: /usr/local/redis/redis.confsubPath: redis.conf- name: redis-datamountPath: /var/lib/redisterminationMessagePath: /dev/termination-logterminationMessagePolicy: FileimagePullPolicy: IfNotPresentrestartPolicy: AlwaysterminationGracePeriodSeconds: 30dnsPolicy: ClusterFirstnodeSelector:env_type: betagroup_name: toolsecurityContext: {}affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:topologyKey: kubernetes.io/hostnameschedulerName: default-schedulervolumeClaimTemplates:- kind: PersistentVolumeClaimapiVersion: v1metadata:name: redis-datacreationTimestamp: nullspec:accessModes:- ReadWriteManyresources:requests:storage: 1GistorageClassName: redis-beta-storagevolumeMode: Filesystemstatus:phase: PendingserviceName: redis-cluster-servicepodManagementPolicy: OrderedReadyupdateStrategy:type: RollingUpdaterollingUpdate:partition: 0revisionHistoryLimit: 10

全部启动完成后,查看pod的状态
命令 kubectl get pods -n 【namespace】
在这里插入图片描述
查看pvc的情况
kubectl get pvc -n 【namespace】
在这里插入图片描述
查看pod的dns域名
kubectl exec redis-cluster-0 -n tool-beta – hostname -f
在这里插入图片描述
每个pod都会得到集群内的一个dns域名,格式为
$(podname).$(service name).$(namespace).svc.cluster.local
也可以通过临时启动一个pod来验证

kubectl run --rm -i --tty busybox --image=busybox:1.28 /bin/sh
$ nslookup redis-app-0.redis-service

在这里插入图片描述
证明pod间可以解析该dns域名

若Redis Pod迁移或是重启(我们可以手动删除掉一个Redis Pod来测试),IP是会改变的,但是Pod的域名、SRV records、A record都不会改变。

5、初始化redis集群
使用redis-cli来进行集群的初始化

首先查看各pod的ip
在这里插入图片描述
进入到其中一个容器中
在这里插入图片描述
使用命令创建集群

redis-cli --cluster create 192.168.5.127:6379 192.168.135.199:6379 192.168.5.112:6379 -a foobared

得到的信息类似于

在这里插入图片描述
这些master节点的id用来添加slave节点

redis-cli --cluster add-node 10.168.235.225:6379 10.168.235.196:6379 --cluster-slave --cluster-master-id bcae187137a9b30d7dab8fe0d8ed4a46c6e39638 -a foobared

依次给所有master节点添加好子节点后,查看集群情况
进入redis-cli,输入命令cluster info
在这里插入图片描述
cluster nodes

在这里插入图片描述
写入数据、读取数据

注:集群模式需要redis-cli -c进入
在这里插入图片描述
可以看到存储和读取时切换至其它节点

最后重启某个pod,验证是否还能组成集群

在这里插入图片描述
可以看到,即使ip发生了变化,依然组成了集群

这是因为每个node的id是不变了,无论pod如何重启,只要nodeId还在持久卷里存储着,它的网络标识就没有变化

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

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

相关文章

战略定位--选择什么赛道。成为什么样的企业。

2、原则:选择细分赛道,做头部客户 (1)刘伯承:打仗:五行要定、五行不定输的干净、定阵地、了解我情、了解敌情、目标清楚、时间清楚 (2)中小企业不在规模在 (3&#xff09…

揭秘情绪识别:如何让AI读懂你的心声?

最近我在研究大语言模型,想用它来给样本打分。 起初,我尝试让模型用1到5分来评分,但它总是极端地给出最低分或最高分,评分缺乏中间地带。 于是我换了个方法,不再用数字,而是用描述性的词语,比…

【Golang星辰图】加速开发的利器:揭秘Go语言的高效工具集

工具库:提升Go语言开发效率的利器 前言 在现代软件开发中,拥有高效、灵活的工具库是开发人员提高工作效率和简化开发流程的关键。本文将介绍几个优秀的工具库,它们为Go语言开发提供了强大的功能和便捷的工具,帮助开发人员更轻松…

农村集中式生活污水分质处理及循环利用技术指南

立项单位:生态环境部土壤与农业农村生态环境监管技术中心、山东文远环保科技股份有限公司、北京易境创联环保有限公司、中国环境科学研究院、广东省环境科学研究院、中铁第五勘察设计院集团有限公司、中华环保联合会水环境治理专业委员会 本文件规定了集中式村镇生活…

常用的几个ChatGPT网站,国内可用!

🌐 链接: ChatAI 🏷️ 标签: GPT-4 免费体验 付费选项 📝 简介:ChatAI 是一个功能强大的平台,提供GPT-4,不限使用次数,不限Token。用户可以选择包月或是更灵活的按次付…

Discourse 最多允许有几个分类级别

和 DISCUZ 不同,DISCUZ 可以允许分类下面还有分类,再继续分类这种嵌套式分类。 Discourse 最多只允许有 2 个分类。 如果你在已有的分类下再继续分类的话,系统会提示错误: 意思就是子分类不能再分子分类。 Discourse 尽量采取了…

数据结构(六)——图

六、图 6.1 图的基本概念 图的定义 图:图G由顶点集V和边集E组成,记为G (V, E),其中V(G)表示图G中顶点的有限非空集;E(G) 表示图G中顶点之间的关系(边)集合。若V {v1, v2, … , vn},则用|V|…

计算机基础系列 —— 虚拟机代码翻译器(1)

“Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.” ―Linus Torvalds 文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一…

Linux基础 超详细!!!

一、Linux基础命令 (一)Linux的目录结构 1、盘符 Linux中无盘符的概念,只有一个根目录 “/” 也就是只有一棵树) 而windows里面有多棵树,每个盘符都是一棵树的根 在Linux系统中,路径之间的层级关系,使用…

Flutter 使用 AndroidStudio 给(Android 安卓)进行签名方法

一、使用 AndroidStudio 创建签名 使用 AndroidStudio 打开 Flutter项目中的 android 文件夹首次打开 AndroidStudio 会加载一会。菜单栏 : Build -> Generate Signed Bundle APK... 选中 APK -> Next点击Create new....下面按照需求填写即可- 文件夹选择 项…

容器二(List接口)

目录 List 特点和常用方法 List 的常用方法: 两个 List 之间的元素处理 List 中操作索引的常用方法 List是指“有顺序、可重复”的容器。 List接口是Collection接口的子接口,因此Collection 接口中的方法 List 接口都拥有;同时&#xff0…

Oracal执行计划解析

概述 | Id | Operation | Name | Rows | Bytes | TempSpc | Cost (%CPU) | Time | ----------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1…

论文笔记:TALK LIKE A GRAPH: ENCODING GRAPHS FORLARGE LANGUAGE MODELS

ICLR 2024,reviewer评分 6666 1 intro 1.1 背景 当下LLM的限制 限制1:对非结构化文本的依赖 ——>模型有时会错过明显的逻辑推理或产生错误的结论限制2:LLMs本质上受到它们训练时间的限制,将“最新”信息纳入到不断变化的世…

如何注册谷歌邮箱gmail

不知道大家在工作生活中有没有需要用到谷歌邮箱的地方,但是最近我就用到了它。因为注册ChatGPT的事,用了outlook,hotmail邮箱注册的gpt账号都被封了,然后通过各方面的了解,发现谷歌的邮箱是没有问题的,不会…

Portal Particle

Unity3D Portal Particle 2.2传送门粒子效果 链接:https://pan.baidu.com/s/1TCMXIif5d288lXHgixnDPw?pwd1234 下载:资源下载链接 效果图:

生态鱼缸智能养殖,系统架构与框图

功能:自动投食(推拉式电磁铁),温度显示的改进(传感器已经有了),控制灯光(白天亮晚上灭),自动补养/水循环(水氧监测太贵了,根据水温&am…

Redis基础数据结构及操作命令解析

Redis基础数据结构及操作命令解析 Redis有五种基础数据结构,分别为string、list、hash、set、zset。 字符串类型(string) 字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据、JSON化的对…

【前端面试3+1】05v-if和v-show的区别、v-if和v-for能同时使用吗、Vuex是什么?【合并两个有序链表】

一、v-if和v-show的区别 v-if 和 v-show 是 Vue.js 中用来控制元素显示与隐藏的指令。 1.v-if: v-if 是根据表达式的真假值来决定是否渲染元素。当表达式为真时,元素会被渲染到 DOM 中;当表达式为假时,元素不会被渲染到 DOM 中。每…

关于未来自我的发展和一些学习方法(嵌入式方向)

我是一名大二的学生,考研还是就业,到底是重视专业课还是重视数学英语,这些问题一直困扰了我很久,但如今已经有了一些浅显的认识,所以才会想写这样一篇文章来记录一下自己的状态和未来的规划 下面的看法都是个人的看法&…

报错:torch.distributed.elastic.multiprocessing.errors.ChildFailedError:

错误: torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 这个主要是torch的gpu版本和cuda不适配 我的nvcc -V是11.8 torch使用的: pip install torch2.0.1 torchvision0.15.2 torchaudio2.0.2 --index-url https://download.pyt…