kubernetes实战(五):k8s持久化安装Redis Sentinel
1、PV创建
在nfs或者其他类型后端存储创建pv,首先创建共享目录
[root@nfs ~]# cat /etc/exports
/k8s/redis-sentinel/ *(rw,sync,no_subtree_check,no_root_squash)
/k8s/redis-sentinel/ *(rw,sync,no_subtree_check,no_root_squash)
/k8s/redis-sentinel/ *(rw,sync,no_subtree_check,no_root_squash)
下载yaml文件
https://github.com/dotbalo/k8s/
创建pv,注意Redis的空间大小按需修改
[root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-pv.yaml
[root@k8s-master01 redis-sentinel]# kubectl get pv | grep redis
pv-redis-sentinel- 4Gi RWX Recycle Bound public-service/redis-sentinel-master-storage-redis-sentinel-master-ss- redis-sentinel-storage-class 16h
pv-redis-sentinel- 4Gi RWX Recycle Bound public-service/redis-sentinel-slave-storage-redis-sentinel-slave-ss- redis-sentinel-storage-class 16h
pv-redis-sentinel- 4Gi RWX Recycle Bound public-service/redis-sentinel-slave-storage-redis-sentinel-slave-ss- redis-sentinel-storage-class 16h
2、创建namespace
默认是在public-service中创建Redis哨兵模式
kubectl create namespace public-service
# 如果不使用public-service,需要更改所有yaml文件的public-service为你namespace。
# sed -i "s#public-service#YOUR_NAMESPACE#g" *.yaml
3、创建ConfigMap
Redis配置按需修改,默认使用的是rdb存储模式
[root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-configmap.yaml
[root@k8s-master01 redis-sentinel]# kubectl get configmap -n public-service
NAME DATA AGE
redis-sentinel-config 17h
注意,此时configmap中redis-slave.conf的slaveof的master地址为ss里面的Headless Service地址。
4、创建service
service主要提供pods之间的互访,StatefulSet主要用Headless Service通讯,格式:statefulSetName-{0..N-1}.serviceName.namespace.svc.cluster.local
- serviceName为Headless Service的名字
- 0..N-1为Pod所在的序号,从0开始到N-1
- statefulSetName为StatefulSet的名字
- namespace为服务所在的namespace,Headless Servic和StatefulSet必须在相同的namespace
- .cluster.local为Cluster Domain
如本集群的HS为:
Master:
redis-sentinel-master-ss-0.redis-sentinel-master-ss.public-service.svc.cluster.local:6379
Slave:
redis-sentinel-slave-ss-0.redis-sentinel-slave-ss.public-service.svc.cluster.local:6379
redis-sentinel-slave-ss-1.redis-sentinel-slave-ss.public-service.svc.cluster.local:6379
创建Service
[root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-service-master.yaml -f redis-sentinel-service-slave.yaml [root@k8s-master01 redis-sentinel]# kubectl get service -n public-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-sentinel-master-ss ClusterIP None <none> /TCP 16h
redis-sentinel-slave-ss ClusterIP None <none> /TCP <invalid>
5、创建StatefulSet
[root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-rbac.yaml -f redis-sentinel-ss-master.yaml -f redis-sentinel-ss-slave.yaml
[root@k8s-master01 redis-sentinel]# kubectl get statefulset -n public-service
NAME DESIRED CURRENT AGE
redis-sentinel-master-ss 16h
redis-sentinel-slave-ss 16h
rmq-cluster 3d
[root@k8s-master01 redis-sentinel]# kubectl get pods -n public-service
NAME READY STATUS RESTARTS AGE
redis-sentinel-master-ss- / Running 16h
redis-sentinel-slave-ss- / Running 16h
redis-sentinel-slave-ss- / Running 16h
此时相当于已经在k8s上创建了Redis的主从模式。
6、dashboard查看
状态查看

pods通讯测试
master连接slave测试
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-master-ss- -n public-service -- redis-cli -h redis-sentinel-slave-ss-.redis-sentinel-slave-ss.public-service.svc.cluster.local ping
PONG
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-master-ss- -n public-service -- redis-cli -h redis-sentinel-slave-ss-.redis-sentinel-slave-ss.public-service.svc.cluster.local ping
PONG
slave连接master测试
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local ping
PONG
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local ping
PONG
同步状态查看
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local info replication
# Replication
role:master
connected_slaves:
slave0:ip=172.168.5.94,port=,state=online,offset=,lag=
slave1:ip=172.168.6.113,port=,state=online,offset=,lag=
master_replid:ad4341815b25f12d4aeb390a19a8bd8452875879
master_replid2:
master_repl_offset:
second_repl_offset:-
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
同步测试
# master写入数据
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local set test test_data
OK
# master获取数据
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h redis-sentinel-master-ss-.redis-sentinel-master-ss.public-service.svc.cluster.local get test
"test_data"
# slave获取数据
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli get test
"test_data"
从节点无法写入数据
[root@k8s-master01 redis-sentinel]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli set k v
(error) READONLY You can't write against a read only replica.
NFS查看数据存储
[root@nfs redis-sentinel]# tree .
.
├──
│ └── dump.rdb
├──
│ └── dump.rdb
└──
└── dump.rdb directories, files
说明:个人认为在k8s上搭建Redis sentinel完全没有意义,经过测试,当master节点宕机后,sentinel选择新的节点当主节点,当原master恢复后,此时无法再次成为集群节点。因为在物理机上部署时,sentinel探测以及更改配置文件都是以IP的形式,集群复制也是以IP的形式,但是在容器中,虽然采用的StatefulSet的Headless Service来建立的主从,但是主从建立后,master、slave、sentinel记录还是解析后的IP,但是pod的IP每次重启都会改变,所有sentinel无法识别宕机后又重新启动的master节点,所以一直无法加入集群,虽然可以通过固定podIP或者使用NodePort的方式来固定,或者通过sentinel获取当前master的IP来修改配置文件,但是个人觉得也是没有必要的,sentinel实现的是高可用Redis主从,检测Redis Master的状态,进行主从切换等操作,但是在k8s中,无论是dc或者ss,都会保证pod以期望的值进行运行,再加上k8s自带的活性检测,当端口不可用或者服务不可用时会自动重启pod或者pod的中的服务,所以当在k8s中建立了Redis主从同步后,相当于已经成为了高可用状态,并且sentinel进行主从切换的时间不一定有k8s重建pod的时间快,所以个人认为在k8s上搭建sentinel没有意义。所以下面搭建sentinel的步骤无需在看。
PS:Redis Cluster:https://github.com/dotbalo/k8s/tree/master/redis/k8s-redis-cluster
7、创建sentinel
[root@k8s-master01 redis-sentinel]# kubectl create -f redis-sentinel-ss-sentinel.yaml -f redis-sentinel-service-sentinel.yaml [root@k8s-master01 redis-sentinel]# kubectl get service -n public-servicve
No resources found.
[root@k8s-master01 redis-sentinel]# kubectl get service -n public-service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
redis-sentinel-master-ss ClusterIP None <none> /TCP 17h
redis-sentinel-sentinel-ss ClusterIP None <none> /TCP 36m
redis-sentinel-slave-ss ClusterIP None <none> /TCP 1h
rmq-cluster ClusterIP None <none> /TCP 3d
rmq-cluster-balancer NodePort 10.107.221.85 <none> :/TCP,:/TCP 3d
[root@k8s-master01 redis-sentinel]# kubectl get statefulset -n public-service
NAME DESIRED CURRENT AGE
redis-sentinel-master-ss 17h
redis-sentinel-sentinel-ss 8m
redis-sentinel-slave-ss 17h
rmq-cluster 3d
[root@k8s-master01 redis-sentinel]# kubectl get pods -n public-service | grep sentinel
redis-sentinel-master-ss- / Running 17h
redis-sentinel-sentinel-ss- / Running 2m
redis-sentinel-sentinel-ss- / Running 2m
redis-sentinel-sentinel-ss- / Running 2m
redis-sentinel-slave-ss- / Running 17h
redis-sentinel-slave-ss- / Running 17h
8、查看日志

查看哨兵状态
[root@k8s-master01 ~]# kubectl exec -ti redis-sentinel-sentinel-ss- -n public-service -- redis-cli -h 127.0.0.1 -p info Sentinel
# Sentinel
sentinel_masters:
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=mymaster,status=ok,address=172.168.6.111:,slaves=,sentinels=
9、容灾测试
# 查看当前数据
[root@k8s-master01 ~]# kubectl exec -ti redis-sentinel-master-ss- -n public-service -- redis-cli -h 127.0.0.1 -p get test
"test_data"
关闭master节点

查看状态
[root@k8s-master01 ~]# kubectl get pods -n public-service
NAME READY STATUS RESTARTS AGE
redis-sentinel-sentinel-ss- / Running 22m
redis-sentinel-sentinel-ss- / Running 22m
redis-sentinel-sentinel-ss- / Running 22m
redis-sentinel-slave-ss- / Running 17h
redis-sentinel-slave-ss- / Running 17h
查看sentinel状态
[root@k8s-master01 redis]# kubectl exec -ti redis-sentinel-sentinel-ss- -n public-service -- redis-cli -h 127.0.0.1 -p info Sentinel
# Sentinel
sentinel_masters:
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=mymaster,status=ok,address=172.168.6.116:,slaves=,sentinels=
[root@k8s-master01 redis]# kubectl exec -ti redis-sentinel-slave-ss- -n public-service -- redis-cli -h 127.0.0.1 -p info replication
# Replication
role:slave
master_host:172.168.6.116
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_replid:4097ccd725a7ffc6f3767f7c726fc883baf3d7ef
master_replid2:603280e5266e0a6b0f299d2b33384c1fd8c3ee64
master_repl_offset:
second_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:82961
赞助作者:

kubernetes实战(五):k8s持久化安装Redis Sentinel的更多相关文章
- CentOS安装Redis Sentinel HA集群
安装了很多次,但是每次安装还要翻以前的配置,故列文备忘.下文依赖于2.x版本搭建主从节点实现基于sentinel机制的简单Redis HA(相对高可用Redis集群,真正高可用还要等3.0之后版本). ...
- kubernetes实战(四):k8s持久化安装rabbitmq集群
1.下载文件 https://github.com/dotbalo/k8s/ 2.创建namespace kubectl create namespace public-service 如果不使用pu ...
- helm安装redis+Sentinel集群搭建
一.redis集群特点 数据 在多个Redis节点之间自动分片 sentinel特点: 它的主要功能有以下几点 不时地监控redis是否按照预期良好地运行; 如果发现某个redis节点运行出现状况,能 ...
- docker-compose 安装redis sentinel,共享主机网络模式
采坑记录: docker sentinel模式安装完后因为是使用bridge模式,所以只有docker中运行的程序才能访问.刚开始尝试使用端口映射,返现sentinel返回的地址依然是docker的内 ...
- kubernetes实战篇之helm安装
系列目录 Helm是kubernetes的应用包管理工具,是CNCF孵化器下的一个项目,主要用来管理 Charts.类似于 Ubuntu 中的 APT 或 CentOS 中的 YUM.它提供了一种简单 ...
- 亲密接触Redis-第二天(Redis Sentinel)
简介 经过上次轻松搭建了一个Redis的环境并用Java代码调通后,这次我们要来看看Redis的一些坑以及Redis2.8以后带来的一个新的特性即支持高可用特性功能的Sentinel(哨兵). Red ...
- 亲热接触Redis-第二天(Redis Sentinel)
简单介绍 经过上次轻松搭建了一个Redis的环境并用Java代码调通后.这次我们要来看看Redis的一些坑以及Redis2.8以后带来的一个新的特性即支持高可用特性功能的Sentinel(哨兵). R ...
- Linux(ubuntu)安装redis集群,redis集群搭建
今天学习一下redis集群的搭建.redis在现在是很常用的数据库,在nosql数据库中也是非常好用的,接下来我们搭建一下redis的集群. 一.准备 首先我们要安装c语言的编译环境,我们要安装red ...
- kubernetes实战(二十五):kubeadm 安装 高可用 k8s v1.13.x
1.系统环境 使用kubeadm安装高可用k8s v.13.x较为简单,相比以往的版本省去了很多步骤. kubeadm安装高可用k8s v.11 和 v1.12 点我 主机信息 主机名 IP地址 说明 ...
随机推荐
- 前台的js对象数组传到后台处理。在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>
前台的js对象数组传到后台处理.在前台把js对象数组转化为json字符串,在后台把json字符串解析为List<>
- 【Java面试题】20 运行时异常和一般异常有何区别
Throwable 是所有 Java 程序中错误处理的父类 ,有两种资类: Error 和 Exception . Error :表示由 JVM 所侦测到的无法预期的错误,由于这是属于 JVM 层次的 ...
- Kafka学习之一深度解析
背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...
- 转:windows 下 netsh 实现 端口映射(端口转发)
本文转自:本文出自 “httpyuntianjxxll.spac..” 博客,请务必保留此出处http://333234.blog.51cto.com/323234/1135361 -----hapr ...
- js 去掉空格.回车.换行
Jquery:$("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));//去 ...
- 【jersey】 spring 整合jersey 实现RESTful webservice
Jersey是一个RESTFUL请求服务JAVA框架,与常规的JAVA编程使用的struts框架类似,它主要用于处理业务逻辑层.与Struts类似,它同样可以和hibernate,sprin ...
- ubuntu网页无法看视频
sudo apt-get install flashplugin-nonfree sudo apt-get install aptitude sudo aptitude install ubuntu- ...
- 移植opencv到pcDuino
OpenCV是一个基于(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows和Mac OS操作系统上.它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Pytho ...
- 超全面的JavaWeb笔记day02<CSS&JavaScript>
1.CSS的简介 2.CSS概述和与HTML的结合方式(四种)(*******) 3.CSS的基本选择器(******) 4.CSS的扩展选择器(了解) 5.CSS的盒子模型(了解) 6.CSS的布局 ...
- 面试题思考:Servlet 生命周期、工作原理
Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Ser ...