k8s下搭建redis集群

news2024/11/30 3:49:24

记录一下近期实现的在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-service
  namespace: tool-beta
  labels:
    app: redis-cluster
  annotations:
    kubesphere.io/creator: admin
spec:
  ports:
    - name: redis-port
      protocol: TCP
      port: 6379
      targetPort: 6379
  selector:
    app: redis-cluster
  clusterIP: None
  clusterIPs:
    - None
  type: ClusterIP
  sessionAffinity: None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster

4、部署redis statefulset 共6个

kind: StatefulSet
apiVersion: apps/v1
metadata:
  name: redis-cluster
  namespace: tool-beta
  labels:
    app: redis-cluster
  annotations:
    kubesphere.io/creator: admin
spec:
  replicas: 6
  selector:
    matchLabels:
      app: redis-cluster
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: redis-cluster
      annotations:
        kubesphere.io/creator: admin
        kubesphere.io/restartedAt: '2024-03-26T06:49:20.735Z'
    spec:
      volumes:
        - name: redis-conf
          configMap:
            name: redis-cluster-config-beta
            defaultMode: 420
      containers:
        - name: redis
          image: 'redis:5.0.7'
          command:
            - sh
            - '-c'
            - redis-server /usr/local/redis/redis.conf
          args:
            - '--protected-mode'
            - 'no'
          ports:
            - name: redis
              containerPort: 6379
              protocol: TCP
            - name: cluster
              containerPort: 16379
              protocol: TCP
          resources:
            limits:
              cpu: '2'
              memory: 4000Mi
            requests:
              cpu: 100m
              memory: 500Mi
          volumeMounts:
            - name: redis-conf
              mountPath: /usr/local/redis/redis.conf
              subPath: redis.conf
            - name: redis-data
              mountPath: /var/lib/redis
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      nodeSelector:
        env_type: beta
        group_name: tool
      securityContext: {}
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - weight: 100
              podAffinityTerm:
                topologyKey: kubernetes.io/hostname
      schedulerName: default-scheduler
  volumeClaimTemplates:
    - kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: redis-data
        creationTimestamp: null
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 1Gi
        storageClassName: redis-beta-storage
        volumeMode: Filesystem
      status:
        phase: Pending
  serviceName: redis-cluster-service
  podManagementPolicy: OrderedReady
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      partition: 0
  revisionHistoryLimit: 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.coloradmin.cn/o/1555926.html

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

相关文章

【软件工程导论】——Visio与StarUML的安装

目录 🕒 1. Visio🕒 2. StarUML 🕒 1. Visio 1、下载Office Tool Plus并安装:🔎 Office Tool Plus官网 2、打开软件 → 部署 → 添加产品 3、这里我选择Visio 2021 专业版 LTSC,确定,随后点击“…

【RedHat】使用cron安排周期性任务——周期性创建用户实例

cron用来管理周期性重复执行的任务调度,非常适合日常系统维护工作。计划任务分为系统的计划任务和用户自定义的计划任务。 cron服务每分钟都检查/etc/crontab文件、/etc/cron.d目录和/var/spool/cron目录中的变化。/var/spool/cron目录下的任务需要通过crontab -e 命…

鸿蒙原生应用开发-网络管理HTTP数据请求

一、场景介绍 应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 二、接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 涉及的接口如下表,具体的…

MSTP环路避免实验(思科)

华为设备参考:MSTP环路避免实验(华为) 一,技术简介 MSTP(多生成树协议),MSTP解决了STP和RSTP没有考虑vlan的问题,STP和RSTP将所有的vlan共享为一个生成树实例,无法实现…

如何备考2024年AMC10:吃透2000-2023年1250道真题(限时免费送)

有家长朋友问,有没有适合初中学生参加的奥数类比赛?我推荐AMC10美国数学竞赛,在国内可以方便地参加,而且每年全国各省市参加的初中生越来越多。关于AMC10详细的介绍和常见问题解答,可以联系我获得。 那么如何在AMC10竞…

基恩士数码显微镜数据采集项目经验分享

在最近的项目中,我有幸参与了基恩士数码显微镜的开发与数据采集工作。这次的经历让我对科学研究中的数据收集和分析有了更深入的了解,我分享我在项目中的角色以及我们所取得的成果。 作为一个科研工作者,我始终被数字化技术在科学研究中的作用…

消息队列经典应用场景

笔者心中,消息队列,缓存,分库分表是高并发解决方案三剑客。 在职业生涯中,笔者曾经使用过 ActiveMQ 、RabbitMQ 、Kafka 、RocketMQ 这些知名的消息队列 。 这篇文章,笔者结合自己的真实经历,和大家分享消息队列的七种经典应用场景。 1 异步&解耦 笔者曾经负责某电…

开源AI引擎:利用影像处理与目标检测技术对违章建筑排查

一、项目案例介绍 随着城市化进程的加快,城市规划和管理工作面临着前所未有的挑战,违章建筑的排查与处理成为了城市管理中的一项重要任务。传统的违章建筑排查方法依赖于人力巡查,效率低下且难以全面覆盖。为了解决这一问题,现代…

【Win】使用PowerShell和Webhooks轻松发送消息至Microsoft Teams

Microsoft Teams是一款由微软开发的团队协作和通讯工具。如果您对这个名字还不太熟悉,那么现在就是一个了解它的好时机。微软将Teams定位为其之前Skype for Business解决方案的继任者,并且它也提供了与其他基于频道的通讯应用程序(例如Slack、…

HarmonyOs开发:轮播图Banner组件封装与使用

前言 轮播图在每个项目中都很常见,鸿蒙中在容器组件中也提供了Swiper组件,用于子组件滑动轮播显示,和前端的使用起来也是异曲同工,我们先看下基本的用法。 Swiper() {ForEach(["1", "2", "3", &quo…

C语言循环结构的程序设计

在C语言中,循环结构是一种重要的控制结构,用于重复执行特定的代码块,直到满足特定的条件为止。循环结构使得程序可以更加灵活和高效地处理重复性的任务,从而提高了程序的可读性和可维护性。本文将深入介绍C语言中循环结构的程序设…

C++王牌结构hash:哈希表开散列(哈希桶)的实现与应用

目录 一、开散列的概念 1.1开散列与闭散列比较 二、开散列/哈希桶的实现 2.1开散列实现 哈希函数的模板构造 哈希表节点构造 开散列增容 插入数据 2.2代码实现 一、开散列的概念 开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址&…

canvas跟随鼠标画有透明度的椭圆边框

提示&#xff1a;canvas跟随鼠标画有透明度的椭圆边框 文章目录 前言一、跟随鼠标画有透明度的椭圆边框总结 前言 一、跟随鼠标画有透明度的椭圆边框 test.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

Web APIs知识点讲解(阶段五)

DOM- 网页特效篇 一.课前回顾(手风琴) <!DOCTYPE html> <html><head lang"en"><meta charset"UTF-8"><title>手风琴</title><style>ul {list-style: none;}* {margin: 0;padding: 0;}div {width: 1200px;heig…

【过度拟合?秒了!】

目录 引言 一、简化模型复杂度 1 .1 特征选择 1.2 降低多项式阶数 1.3 减少神经元数量或层数 二、使用正则化技术 2.1 L1正则化&#xff08;Lasso&#xff09; 工作原理 应用场景 2.2 L2正则化&#xff08;Ridge&#xff09; 2.3 Elastic Net正则化 2.4 代码事例 …

同是3D国漫公司,唯独这家,建模堪称国内天花板?

随着动画《斗罗大陆》播放量破500亿&#xff0c;一脚踹开国漫市场的大门&#xff0c;3D国漫开始迈入“内卷”新阶段。 &#xff08;图&#xff1a;斗罗大陆&#xff1a;双神战双神&#xff09; 同时热门网文改编成为当下国产动画公司的基本选项&#xff0c;包括“双斗”&#…

37-巩固练习(一)

37-1 if语句等 1、问&#xff1a;输出结果 int main() {int i 0;for (i 0; i < 10; i){if (i 5){printf("%d\n", i);}return 0;} } 答&#xff1a;一直输出5&#xff0c;死循环 解析&#xff1a;i5是赋值语句&#xff0c;不是判断语句&#xff0c;每一次循…

redis 保存是否可以更快?

redis 常见用法之保存 在java项目很多人都喜欢用spring-boot-starter-data-redis下的StringRedisTemplate操作redis,大多项目也用作为缓存&#xff0c;他们最常见的保存key value代码&#xff0c;如下&#xff1a; stringRedisTemplate.opsForValue().set(key, value); 大家都…

蓝桥杯算法题练习

1、20世纪有多少个星期一 &#xff08;1901、1、1——2000、12、31&#xff09; 方法一&#xff1a;python代码 方法二&#xff1a;excel工具(设置单元格格式&#xff0c;把日期换成周几的形式) 2、100个数相乘&#xff0c;结果有几个0 3、切面条 找规律:对折次数n 弯2^n-1 面…

springboot准妈妈孕期交流平台

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;准妈妈孕期交流平台当然也不能排除在外。准妈妈孕期交流平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发…