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.hqwc.cn/news/578807.html

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

相关文章

【基于springboot分析Quartz(v2.3.2)的启动流程】

基于springboot分析Quartz(v2.3.2)的启动流程 最近公司的定时任务使用了Quartz框架,在开发中经常出现定任务不执行了的问题,但是我又找不到原因所在,可把我愁坏了。于是我决定看看Quartz框架是怎么调度任务的。&#x…

课时79:流程控制_循环控制_控制解析

1.4.1 控制解析 学习目标 这一节,我们从 基础知识、简单实践、小结 三个方面来学习。 基础知识 简介 所谓的流程控制,主要针对的是,当我们处于流程步骤执行的过程中,因为某些特殊的原因,不得不停止既定的操作进行步…

去除图像背景的工具(轻量级,批量式)

GitHub地址:danielgatis/rembg:Rembg 是一种去除图像背景的工具 (github.com) 博主在最近做一个比赛项目,然后数据用的是网上爬取的,所以数据有点脏,想清洗一下图像数据,恰好这次看到了个GitHub里面有开源去除背景的库,所以拿来用了,用了之后发现效果还是很不错的,…

更改chatglm认知

ChatGLM-Efficient-Tuning 下载源代码 下载ChatGLM-Efficient-Tuning 解压 创建虚拟环境 conda create --prefixD:\CondaEnvs\chatglm6btrain python3.10 cd D:\ChatGLM-Efficient-Tuning-main conda activate D:\CondaEnvs\chatglm6btrain安装所需要的包 pip install -r…

Arduino IDE导出esp8266工程编译后的bin文件

一、导出bin文件的方法一 1.通过IDE直接导出,选择 项目 --> 导出已编译的二进制文件,会在工程下生成 build 文件夹,里面有导出的bin文件。 一、导出bin文件的方法二 通过临时文件,找到生成的bin文件。 临时文件的位置&#…

VsCode正确解决vue3+Eslint+prettier+Vetur的配置冲突

手把手教你VsCode正确解决vue3EslintprettierVetur的配置冲突 VsCode正确解决vue3EslintprettierVetur的配置冲突Eslint文档查看和修改规则:step1:首先快速浏览下规则简要setp2: ctrlF 搜索你要配置规则的英文名,例如attributesetp3: 修改配置…

小程序UI设计规范,界面设计尺寸详解

作为互联网技术的重要组成部分,小程序在日常生活中发挥着越来越重要的作用。因此,了解和严格遵守小程序的 UI 设计标准非常重要,它不仅可以帮助我们在保证良好用户体验的同时优化小程序,还可以使我们的产品在竞争激烈的市场中占据…

Kubernetes-running app on kube

Docker 安装Docker 首先,您需要在Linux机器上安装Docker。如果您不使用Linux,则需要启动一个Linux虚拟机(VM)并在该虚拟机中运行Docker。如果你使用的是Mac或Windows系统,并按照指令安装Docker, Docker将为你建立一个虚拟机,并在…

速通汇编(二)汇编mov、addsub指令

一,mov指令 mov指令的全称是move,从字面上去理解,作用是移动(比较确切的说是复制)数据,mov指令可以有以下几种形式 无论哪种形式,都是把右边的值移动到左边 mov 寄存器,数据&#…

数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅱ)

1.数据查询 SELECT [ ALL | DISTINCT] <目标列表达式>[&#xff0c;<目标列表达式>] … FROM <表名或视图名>[&#xff0c; <表名或视图名> ] … [ WHERE <条件表达式> ] [ GROUP BY <列名1> [ HAVING <条件表达式> ] ] [ ORDER BY…

Elment ui 动态表格与表单校验 列表数据 组件

组件做个记录&#xff0c;方便以后会用到。 效果&#xff1a; 代码 &#xff1a; <template><el-dialog title"商品详情" :visible.sync"dialogVisible" width"80%"><el-tabs v-model"activeTab"><el-tab-pane…

esp单片机下arduino_gfx不相干显示驱动优化对flash空间的占用对比

一般情况下&#xff0c;很多esp32或者esp8266下的tft模块驱动都会包含很多种&#xff0c;而我们只需要其中一种&#xff0c;那就有个疑问这些被编译进的显示驱动到底占用了多少空间&#xff0c;是否需要把他优化掉&#xff1f; 这是默认的驱动列表&#xff1a; 84个文件&…