K8S部署redis三主三从标准集群

news/2024/4/24 16:05:55/

docker pull redis:6.0

参考文章:

k8s-1.2.3部署redis-cluster+predixy代理集群 - 知乎

1、Redis部署在K8S中注意事项

1.1、Redis是一个有状态应用,不应使用deployment方式部署

        当我们把redis以pod的形式部署在k8s中时,每个pod里缓存的数据都是不一样的,而且pod的IP是会随时变化,这时候如果使用普通的deployment和service来部署redis-cluster就会出现很多问题,因此需要改用StatefulSet + Headless Service来解决。


1.1.1 StatefulSet是k8s中专门用于解决有状态应用部署的一种资源

  •    StatefulSet管理的每个Pod都有唯一的文档/网络标识,并且按照数字规律生成,而不是像Deployment中那样名称和IP都是随机的(比如StatefulSet名字为redis,那么pod名就是redis-0, redis-1 ...)
  •   StatefulSet中ReplicaSet的启停顺序是严格受控的,操作第N个pod一定要等前N-1个执行完才可以。
  •   StatefulSet中的Pod采用稳定的持久化储存,并且对应的PV不会随着Pod的删除而被销毁。

1.1.2 Headless Service就是没有指定Cluster IP的Service

相应的,在k8s的dns映射里,Headless Service的解析结果不是一个Cluster IP,而是它所关联的所有Pod的IP列表。


1.1.3 StatefulSet必须要配合Headless Service使用

它会在Headless Service提供的DNS映射上再加一层,最终形成精确到每个pod的域名映射,格式如下`$(podname).$(headless service name)`,有了这个映射,就可以在配置集群时使用域名替代IP,实现有状态应用集群的管理。


1.2、Redis数据持久化


redis虽然是基于内存的缓存,但还是需要依赖于磁盘进行数据的持久化,以便服务出现问题重启时可以恢复已经缓存的数据。在集群中,我们需要使用共享文件系统 + PV(持久卷)的方式来让整个集群中的所有pod都可以共享同一份持久化储存。


1.3、Redis集群配置

关于通过storageClass创建PVC自动分配PV,请参考文章:K8S使用持久化卷存储到NFS(NAS盘)_雨花山人的博客-CSDN博客

中的4.2 构建能自动分配PV的storageClass 章节。

1.3.1 部署6个POD

直接执行如下文件,可以在zo-dev空间下创建6个redis pod及无头service,并把redis的文件挂载到远程NFS上。

#### redis-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: redis-cluster-devnamespace: zo-dev
# 注意下面data中不能有任何注释,否则会导致应用启动不了
data:fix-ip.sh: |#!/bin/shCLUSTER_CONFIG="/data/nodes.conf"if [ -f ${CLUSTER_CONFIG} ]; thenif [ -z "${POD_IP}" ]; thenecho "Unable to determine Pod IP address!"exit 1fiecho "Updating my IP to ${POD_IP} in ${CLUSTER_CONFIG}"sed -i.bak -e '/myself/ s/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/'${POD_IP}'/' ${CLUSTER_CONFIG}fiexec "$@"redis.conf: |cluster-enabled yescluster-config-file /data/nodes.confcluster-node-timeout 10000protected-mode nodaemonize nopidfile /var/run/redis.pidport 6379tcp-backlog 511bind 0.0.0.0timeout 3600tcp-keepalive 1loglevel verboselogfile /data/redis.logdatabases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir /datarequirepass 123456appendonly yesappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mblua-time-limit 20000slowlog-log-slower-than 10000slowlog-max-len 128#rename-command FLUSHALL  ""latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-entries 512list-max-ziplist-value 64set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes
---
###  redis-statefulset.yaml  暴露一个无头的集群服务,即不分配集群IP
apiVersion: v1
kind: Service
metadata:namespace: zo-devname: redis-cluster-dev
spec:clusterIP: Noneports:- port: 6379targetPort: 6379name: client- port: 16379targetPort: 16379name: gossip  # 集群三主三从互相之间的通信端口selector:app: redis-cluster-dev
---
###  redis-statefulset.yaml  部署StatefulSet类型的应用6个POD,把redis的data通过storageclass产生pvc/pv备份到远端的NFS服务器
###  关于storeageclass部署参看 https://blog.csdn.net/tzszhzx/article/details/130241866 的4.2 构建能自动分配PV的storageClass
apiVersion: apps/v1
kind: StatefulSet
metadata:namespace: zo-devname: redis-cluster-dev
spec:serviceName: redis-cluster-devpodManagementPolicy: OrderedReadyreplicas: 6selector:matchLabels:app: redis-cluster-devtemplate:metadata:labels:app: redis-cluster-devspec:affinity:podAntiAffinity: #定义pod反亲和性,目的让6个pod不在同一个主机上,实现均衡分布requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- redis-cluster-devtopologyKey: "kubernetes.io/hostname"containers:- name: redisimage: redis:6.0ports:- containerPort: 6379name: client- containerPort: 16379name: gossipcommand: ["/etc/redis/fix-ip.sh", "redis-server", "/etc/redis/redis.conf"]  # 系统启动时把pod ip写入到redis.conf配置文件中env:- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIPvolumeMounts:- name: confmountPath: /etc/redis/readOnly: false- name: datamountPath: /datareadOnly: falsevolumes:- name: confconfigMap:name: redis-cluster-devdefaultMode: 0755   # 类似chmod 0755volumeClaimTemplates:- metadata:name: dataannotations:volume.beta.kubernetes.io/storage-class: "dev-nfs-storage"  # 通过storage-class把data数据备份到NFS上,会自动产生10G PVC声明 / 绑定自动产生的 PV,关于storeageclass部署参看 https://blog.csdn.net/tzszhzx/article/details/130241866 的4.2 构建能自动分配PV的storageClassspec:accessModes:- ReadWriteManyresources:requests:storage: 10Gi

1.3.2 设置三主三从

k8s-1.2.3部署redis-cluster+predixy代理集群 - 知乎   这篇文章通过自己构建一个redis镜像后通过redis-trib.rb来更便捷的实现redis集群的搭建。

我这里使用是直接进入某个POD,手动执行命令来搭建redis集群。不过可以看到nacos的集群搭建比上面2个方法更简单。K8S实战_雨花山人的博客-CSDN博客 9、K8S部署nacos集群 更加便捷。

  •  查看所有的redis node节点IP(k8s分配的IP)

查看6个POD部署在哪些node上,并可以查看某个pord被分配的IP。

kubectl get pods -n zo-dev  -o wide|grep redis-cluster-dev

更推荐下面的命令一次性可以看到所有的节点部署在哪个服务器上,注意6379后面带个空格

kubectl get pods -l app=redis-cluster-dev -n zo-dev -o jsonpath='{range.items[*]}{.status.podIP}:6379 '

会输出:

10.244.2.13:6379 10.244.16.12:6379 10.244.11.5:6379 10.244.8.25:6379 10.244.17.22:6379 10.244.9.14:6379

  • 随便选择一台node节点进入pod,或者通过k8s的dashborad中进入页
kubectl exec -it redis-cluster-dev-4 -n zo-dev -- sh
  • 拷贝如上IP端口执行该命令产生一个redis集群,并分配16384个hash槽。

        无密码不需要-a 123456

redis-cli -a 123456 --cluster create --cluster-replicas 1 10.244.2.13:6379 10.244.16.12:6379 10.244.11.5:6379 10.244.8.25:6379 10.244.17.22:6379 10.244.9.14:6379
  • 部署成功后,也可以通过该命令查看集群信息
kubectl exec -it redis-cluster-dev-0 -n zo-dev -- redis-cli -a 123456 cluster info


http://www.ppmy.cn/news/46639.html

相关文章

ADIDAS阿里纳斯励志广告语

系列文章目录 精选优美英文短文1——Dear Basketball(亲爱的篮球)精选优美英文短文2——Here’s to the Crazy Ones(致疯狂的人)“我祝你不幸并痛苦”——约翰罗伯茨毕业致辞“亲爱的波特兰——CJ麦科勒姆告别信” Hi, I’m Gilb…

Python爬虫

目录 爬虫总览 准备工作 一、爬虫基础 1、爬虫前导 1.1、爬虫介绍 1.2、HTTP与HTTPS 1.3、URL 1.4、开发工具 1.5、爬虫流程 2、requests模块 2.1、简介 2.2、安装 2.3、发送请求 二、爬虫 爬虫总览 准备工作 一、爬虫基础 1、爬虫前导 1.1、爬虫介绍 概念&…

21天学会C++:Day1----C++的发展史

CSDN的uu们,大家好。这里是C入门的第一讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 什么是C 2. C的发展史 3. C的重要性 4. 如何学好C 4.1 别人如何学C 4…

QGIS--开发OpenSCENARIO动态场景(一)--Ubuntu20.04 安装QGIS

qgis的git: GitHub - qgis/QGIS: QGIS is a free, open source, cross platform (lin/win/mac) geographical information system (GIS) qgis的官网:Welcome to the QGIS project! qgis插件包下载地址:https://plugins.qgis.org/plugins/ 1.Prerequisi…

【Redis数据库】异地公网远程登录连接Redis教程

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自CSDN远程穿透的文章:公网远程连接R…

如何使用公网远程访问jupyter notebook【cpolar内网穿透】

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自远控源码文章:公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&am…

/lib/lsb/init-functions文件解析

零、背景 在玩AppArmor的时候涉及到了/etc/init.d/apparmor(无论是sudo /etc/init.d/apparmor start还是sudo systemctl start apparmor.service),而这个文件又涉及到了另一个文件、也就是本文的主角:/lib/lsb/init-functions。 …

GlusterFS(GFS)分布式文件系统

目录 一.文件系统简介 1.文件系统的组成 2.文件系统的作用 3.文件系统的挂载使用 二.GlusterFS概述 1.GlusterFS是什么? 2.GlusterFS的特点 3.GlusterFS术语介绍 3.1 Brick(存储块) 3.2 Volume(逻辑卷) 3.3…

Wireshark从装载到使用完整教程

Wireshark是一个网络协议分析工具,可以用于捕获和分析网络数据包。以下是Wireshark使用教程的简要步骤: 下载Wireshark并安装。 Wireshark可以在其官网上免费下载,并支持多种操作系统,包括Windows、Linux和macOS等。 启动Wires…

Hive 浅谈DML语法

前言 在《Hive 浅谈DDL语法》文章中主要介绍了DDL语法,今天就来聊聊 Hive 中的DML语法。 DML语法解析 1. Insert操作 1.1 Load文件到表中 语法: LOAD DATA [LOCAL] INPATH filepath [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2

LLM总结(持续更新中)

引言 当前LLM模型火出天际,但是做事还是需要脚踏实地。此文只是日常学习LLM,顺手整理所得。本篇博文更多侧重对话、问答类LLM上,其他方向(代码生成)这里暂不涉及,可以去看综述来了解。 之前LLM模型梳理 …

【NAS群晖drive异地访问】远程连接drive挂载电脑硬盘「内网穿透」

文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 转发自CSDN远程穿透的文章:【…

Python循环实例

1.打印九九乘法表 for i in range(0,10): for j in range(0,i1): print({1}*{2}{0}\t.format(j,i,j*i),end ) print() 2.打印等腰直角三角形 rows 4 i j k 1 #声明变量,[i用于控制外层循环(图形行数),j用于控制空格的…

华为云操作

1.创建VPC 2.放行安全组 3.创建ECS(弹性计算服务) 基础配置 选择区域,计费模式 cpu架构 规格2C 4G 选择镜像版本 下一步 网络配置 手动分配一个IP 然后设置一个密码 同意协议买 VPC(Virtual Private Cloud)虚拟私有…

pthread使用

pthread是一种多线程编程模型,提供了一系列的API函数来管理线程。下面是pthread中常用的函数和它们的参数解析:1、pthread_create: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), v…

Tinymce富文本编辑器在vue项目中的使用;引入第三方插件和上传视频、图片等

先放张效果图 第一步:安装依赖 npm install tinymce5.0.12 第二步:在项目中的public文件夹中新建tinymce文件夹(因为我的项目是脚手架创建的,所以公共文件夹是public);在node_modules中找到skins文件夹复制…

MongoDB初认识

MongoDB初认识 文章目录 MongoDB初认识0. 写在前面1. MongoDB是什么2. MongoDB的优缺点3. 基础概念解析4. 安装4.1 下载地址4.2 安装MongoDB4.3 pgrep使用4.4 进入 shell 交互页面 0. 写在前面 Linux版本:CentOS7.5 MongoDB版本:MongoDB-5.0.2&#xff…

基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形

基于CH32F203利用TIM1 同时输出4通道固定PWM占空比波形 📌相关篇《关于CH32F203程序下载方式说明》📍有关CH32F203资料手册以及SDK资料:https://www.wch.cn/products/CH32F103.html🌴《树莓派RP2040 100M 24通道逻辑分析仪开源项目…

Redis哨兵(非集群 Rrdis 的高可用性 )

Redis哨兵(非集群 Rrdis 的高可用性 ) 1. 什么是哨兵 吹哨人巡查监控后台 master 主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务 Redis哨兵在不使用Redis集群时为Redis提供高可用性 2. 作用 无人值守运维 3. 哨兵作为分布式系统 Redis S…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,怎么办?

高薪能买来快乐吗? 来看看这位程序员的哀叹: 实在是扛不住了,每天都在极度焦虑和痛苦中度过,早上起来要挣扎着做心理建设去上班,已经产生生理性的头晕恶心食欲不振。有工作本身的原因,更多是自己心态的问…